From 315b043c1516f857dd6a73680a57e55eb807ca95 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Mon, 23 Apr 2012 23:52:58 -0400 Subject: [PATCH 001/182] Bug 737510 - Print something useful when dumping an ImmutableViewportMetrics. r=Cwiiis --- mobile/android/base/gfx/DisplayPortMetrics.java | 5 +++-- mobile/android/base/gfx/ImmutableViewportMetrics.java | 7 +++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mobile/android/base/gfx/DisplayPortMetrics.java b/mobile/android/base/gfx/DisplayPortMetrics.java index be06322d1a3..d034cff5a02 100644 --- a/mobile/android/base/gfx/DisplayPortMetrics.java +++ b/mobile/android/base/gfx/DisplayPortMetrics.java @@ -43,9 +43,10 @@ public final class DisplayPortMetrics { return sb.toString(); } + @Override public String toString() { - return "DisplayPortMetrics(" + mPosition.left + "," + return "DisplayPortMetrics v=(" + mPosition.left + "," + mPosition.top + "," + mPosition.right + "," - + mPosition.bottom + "," + mResolution + ")"; + + mPosition.bottom + ") z=" + mResolution; } } diff --git a/mobile/android/base/gfx/ImmutableViewportMetrics.java b/mobile/android/base/gfx/ImmutableViewportMetrics.java index 13dd7d3d964..067c53272a3 100644 --- a/mobile/android/base/gfx/ImmutableViewportMetrics.java +++ b/mobile/android/base/gfx/ImmutableViewportMetrics.java @@ -81,4 +81,11 @@ public class ImmutableViewportMetrics { public FloatSize getCssPageSize() { return new FloatSize(cssPageSizeWidth, cssPageSizeHeight); } + + @Override + public String toString() { + return "ImmutableViewportMetrics v=(" + viewportRectLeft + "," + viewportRectTop + "," + + viewportRectRight + "," + viewportRectBottom + ") p=(" + pageSizeWidth + "," + + pageSizeHeight + ") z=" + zoomFactor; + } } From 35a2feec7c7c5d84d99206d79f10d2b7e4fa8467 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Mon, 23 Apr 2012 23:53:44 -0400 Subject: [PATCH 002/182] Bug 737510 - Expand the displayport to fill any partial tiles. r=Cwiiis --- .../base/gfx/DisplayPortCalculator.java | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/mobile/android/base/gfx/DisplayPortCalculator.java b/mobile/android/base/gfx/DisplayPortCalculator.java index 4efe1ddfe85..7de9cc5b037 100644 --- a/mobile/android/base/gfx/DisplayPortCalculator.java +++ b/mobile/android/base/gfx/DisplayPortCalculator.java @@ -8,6 +8,7 @@ package org.mozilla.gecko.gfx; import java.util.Map; import android.graphics.PointF; import android.graphics.RectF; +import android.util.FloatMath; import android.util.Log; import org.json.JSONArray; import org.mozilla.gecko.FloatUtils; @@ -17,6 +18,9 @@ final class DisplayPortCalculator { private static final String LOGTAG = "GeckoDisplayPortCalculator"; private static final PointF ZERO_VELOCITY = new PointF(0, 0); + // Keep this in sync with the TILEDLAYERBUFFER_TILE_SIZE defined in gfx/layers/TiledLayerBuffer.h + private static final int TILE_SIZE = 256; + private static final String PREF_DISPLAYPORT_STRATEGY = "gfx.displayport.strategy"; private static final String PREF_DISPLAYPORT_FM_MULTIPLIER = "gfx.displayport.strategy_fm.multiplier"; private static final String PREF_DISPLAYPORT_FM_DANGER_X = "gfx.displayport.strategy_fm.danger_x"; @@ -139,6 +143,24 @@ final class DisplayPortCalculator { return rect; } + /** + * Expand the given margins such that when they are applied on the viewport, the resulting rect + * does not have any partial tiles, except when it is clipped by the page bounds. This assumes + * the tiles are TILE_SIZE by TILE_SIZE and start at the origin, such that there will always be + * a tile at (0,0)-(TILE_SIZE,TILE_SIZE)). + */ + private static DisplayPortMetrics getTileAlignedDisplayPortMetrics(RectF margins, float zoom, ImmutableViewportMetrics metrics) { + float left = metrics.viewportRectLeft - margins.left; + float top = metrics.viewportRectTop - margins.top; + float right = metrics.viewportRectRight + margins.right; + float bottom = metrics.viewportRectBottom + margins.bottom; + left = Math.max(0.0f, TILE_SIZE * FloatMath.floor(left / TILE_SIZE)); + top = Math.max(0.0f, TILE_SIZE * FloatMath.floor(top / TILE_SIZE)); + right = Math.min(metrics.pageSizeWidth, TILE_SIZE * FloatMath.ceil(right / TILE_SIZE)); + bottom = Math.min(metrics.pageSizeHeight, TILE_SIZE * FloatMath.ceil(bottom / TILE_SIZE)); + return new DisplayPortMetrics(left, top, right, bottom, zoom); + } + /** * Adjust the given margins so if they are applied on the viewport in the metrics, the resulting rect * does not exceed the page bounds. This code will maintain the total margin amount for a given axis; @@ -246,15 +268,7 @@ final class DisplayPortCalculator { margins.bottom = verticalBuffer - margins.top; margins = shiftMarginsForPageBounds(margins, metrics); - // note that unless the viewport size changes, or the page dimensions change (either because of - // content changes or zooming), the size of the display port should remain constant. this - // is intentional to avoid re-creating textures and all sorts of other reallocations in the - // draw and composition code. - return new DisplayPortMetrics(metrics.viewportRectLeft - margins.left, - metrics.viewportRectTop - margins.top, - metrics.viewportRectRight + margins.right, - metrics.viewportRectBottom + margins.bottom, - metrics.zoomFactor); + return getTileAlignedDisplayPortMetrics(margins, metrics.zoomFactor, metrics); } public boolean aboutToCheckerboard(ImmutableViewportMetrics metrics, PointF velocity, DisplayPortMetrics displayPort) { @@ -363,11 +377,7 @@ final class DisplayPortCalculator { RectF margins = velocityBiasedMargins(horizontalBuffer, verticalBuffer, velocity); margins = shiftMarginsForPageBounds(margins, metrics); - return new DisplayPortMetrics(metrics.viewportRectLeft - margins.left, - metrics.viewportRectTop - margins.top, - metrics.viewportRectRight + margins.right, - metrics.viewportRectBottom + margins.bottom, - metrics.zoomFactor); + return getTileAlignedDisplayPortMetrics(margins, metrics.zoomFactor, metrics); } public boolean aboutToCheckerboard(ImmutableViewportMetrics metrics, PointF velocity, DisplayPortMetrics displayPort) { From 9eac6379242e1cdbf32e8c7eadb22aac250475a5 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Mon, 23 Apr 2012 23:54:11 -0400 Subject: [PATCH 003/182] Bug 737510 - Compensate for rounding errors in displayport processing that result in not snapping to tiles properly. r=Cwiiis a=blocking-fennec --- mobile/android/chrome/content/browser.js | 144 +++++++++++++++++++++-- 1 file changed, 134 insertions(+), 10 deletions(-) diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index a5c1872c56a..15e8b5a71ee 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -1676,7 +1676,7 @@ Tab.prototype = { return this.browser.docShellIsActive; }, - setDisplayPort: function(aViewportX, aViewportY, aDisplayPort) { + setDisplayPort: function(aDisplayPort) { let zoom = this._zoom; let resolution = aDisplayPort.resolution; if (zoom <= 0 || resolution <= 0) @@ -1687,9 +1687,8 @@ Tab.prototype = { // these two may be different if we are, for example, trying to render a // large area of the page at low resolution because the user is panning real // fast. - // The viewport values (aViewportX and aViewportY) correspond to the - // gecko scroll position, and are zoom-multiplied. The display port rect - // values (aDisplayPort), however, is in CSS pixels multiplied by the desired + // The gecko scroll position is in CSS pixels. The display port rect + // values (aDisplayPort), however, are in CSS pixels multiplied by the desired // rendering resolution. Therefore care must be taken when doing math with // these sets of values, to ensure that they are normalized to the same coordinate // space first. @@ -1711,16 +1710,141 @@ Tab.prototype = { dump("Warning: setDisplayPort resolution did not match zoom for background tab!"); } - // finally, we set the display port, taking care to convert everything into the CSS-pixel - // coordinate space, because that is what the function accepts. + // Finally, we set the display port, taking care to convert everything into the CSS-pixel + // coordinate space, because that is what the function accepts. Also we have to fudge the + // displayport somewhat to make sure it gets through all the conversions gecko will do on it + // without deforming too much. See https://bugzilla.mozilla.org/show_bug.cgi?id=737510#c10 + // for details on what these operations are. + let geckoScrollX = this.browser.contentWindow.scrollX; + let geckoScrollY = this.browser.contentWindow.scrollY; + aDisplayPort = this._dirtiestHackEverToWorkAroundGeckoRounding(aDisplayPort, geckoScrollX, geckoScrollY); + cwu = this.browser.contentWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils); - cwu.setDisplayPortForElement((aDisplayPort.left / resolution) - (aViewportX / zoom), - (aDisplayPort.top / resolution) - (aViewportY / zoom), + cwu.setDisplayPortForElement((aDisplayPort.left / resolution) - geckoScrollX, + (aDisplayPort.top / resolution) - geckoScrollY, (aDisplayPort.right - aDisplayPort.left) / resolution, (aDisplayPort.bottom - aDisplayPort.top) / resolution, element); }, + /* + * Yes, this is ugly. But it's currently the safest way to account for the rounding errors that occur + * when we pump the displayport coordinates through gecko and they pop out in the compositor. + * + * In general, the values are converted from page-relative device pixels to viewport-relative app units, + * and then back to page-relative device pixels (now as ints). The first half of this is only slightly + * lossy, but it's enough to throw off the numbers a little. Because of this, when gecko calls + * ScaleToOutsidePixels to generate the final rect, the rect may get expanded more than it should, + * ending up a pixel larger than it started off. This is undesirable in general, but specifically + * bad for tiling, because it means we means we end up painting one line of pixels from a tile, + * causing an otherwise unnecessary upload of the whole tile. + * + * In order to counteract the rounding error, this code simulates the conversions that will happen + * to the display port, and calculates whether or not that final ScaleToOutsidePixels is actually + * expanding the rect more than it should. If so, it determines how much rounding error was introduced + * up until that point, and adjusts the original values to compensate for that rounding error. + */ + _dirtiestHackEverToWorkAroundGeckoRounding: function(aDisplayPort, aGeckoScrollX, aGeckoScrollY) { + const APP_UNITS_PER_CSS_PIXEL = 60.0; + const EXTRA_FUDGE = 0.04; + + let resolution = aDisplayPort.resolution; + + // Some helper functions that simulate conversion processes in gecko + + function cssPixelsToAppUnits(aVal) { + return Math.floor((aVal * APP_UNITS_PER_CSS_PIXEL) + 0.5); + } + + function appUnitsToDevicePixels(aVal) { + return aVal / APP_UNITS_PER_CSS_PIXEL * resolution; + } + + function devicePixelsToAppUnits(aVal) { + return cssPixelsToAppUnits(aVal / resolution); + } + + // Stash our original (desired) displayport width and height away, we need it + // later and we might modify the displayport in between. + let originalWidth = aDisplayPort.right - aDisplayPort.left; + let originalHeight = aDisplayPort.bottom - aDisplayPort.top; + + // This is the first conversion the displayport goes through, going from page-relative + // device pixels to viewport-relative app units. + let appUnitDisplayPort = { + x: cssPixelsToAppUnits((aDisplayPort.left / resolution) - aGeckoScrollX), + y: cssPixelsToAppUnits((aDisplayPort.top / resolution) - aGeckoScrollY), + w: cssPixelsToAppUnits((aDisplayPort.right - aDisplayPort.left) / resolution), + h: cssPixelsToAppUnits((aDisplayPort.bottom - aDisplayPort.top) / resolution) + }; + + // This is the translation gecko applies when converting back from viewport-relative + // device pixels to page-relative device pixels. + let geckoTransformX = -Math.floor((-aGeckoScrollX * resolution) + 0.5); + let geckoTransformY = -Math.floor((-aGeckoScrollY * resolution) + 0.5); + + // The final "left" value as calculated in gecko is: + // left = geckoTransformX + Math.floor(appUnitsToDevicePixels(appUnitDisplayPort.x)) + // In a perfect world, this value would be identical to aDisplayPort.left, which is what + // we started with. However, this may not be the case if the value being floored has accumulated + // enough error to drop below what it should be. + // For example, assume geckoTransformX is 0, and aDisplayPort.left is 4, but + // appUnitsToDevicePixels(appUnitsToDevicePixels.x) comes out as 3.9 because of rounding error. + // That's bad, because the -0.1 error has caused it to floor to 3 instead of 4. (If it had errored + // the other way and come out as 4.1, there's no problem). In this example, we need to increase the + // "left" value by some amount so that the 3.9 actually comes out as >= 4, and it gets floored into + // the expected value of 4. The delta values calculated below calculate that error amount (e.g. -0.1). + let errorLeft = (geckoTransformX + appUnitsToDevicePixels(appUnitDisplayPort.x)) - aDisplayPort.left; + let errorTop = (geckoTransformY + appUnitsToDevicePixels(appUnitDisplayPort.y)) - aDisplayPort.top; + + // If the error was negative, that means it will floor incorrectly, so we need to bump up the + // original aDisplayPort.left and/or aDisplayPort.top values. The amount we bump it up by is + // the error amount (increased by a small fudge factor to ensure it's sufficient), converted + // backwards through the conversion process. + if (errorLeft < 0) { + aDisplayPort.left += appUnitsToDevicePixels(devicePixelsToAppUnits(EXTRA_FUDGE - errorLeft)); + // After we modify the left value, we need to re-simulate some values to take that into account + appUnitDisplayPort.x = cssPixelsToAppUnits((aDisplayPort.left / resolution) - aGeckoScrollX); + appUnitDisplayPort.w = cssPixelsToAppUnits((aDisplayPort.right - aDisplayPort.left) / resolution); + } + if (errorTop < 0) { + aDisplayPort.top += appUnitsToDevicePixels(devicePixelsToAppUnits(EXTRA_FUDGE - errorTop)); + // After we modify the top value, we need to re-simulate some values to take that into account + appUnitDisplayPort.y = cssPixelsToAppUnits((aDisplayPort.top / resolution) - aGeckoScrollY); + appUnitDisplayPort.h = cssPixelsToAppUnits((aDisplayPort.bottom - aDisplayPort.top) / resolution); + } + + // At this point, the aDisplayPort.left and aDisplayPort.top values have been corrected to account + // for the error in conversion such that they end up where we want them. Now we need to also do the + // same for the right/bottom values so that the width/height end up where we want them. + + // This is the final conversion that the displayport goes through before gecko spits it back to + // us. Note that the width/height calculates are of the form "ceil(transform(right)) - floor(transform(left))" + let scaledOutDevicePixels = { + x: Math.floor(appUnitsToDevicePixels(appUnitDisplayPort.x)), + y: Math.floor(appUnitsToDevicePixels(appUnitDisplayPort.y)), + w: Math.ceil(appUnitsToDevicePixels(appUnitDisplayPort.x + appUnitDisplayPort.w)) - Math.floor(appUnitsToDevicePixels(appUnitDisplayPort.x)), + h: Math.ceil(appUnitsToDevicePixels(appUnitDisplayPort.y + appUnitDisplayPort.h)) - Math.floor(appUnitsToDevicePixels(appUnitDisplayPort.y)) + }; + + // The final "width" value as calculated in gecko is scaledOutDevicePixels.w. + // In a perfect world, this would equal originalWidth. However, things are not perfect, and as before, + // we need to calculate how much rounding error has been introduced. In this case the rounding error is causing + // the Math.ceil call above to ceiling to the wrong final value. For example, 4 gets converted 4.1 and gets + // ceiling'd to 5; in this case the error is 0.1. + let errorRight = (appUnitsToDevicePixels(appUnitDisplayPort.x + appUnitDisplayPort.w) - scaledOutDevicePixels.x) - originalWidth; + let errorBottom = (appUnitsToDevicePixels(appUnitDisplayPort.y + appUnitDisplayPort.h) - scaledOutDevicePixels.y) - originalHeight; + + // If the error was positive, that means it will ceiling incorrectly, so we need to bump down the + // original aDisplayPort.right and/or aDisplayPort.bottom. Again, we back-convert the error amount + // with a small fudge factor to figure out how much to adjust the original values. + if (errorRight > 0) aDisplayPort.right -= appUnitsToDevicePixels(devicePixelsToAppUnits(errorRight + EXTRA_FUDGE)); + if (errorBottom > 0) aDisplayPort.bottom -= appUnitsToDevicePixels(devicePixelsToAppUnits(errorBottom + EXTRA_FUDGE)); + + // Et voila! + return aDisplayPort; + }, + setViewport: function(aViewport) { // Transform coordinates based on zoom let x = aViewport.x / aViewport.zoom; @@ -1732,7 +1856,7 @@ Tab.prototype = { this.userScrollPos.x = win.scrollX; this.userScrollPos.y = win.scrollY; this.setResolution(aViewport.zoom, false); - this.setDisplayPort(aViewport.x, aViewport.y, aViewport.displayPort); + this.setDisplayPort(aViewport.displayPort); }, setResolution: function(aZoom, aForce) { @@ -1831,7 +1955,7 @@ Tab.prototype = { } let displayPort = sendMessageToJava({ gecko: message }); if (displayPort != null) - this.setDisplayPort(message.x, message.y, JSON.parse(displayPort)); + this.setDisplayPort(JSON.parse(displayPort)); }, handleEvent: function(aEvent) { From b6798783e8a47919b5ebc10673dff49ee5b1a11f Mon Sep 17 00:00:00 2001 From: Hsin-Yi Tsai Date: Tue, 24 Apr 2012 12:44:42 -0300 Subject: [PATCH 004/182] Bug 743008 - WebTelephony: support multiprocess. r=philikon a=b2g-only --- dom/system/gonk/RILContentHelper.js | 141 ++++++++++++++++++ dom/system/gonk/RadioInterfaceLayer.js | 161 ++++++++++----------- dom/system/gonk/nsIRadioInterfaceLayer.idl | 63 ++++---- dom/telephony/Telephony.cpp | 14 +- dom/telephony/Telephony.h | 6 +- 5 files changed, 256 insertions(+), 129 deletions(-) diff --git a/dom/system/gonk/RILContentHelper.js b/dom/system/gonk/RILContentHelper.js index adfcff439fa..3614bf305f0 100644 --- a/dom/system/gonk/RILContentHelper.js +++ b/dom/system/gonk/RILContentHelper.js @@ -23,6 +23,8 @@ const RIL_IPC_MSG_NAMES = [ "RIL:CardStateChanged", "RIL:VoiceInfoChanged", "RIL:DataInfoChanged", + "RIL:EnumerateCalls", + "RIL:CallStateChanged", ]; const kVoiceChangedTopic = "mobile-connection-voice-changed"; @@ -101,6 +103,93 @@ RILContentHelper.prototype = { throw Components.Exception("Not implemented", Cr.NS_ERROR_NOT_IMPLEMENTED); }, + _telephonyCallbacks: null, + _enumerationTelephonyCallbacks: null, + + registerTelephonyCallback: function registerTelephonyCallback(callback) { + if (this._telephonyCallbacks) { + if (this._telephonyCallbacks.indexOf(callback) != -1) { + throw new Error("Already registered this callback!"); + } + } else { + this._telephonyCallbacks = []; + } + this._telephonyCallbacks.push(callback); + debug("Registered telephony callback: " + callback); + }, + + unregisterTelephonyCallback: function unregisterTelephonyCallback(callback) { + if (!this._telephonyCallbacks) { + return; + } + let index = this._telephonyCallbacks.indexOf(callback); + if (index != -1) { + this._telephonyCallbacks.splice(index, 1); + debug("Unregistered telephony callback: " + callback); + } + }, + + enumerateCalls: function enumerateCalls(callback) { + debug("Requesting enumeration of calls for callback: " + callback); + cpmm.sendAsyncMessage("RIL:EnumerateCalls"); + if (!this._enumerationTelephonyCallbacks) { + this._enumerationTelephonyCallbacks = []; + } + this._enumerationTelephonyCallbacks.push(callback); + }, + + startTone: function startTone(dtmfChar) { + debug("Sending Tone for " + dtmfChar); + cpmm.sendAsyncMessage("RIL:StartTone", dtmfChar); + }, + + stopTone: function stopTone() { + debug("Stopping Tone"); + cpmm.sendAsyncMessage("RIL:StopTone"); + }, + + dial: function dial(number) { + debug("Dialing " + number); + cpmm.sendAsyncMessage("RIL:Dial", number); + }, + + hangUp: function hangUp(callIndex) { + debug("Hanging up call no. " + callIndex); + cpmm.sendAsyncMessage("RIL:HangUp", callIndex); + }, + + answerCall: function answerCall(callIndex) { + cpmm.sendAsyncMessage("RIL:AnswerCall", callIndex); + }, + + rejectCall: function rejectCall(callIndex) { + cpmm.sendAsyncMessage("RIL:RejectCall", callIndex); + }, + + holdCall: function holdCall(callIndex) { + cpmm.sendAsyncMessage("RIL:HoldCall", callIndex); + }, + + resumeCall: function resumeCall(callIndex) { + cpmm.sendAsyncMessage("RIL:ResumeCall", callIndex); + }, + + get microphoneMuted() { + return cpmm.sendSyncMessage("RIL:GetMicrophoneMuted")[0]; + }, + + set microphoneMuted(value) { + cpmm.sendAsyncMessage("RIL:SetMicrophoneMuted", value); + }, + + get speakerEnabled() { + return cpmm.sendSyncMessage("RIL:GetSpeakerEnabled")[0]; + }, + + set speakerEnabled(value) { + cpmm.sendAsyncMessage("RIL:SetSpeakerEnabled", value); + }, + // nsIObserver observe: function observe(subject, topic, data) { @@ -136,6 +225,58 @@ RILContentHelper.prototype = { } Services.obs.notifyObservers(null, kDataChangedTopic, null); break; + case "RIL:EnumerateCalls": + this.handleEnumerateCalls(msg.json); + break; + case "RIL:CallStateChanged": + this._deliverTelephonyCallback("callStateChanged", + [msg.json.callIndex, msg.json.state, + msg.json.number]); + } + }, + + handleEnumerateCalls: function handleEnumerateCalls(message) { + debug("handleEnumerateCalls: " + JSON.stringify(message)); + let callback = this._enumerationTelephonyCallbacks.shift(); + let calls = message.calls; + let activeCallIndex = message.activeCallIndex; + for (let i in calls) { + let call = calls[i]; + let keepGoing; + try { + keepGoing = + callback.enumerateCallState(call.callIndex, call.state, call.number, + call.callIndex == activeCallIndex); + } catch (e) { + debug("callback handler for 'enumerateCallState' threw an " + + " exception: " + e); + keepGoing = true; + } + if (!keepGoing) { + break; + } + } + }, + + _deliverTelephonyCallback: function _deliverTelephonyCallback(name, args) { + if (!this._telephonyCallbacks) { + return; + } + + let callbacks = this._telephonyCallbacks.slice(); + for each (let callback in callbacks) { + if (this._telephonyCallbacks.indexOf(callback) == -1) { + continue; + } + let handler = callback[name]; + if (typeof handler != "function") { + throw new Error("No handler for " + name); + } + try { + handler.apply(callback, args); + } catch (e) { + debug("callback handler for " + name + " threw an exception: " + e); + } } }, diff --git a/dom/system/gonk/RadioInterfaceLayer.js b/dom/system/gonk/RadioInterfaceLayer.js index c16a390b1f9..effb45a0c16 100644 --- a/dom/system/gonk/RadioInterfaceLayer.js +++ b/dom/system/gonk/RadioInterfaceLayer.js @@ -63,6 +63,23 @@ const kSmsDeliveredObserverTopic = "sms-delivered"; const DOM_SMS_DELIVERY_RECEIVED = "received"; const DOM_SMS_DELIVERY_SENT = "sent"; +const RIL_IPC_MSG_NAMES = [ + "RIL:GetRadioState", + "RIL:EnumerateCalls", + "RIL:GetMicrophoneMuted", + "RIL:SetMicrophoneMuted", + "RIL:GetSpeakerEnabled", + "RIL:SetSpeakerEnabled", + "RIL:StartTone", + "RIL:StopTone", + "RIL:Dial", + "RIL:HangUp", + "RIL:AnswerCall", + "RIL:RejectCall", + "RIL:HoldCall", + "RIL:ResumeCall", +]; + XPCOMUtils.defineLazyServiceGetter(this, "gSmsService", "@mozilla.org/sms/smsservice;1", "nsISmsService"); @@ -169,7 +186,9 @@ function RadioInterfaceLayer() { signalStrength: null, relSignalStrength: null}, }; - ppmm.addMessageListener("RIL:GetRadioState", this); + for each (let msgname in RIL_IPC_MSG_NAMES) { + ppmm.addMessageListener(msgname, this); + } Services.obs.addObserver(this, "xpcom-shutdown", false); this._sentSmsEnvelopes = {}; @@ -195,6 +214,45 @@ RadioInterfaceLayer.prototype = { case "RIL:GetRadioState": // This message is sync. return this.radioState; + case "RIL:EnumerateCalls": + this.enumerateCalls(); + break; + case "RIL:GetMicrophoneMuted": + // This message is sync. + return this.microphoneMuted; + case "RIL:SetMicrophoneMuted": + this.microphoneMuted = msg.json; + break; + case "RIL:GetSpeakerEnabled": + // This message is sync. + return this.speakerEnabled; + case "RIL:SetSpeakerEnabled": + this.speakerEnabled = msg.json; + break; + case "RIL:StartTone": + this.startTone(msg.json); + break; + case "RIL:StopTone": + this.stopTone(); + break; + case "RIL:Dial": + this.dial(msg.json); + break; + case "RIL:HangUp": + this.hangUp(msg.json); + break; + case "RIL:AnswerCall": + this.answerCall(msg.json); + break; + case "RIL:RejectCall": + this.rejectCall(msg.json); + break; + case "RIL:HoldCall": + this.holdCall(msg.json); + break; + case "RIL:ResumeCall": + this.resumeCall(msg.json); + break; } }, @@ -416,8 +474,7 @@ RadioInterfaceLayer.prototype = { this._activeCall = call; } this.updateCallAudioState(); - this._deliverCallback("callStateChanged", - [call.callIndex, call.state, call.number]); + ppmm.sendAsyncMessage("RIL:CallStateChanged", call); }, /** @@ -429,10 +486,8 @@ RadioInterfaceLayer.prototype = { this._activeCall = null; } this.updateCallAudioState(); - this._deliverCallback("callStateChanged", - [call.callIndex, - nsIRadioInterfaceLayer.CALL_STATE_DISCONNECTED, - call.number]); + call.state = nsIRadioInterfaceLayer.CALL_STATE_DISCONNECTED; + ppmm.sendAsyncMessage("RIL:CallStateChanged", call); }, /** @@ -440,25 +495,12 @@ RadioInterfaceLayer.prototype = { */ handleEnumerateCalls: function handleEnumerateCalls(calls) { debug("handleEnumerateCalls: " + JSON.stringify(calls)); - let callback = this._enumerationCallbacks.shift(); let activeCallIndex = this._activeCall ? this._activeCall.callIndex : -1; for (let i in calls) { - let call = calls[i]; - let state = convertRILCallState(call.state); - let keepGoing; - try { - keepGoing = - callback.enumerateCallState(call.callIndex, state, call.number, - call.callIndex == activeCallIndex); - } catch (e) { - debug("callback handler for 'enumerateCallState' threw an " + - " exception: " + e); - keepGoing = true; - } - if (!keepGoing) { - break; - } + calls[i].state = convertRILCallState(calls[i].state); } + ppmm.sendAsyncMessage("RIL:EnumerateCalls", + {calls: calls, activeCallIndex: activeCallIndex}); }, portAddressedSmsApps: null, @@ -594,7 +636,9 @@ RadioInterfaceLayer.prototype = { observe: function observe(subject, topic, data) { if (topic == "xpcom-shutdown") { - ppmm.removeMessageListener("RIL:GetRadioState", this); + for each (let msgname in RIL_IPC_MSG_NAMES) { + ppmm.removeMessageListener(msgname, this); + } Services.obs.removeObserver(this, "xpcom-shutdown"); ppmm = null; } @@ -608,6 +652,13 @@ RadioInterfaceLayer.prototype = { radioState: null, + // Handle phone functions of nsIRILContentHelper + + enumerateCalls: function enumerateCalls() { + debug("Requesting enumeration of calls for callback"); + this.worker.postMessage({type: "enumerateCalls"}); + }, + dial: function dial(number) { debug("Dialing " + number); this.worker.postMessage({type: "dial", number: number}); @@ -1058,68 +1109,6 @@ RadioInterfaceLayer.prototype = { this.worker.postMessage(options); }, - _callbacks: null, - _enumerationCallbacks: null, - - registerCallback: function registerCallback(callback) { - if (this._callbacks) { - if (this._callbacks.indexOf(callback) != -1) { - throw new Error("Already registered this callback!"); - } - } else { - this._callbacks = []; - } - this._callbacks.push(callback); - debug("Registered callback: " + callback); - }, - - unregisterCallback: function unregisterCallback(callback) { - if (!this._callbacks) { - return; - } - let index = this._callbacks.indexOf(callback); - if (index != -1) { - this._callbacks.splice(index, 1); - debug("Unregistered callback: " + callback); - } - }, - - enumerateCalls: function enumerateCalls(callback) { - debug("Requesting enumeration of calls for callback: " + callback); - this.worker.postMessage({type: "enumerateCalls"}); - if (!this._enumerationCallbacks) { - this._enumerationCallbacks = []; - } - this._enumerationCallbacks.push(callback); - }, - - _deliverCallback: function _deliverCallback(name, args) { - // We need to worry about callback registration state mutations during the - // callback firing. The behaviour we want is to *not* call any callbacks - // that are added during the firing and to *not* call any callbacks that are - // removed during the firing. To address this, we make a copy of the - // callback list before dispatching and then double-check that each callback - // is still registered before calling it. - if (!this._callbacks) { - return; - } - let callbacks = this._callbacks.slice(); - for each (let callback in callbacks) { - if (this._callbacks.indexOf(callback) == -1) { - continue; - } - let handler = callback[name]; - if (typeof handler != "function") { - throw new Error("No handler for " + name); - } - try { - handler.apply(callback, args); - } catch (e) { - debug("callback handler for " + name + " threw an exception: " + e); - } - } - }, - registerDataCallCallback: function registerDataCallCallback(callback) { if (this._datacall_callbacks) { if (this._datacall_callbacks.indexOf(callback) != -1) { diff --git a/dom/system/gonk/nsIRadioInterfaceLayer.idl b/dom/system/gonk/nsIRadioInterfaceLayer.idl index baf12732086..6ab96296f98 100644 --- a/dom/system/gonk/nsIRadioInterfaceLayer.idl +++ b/dom/system/gonk/nsIRadioInterfaceLayer.idl @@ -62,8 +62,8 @@ interface nsIRILTelephonyCallback : nsISupports in AString number); /** - * Called when nsIRadioInterfaceLayer is asked to enumerate the current - * telephony call state (nsIRadioInterfaceLayer::enumerateCalls). This is + * Called when nsIRILContentHelper is asked to enumerate the current + * telephony call state (nsIRILContentHelper::enumerateCalls). This is * called once per call that is currently managed by the RIL. * * @param callIndex @@ -125,38 +125,11 @@ interface nsIRILDataCallback : nsISupports * Helper that runs in the content process and exposes information * to the DOM. */ -[scriptable, uuid(cc9832fd-d3ce-4cab-9abe-48c6046bcebe)] +[scriptable, uuid(2f8b0929-2ecf-498c-bfa7-42690509696e)] interface nsIRILContentHelper : nsIMobileConnectionProvider { -}; - -[scriptable, uuid(d2025763-fc32-436e-b207-0228ea1ccd12)] -interface nsIRadioInterfaceLayer : nsISupports -{ - const unsigned short CALL_STATE_UNKNOWN = 0; - const unsigned short CALL_STATE_DIALING = 1; - const unsigned short CALL_STATE_ALERTING = 2; - const unsigned short CALL_STATE_BUSY = 3; - const unsigned short CALL_STATE_CONNECTING = 4; - const unsigned short CALL_STATE_CONNECTED = 5; - const unsigned short CALL_STATE_HOLDING = 6; - const unsigned short CALL_STATE_HELD = 7; - const unsigned short CALL_STATE_RESUMING = 8; - const unsigned short CALL_STATE_DISCONNECTING = 9; - const unsigned short CALL_STATE_DISCONNECTED = 10; - const unsigned short CALL_STATE_INCOMING = 11; - - // Keep consistent with GECKO_DATACALL_STATE_* values in ril_consts.js - const unsigned short DATACALL_STATE_UNKNOWN = 0; - const unsigned short DATACALL_STATE_CONNECTING = 1; - const unsigned short DATACALL_STATE_CONNECTED = 2; - const unsigned short DATACALL_STATE_DISCONNECTING = 3; - const unsigned short DATACALL_STATE_DISCONNECTED = 4; - - readonly attribute jsval radioState; - - void registerCallback(in nsIRILTelephonyCallback callback); - void unregisterCallback(in nsIRILTelephonyCallback callback); + void registerTelephonyCallback(in nsIRILTelephonyCallback callback); + void unregisterTelephonyCallback(in nsIRILTelephonyCallback callback); /** * Will continue calling callback.enumerateCallState until the callback @@ -180,6 +153,32 @@ interface nsIRadioInterfaceLayer : nsISupports attribute bool microphoneMuted; attribute bool speakerEnabled; +}; + +[scriptable, uuid(d976f4c2-af5b-4fe1-97c2-c9c5d0d1af5c)] +interface nsIRadioInterfaceLayer : nsISupports +{ + const unsigned short CALL_STATE_UNKNOWN = 0; + const unsigned short CALL_STATE_DIALING = 1; + const unsigned short CALL_STATE_ALERTING = 2; + const unsigned short CALL_STATE_BUSY = 3; + const unsigned short CALL_STATE_CONNECTING = 4; + const unsigned short CALL_STATE_CONNECTED = 5; + const unsigned short CALL_STATE_HOLDING = 6; + const unsigned short CALL_STATE_HELD = 7; + const unsigned short CALL_STATE_RESUMING = 8; + const unsigned short CALL_STATE_DISCONNECTING = 9; + const unsigned short CALL_STATE_DISCONNECTED = 10; + const unsigned short CALL_STATE_INCOMING = 11; + + // Keep consistent with GECKO_DATACALL_STATE_* values in ril_consts.js + const unsigned short DATACALL_STATE_UNKNOWN = 0; + const unsigned short DATACALL_STATE_CONNECTING = 1; + const unsigned short DATACALL_STATE_CONNECTED = 2; + const unsigned short DATACALL_STATE_DISCONNECTING = 3; + const unsigned short DATACALL_STATE_DISCONNECTED = 4; + + readonly attribute jsval radioState; /** * PDP APIs diff --git a/dom/telephony/Telephony.cpp b/dom/telephony/Telephony.cpp index e5cf0c7aacb..cf5ddaa36eb 100644 --- a/dom/telephony/Telephony.cpp +++ b/dom/telephony/Telephony.cpp @@ -53,6 +53,7 @@ #include "nsNetUtil.h" #include "nsServiceManagerUtils.h" #include "SystemWorkerManager.h" +#include "nsRadioInterfaceLayer.h" #include "CallEvent.h" #include "TelephonyCall.h" @@ -131,7 +132,7 @@ Telephony::Telephony() Telephony::~Telephony() { if (mRIL && mRILTelephonyCallback) { - mRIL->UnregisterCallback(mRILTelephonyCallback); + mRIL->UnregisterTelephonyCallback(mRILTelephonyCallback); } if (mRooted) { @@ -152,7 +153,7 @@ Telephony::~Telephony() // static already_AddRefed -Telephony::Create(nsPIDOMWindow* aOwner, nsIRadioInterfaceLayer* aRIL) +Telephony::Create(nsPIDOMWindow* aOwner, nsIRILContentHelper* aRIL) { NS_ASSERTION(aOwner, "Null owner!"); NS_ASSERTION(aRIL, "Null RIL!"); @@ -173,7 +174,7 @@ Telephony::Create(nsPIDOMWindow* aOwner, nsIRadioInterfaceLayer* aRIL) nsresult rv = aRIL->EnumerateCalls(telephony->mRILTelephonyCallback); NS_ENSURE_SUCCESS(rv, nsnull); - rv = aRIL->RegisterCallback(telephony->mRILTelephonyCallback); + rv = aRIL->RegisterTelephonyCallback(telephony->mRILTelephonyCallback); NS_ENSURE_SUCCESS(rv, nsnull); return telephony.forget(); @@ -571,11 +572,8 @@ NS_NewTelephony(nsPIDOMWindow* aWindow, nsIDOMTelephony** aTelephony) } } - // Security checks passed, make a telephony object. - nsIInterfaceRequestor* ireq = SystemWorkerManager::GetInterfaceRequestor(); - NS_ENSURE_TRUE(ireq, NS_ERROR_UNEXPECTED); - - nsCOMPtr ril = do_GetInterface(ireq); + nsCOMPtr ril = + do_GetService(NS_RILCONTENTHELPER_CONTRACTID); NS_ENSURE_TRUE(ril, NS_ERROR_UNEXPECTED); nsRefPtr telephony = Telephony::Create(innerWindow, ril); diff --git a/dom/telephony/Telephony.h b/dom/telephony/Telephony.h index c602737b73d..1950005706f 100644 --- a/dom/telephony/Telephony.h +++ b/dom/telephony/Telephony.h @@ -54,7 +54,7 @@ BEGIN_TELEPHONY_NAMESPACE class Telephony : public nsDOMEventTargetHelper, public nsIDOMTelephony { - nsCOMPtr mRIL; + nsCOMPtr mRIL; nsCOMPtr mRILTelephonyCallback; NS_DECL_EVENT_HANDLER(incoming) @@ -79,7 +79,7 @@ public: nsDOMEventTargetHelper) static already_AddRefed - Create(nsPIDOMWindow* aOwner, nsIRadioInterfaceLayer* aRIL); + Create(nsPIDOMWindow* aOwner, nsIRILContentHelper* aRIL); nsIDOMEventTarget* ToIDOMEventTarget() const @@ -112,7 +112,7 @@ public: NotifyCallsChanged(aCall); } - nsIRadioInterfaceLayer* + nsIRILContentHelper* RIL() const { return mRIL; From fbe5dd5a57816a61aa4ac2a91e087c6e7867c055 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Tue, 24 Apr 2012 07:51:56 -0700 Subject: [PATCH 005/182] Bug 743325 - Back out 554ab0a2f470 (bug 734503) because it broke touch events in XUL Fennec [r=peterv] --- content/base/src/nsDocument.cpp | 3 +- content/events/src/nsDOMTouchEvent.cpp | 33 ++++++------------ content/events/src/nsDOMTouchEvent.h | 39 +++++----------------- dom/interfaces/events/nsIDOMTouchEvent.idl | 3 +- js/xpconnect/src/dombindings.conf | 4 --- 5 files changed, 21 insertions(+), 61 deletions(-) diff --git a/content/base/src/nsDocument.cpp b/content/base/src/nsDocument.cpp index 599eb9ce873..66468e35c04 100644 --- a/content/base/src/nsDocument.cpp +++ b/content/base/src/nsDocument.cpp @@ -8545,8 +8545,7 @@ NS_IMETHODIMP nsDocument::CreateTouchList(nsIVariant* aPoints, nsIDOMTouchList** aRetVal) { - nsRefPtr retval = - new nsDOMTouchList(static_cast(this)); + nsRefPtr retval = new nsDOMTouchList(); if (aPoints) { PRUint16 type; aPoints->GetDataType(&type); diff --git a/content/events/src/nsDOMTouchEvent.cpp b/content/events/src/nsDOMTouchEvent.cpp index 6b545c28f72..b8ce7eaf316 100644 --- a/content/events/src/nsDOMTouchEvent.cpp +++ b/content/events/src/nsDOMTouchEvent.cpp @@ -160,13 +160,16 @@ nsDOMTouch::Equals(nsIDOMTouch* aTouch) } // TouchList +nsDOMTouchList::nsDOMTouchList(nsTArray > &aTouches) +{ + mPoints.AppendElements(aTouches); +} DOMCI_DATA(TouchList, nsDOMTouchList) NS_IMPL_CYCLE_COLLECTION_CLASS(nsDOMTouchList) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsDOMTouchList) - NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_ENTRY(nsIDOMTouchList) NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(TouchList) @@ -174,16 +177,10 @@ NS_INTERFACE_MAP_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsDOMTouchList) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSTARRAY_OF_NSCOMPTR(mPoints) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mParent) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END -NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsDOMTouchList) - NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER -NS_IMPL_CYCLE_COLLECTION_TRACE_END + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsDOMTouchList) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSTARRAY(mPoints) - NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mParent) - NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTING_ADDREF(nsDOMTouchList) @@ -199,7 +196,7 @@ nsDOMTouchList::GetLength(PRUint32* aLength) NS_IMETHODIMP nsDOMTouchList::Item(PRUint32 aIndex, nsIDOMTouch** aRetVal) { - NS_IF_ADDREF(*aRetVal = nsDOMTouchList::GetItemAt(aIndex)); + NS_IF_ADDREF(*aRetVal = mPoints.SafeElementAt(aIndex, nsnull)); return NS_OK; } @@ -219,12 +216,6 @@ nsDOMTouchList::IdentifiedTouch(PRInt32 aIdentifier, nsIDOMTouch** aRetVal) return NS_OK; } -nsIDOMTouch* -nsDOMTouchList::GetItemAt(PRUint32 aIndex) -{ - return mPoints.SafeElementAt(aIndex, nsnull); -} - // TouchEvent nsDOMTouchEvent::nsDOMTouchEvent(nsPresContext* aPresContext, @@ -331,11 +322,9 @@ nsDOMTouchEvent::GetTouches(nsIDOMTouchList** aTouches) unchangedTouches.AppendElement(touches[i]); } } - t = new nsDOMTouchList(static_cast(this), - unchangedTouches); + t = new nsDOMTouchList(unchangedTouches); } else { - t = new nsDOMTouchList(static_cast(this), - touchEvent->touches); + t = new nsDOMTouchList(touchEvent->touches); } mTouches = t; return CallQueryInterface(mTouches, aTouches); @@ -365,8 +354,7 @@ nsDOMTouchEvent::GetTargetTouches(nsIDOMTouchList** aTargetTouches) } } } - mTargetTouches = new nsDOMTouchList(static_cast(this), - targetTouches); + mTargetTouches = new nsDOMTouchList(targetTouches); return CallQueryInterface(mTargetTouches, aTargetTouches); } @@ -388,8 +376,7 @@ nsDOMTouchEvent::GetChangedTouches(nsIDOMTouchList** aChangedTouches) changedTouches.AppendElement(touches[i]); } } - mChangedTouches = new nsDOMTouchList(static_cast(this), - changedTouches); + mChangedTouches = new nsDOMTouchList(changedTouches); return CallQueryInterface(mChangedTouches, aChangedTouches); } diff --git a/content/events/src/nsDOMTouchEvent.h b/content/events/src/nsDOMTouchEvent.h index a53c5a20714..52119b2a0f8 100644 --- a/content/events/src/nsDOMTouchEvent.h +++ b/content/events/src/nsDOMTouchEvent.h @@ -41,8 +41,6 @@ #include "nsIDOMTouchEvent.h" #include "nsString.h" #include "nsTArray.h" -#include "nsIDocument.h" -#include "dombindings.h" class nsDOMTouch : public nsIDOMTouch { @@ -129,46 +127,27 @@ protected: float mForce; }; -class nsDOMTouchList MOZ_FINAL : public nsIDOMTouchList, - public nsWrapperCache +class nsDOMTouchList : public nsIDOMTouchList { public: NS_DECL_CYCLE_COLLECTING_ISUPPORTS - NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsDOMTouchList) + NS_DECL_CYCLE_COLLECTION_CLASS(nsDOMTouchList) NS_DECL_NSIDOMTOUCHLIST - nsDOMTouchList(nsISupports *aParent) : mParent(aParent) - { - SetIsDOMBinding(); - } - nsDOMTouchList(nsISupports *aParent, - nsTArray > &aTouches) - : mPoints(aTouches), - mParent(aParent) - { - SetIsDOMBinding(); - } - - virtual JSObject* WrapObject(JSContext *cx, JSObject *scope, - bool *triedToWrap) - { - return mozilla::dom::binding::TouchList::create(cx, scope, this, - triedToWrap); - } - - nsISupports *GetParentObject() - { - return mParent; - } - + nsDOMTouchList() { } + nsDOMTouchList(nsTArray > &aTouches); + void Append(nsIDOMTouch* aPoint) { mPoints.AppendElement(aPoint); } + nsIDOMTouch* GetItemAt(PRUint32 aIndex) + { + return mPoints.SafeElementAt(aIndex, nsnull); + } protected: nsTArray > mPoints; - nsCOMPtr mParent; }; class nsDOMTouchEvent : public nsDOMUIEvent, diff --git a/dom/interfaces/events/nsIDOMTouchEvent.idl b/dom/interfaces/events/nsIDOMTouchEvent.idl index a7ad489c2ab..f2993f68a62 100644 --- a/dom/interfaces/events/nsIDOMTouchEvent.idl +++ b/dom/interfaces/events/nsIDOMTouchEvent.idl @@ -73,8 +73,7 @@ interface nsIDOMTouch : nsISupports { [scriptable, uuid(60706eb7-d50d-4379-b01c-e78e6af84213)] interface nsIDOMTouchList : nsISupports { readonly attribute unsigned long length; - [getter,forward(getItemAt)] nsIDOMTouch item(in unsigned long index); - [noscript,notxpcom,nostdcall] nsIDOMTouch getItemAt(in unsigned long index); + nsIDOMTouch item(in unsigned long index); nsIDOMTouch identifiedTouch(in long identifier); }; diff --git a/js/xpconnect/src/dombindings.conf b/js/xpconnect/src/dombindings.conf index a4509e444fa..a1b709663b3 100644 --- a/js/xpconnect/src/dombindings.conf +++ b/js/xpconnect/src/dombindings.conf @@ -23,7 +23,6 @@ prefableClasses = { 'DOMSettableTokenList': 'nsDOMSettableTokenList', 'ClientRectList': 'nsClientRectList', 'PaintRequestList': 'nsPaintRequestList', - 'TouchList': 'nsDOMTouchList', 'FileList': 'nsDOMFileList', 'SVGLengthList': 'mozilla::DOMSVGLengthList', 'SVGNumberList': 'mozilla::DOMSVGNumberList', @@ -36,9 +35,6 @@ irregularFilenames = { 'nsHTMLOptionCollection': 'nsHTMLSelectElement', 'nsClientRectList': 'nsClientRect', 'nsPaintRequestList': 'nsPaintRequest', - 'nsIDOMTouch': 'nsIDOMTouchEvent', - 'nsIDOMTouchList': 'nsIDOMTouchEvent', - 'nsDOMTouchList': 'nsDOMTouchEvent', 'nsDOMFileList': 'nsDOMFile', } From 2b634ee4d8b873149e27881bee2582a1f05192c6 Mon Sep 17 00:00:00 2001 From: Luke Wagner Date: Fri, 13 Apr 2012 18:06:40 -0700 Subject: [PATCH 006/182] Bug 746843 - change StackFrame::scopeChain() to return a HandleObject (r=bhackett) --HG-- extra : rebase_source : 8306a740d784a6f8cb7d8160125fb37e3270a64e --- js/src/gc/Root.h | 12 ++++++++ js/src/jsapi.cpp | 6 ++-- js/src/jscntxt.cpp | 2 +- js/src/jscntxtinlines.h | 4 +-- js/src/jscompartment.cpp | 2 +- js/src/jsdbgapi.cpp | 8 +++--- js/src/jsfriendapi.cpp | 2 +- js/src/jsinfer.cpp | 2 +- js/src/jsinterp.cpp | 46 +++++++++++++++--------------- js/src/jsinterpinlines.h | 4 +-- js/src/jsiter.cpp | 2 +- js/src/jsobj.cpp | 4 +-- js/src/jsobjinlines.h | 2 +- js/src/jsreflect.cpp | 2 +- js/src/jsxml.cpp | 4 +-- js/src/methodjit/InvokeHelpers.cpp | 4 +-- js/src/methodjit/MonoIC.cpp | 4 +-- js/src/methodjit/PolyIC.cpp | 6 ++-- js/src/methodjit/StubCalls.cpp | 14 ++++----- js/src/vm/ArgumentsObject.cpp | 4 +-- js/src/vm/Debugger.cpp | 30 +++++++++---------- js/src/vm/Debugger.h | 2 +- js/src/vm/ScopeObject.cpp | 13 ++++----- js/src/vm/Stack-inl.h | 22 ++++++++------ js/src/vm/Stack.h | 5 ++-- 25 files changed, 111 insertions(+), 95 deletions(-) diff --git a/js/src/gc/Root.h b/js/src/gc/Root.h index 8a5bd699fc4..37e92e7dd94 100644 --- a/js/src/gc/Root.h +++ b/js/src/gc/Root.h @@ -115,6 +115,16 @@ class Handle ptr = reinterpret_cast(handle.address()); } + /* + * Get a handle to a location that may not be a Root or RootedVar, but is + * marked and updated by the GC. + */ + static Handle fromMarkedLocation(const T *p) { + Handle h; + h.ptr = p; + return h; + } + /* Get a handle from a rooted stack location, with implicit coercion. */ template inline Handle(const Root &root); template inline Handle(const RootedVar &root); @@ -125,6 +135,8 @@ class Handle T operator ->() { return value(); } private: + Handle() {} + const T *ptr; T value() { return *ptr; } diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index 8dac0a350e3..15ef83cd1dc 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -1386,7 +1386,7 @@ JS_EnterCrossCompartmentCallStackFrame(JSContext *cx, JSStackFrame *target) AssertNoGC(cx); CHECK_REQUEST(cx); - return JS_EnterCrossCompartmentCall(cx, &Valueify(target)->scopeChain().global()); + return JS_EnterCrossCompartmentCall(cx, &Valueify(target)->global()); } JS_PUBLIC_API(void) @@ -1452,7 +1452,7 @@ bool AutoEnterFrameCompartment::enter(JSContext *cx, JSStackFrame *target) { JS_ASSERT(!call); - if (cx->compartment == Valueify(target)->scopeChain().compartment()) { + if (cx->compartment == Valueify(target)->scopeChain()->compartment()) { call = reinterpret_cast(1); return true; } @@ -4539,7 +4539,7 @@ JS_CloneFunctionObject(JSContext *cx, JSObject *funobj, JSObject *parent_) if (!parent) { if (cx->hasfp()) - parent = &cx->fp()->scopeChain(); + parent = cx->fp()->scopeChain(); if (!parent) parent = cx->globalObject; JS_ASSERT(parent); diff --git a/js/src/jscntxt.cpp b/js/src/jscntxt.cpp index b1ead8e38d9..4c9208634ac 100644 --- a/js/src/jscntxt.cpp +++ b/js/src/jscntxt.cpp @@ -995,7 +995,7 @@ JSContext::resetCompartment() { JSObject *scopeobj; if (stack.hasfp()) { - scopeobj = &fp()->scopeChain(); + scopeobj = fp()->scopeChain(); } else { scopeobj = globalObject; if (!scopeobj) diff --git a/js/src/jscntxtinlines.h b/js/src/jscntxtinlines.h index 68115fa706b..00c6eec5f7a 100644 --- a/js/src/jscntxtinlines.h +++ b/js/src/jscntxtinlines.h @@ -76,7 +76,7 @@ static inline GlobalObject * GetGlobalForScopeChain(JSContext *cx) { if (cx->hasfp()) - return &cx->fp()->scopeChain().global(); + return &cx->fp()->global(); JSObject *scope = JS_ObjectToInnerObject(cx, cx->globalObject); if (!scope) @@ -231,7 +231,7 @@ class CompartmentChecker void check(StackFrame *fp) { if (fp) - check(&fp->scopeChain()); + check(fp->scopeChain()); } }; diff --git a/js/src/jscompartment.cpp b/js/src/jscompartment.cpp index 256ebf7736e..0c58d910e6b 100644 --- a/js/src/jscompartment.cpp +++ b/js/src/jscompartment.cpp @@ -212,7 +212,7 @@ JSCompartment::wrap(JSContext *cx, Value *vp) */ JSObject *global; if (cx->hasfp()) { - global = &cx->fp()->scopeChain().global(); + global = &cx->fp()->global(); } else { global = JS_ObjectToInnerObject(cx, cx->globalObject); if (!global) diff --git a/js/src/jsdbgapi.cpp b/js/src/jsdbgapi.cpp index 1ad5e370dd1..8e91611edea 100644 --- a/js/src/jsdbgapi.cpp +++ b/js/src/jsdbgapi.cpp @@ -523,7 +523,7 @@ JS_GetFrameAnnotation(JSContext *cx, JSStackFrame *fpArg) { StackFrame *fp = Valueify(fpArg); if (fp->annotation() && fp->isScriptFrame()) { - JSPrincipals *principals = fp->scopeChain().principals(cx); + JSPrincipals *principals = fp->scopeChain()->principals(cx); if (principals) { /* @@ -555,7 +555,7 @@ JS_GetFrameScopeChain(JSContext *cx, JSStackFrame *fpArg) StackFrame *fp = Valueify(fpArg); JS_ASSERT(cx->stack.containsSlow(fp)); - js::AutoCompartment ac(cx, &fp->scopeChain()); + js::AutoCompartment ac(cx, fp->scopeChain()); if (!ac.enter()) return NULL; @@ -576,7 +576,7 @@ JS_GetFrameCallObject(JSContext *cx, JSStackFrame *fpArg) if (!fp->isFunctionFrame()) return NULL; - js::AutoCompartment ac(cx, &fp->scopeChain()); + js::AutoCompartment ac(cx, fp->scopeChain()); if (!ac.enter()) return NULL; @@ -596,7 +596,7 @@ JS_GetFrameThis(JSContext *cx, JSStackFrame *fpArg, jsval *thisv) if (fp->isDummyFrame()) return false; - js::AutoCompartment ac(cx, &fp->scopeChain()); + js::AutoCompartment ac(cx, fp->scopeChain()); if (!ac.enter()) return false; diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index 71dde30ad28..eae2d322b3a 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -98,7 +98,7 @@ JS_GetObjectFunction(JSObject *obj) JS_FRIEND_API(JSObject *) JS_GetGlobalForFrame(JSStackFrame *fp) { - return &Valueify(fp)->scopeChain().global(); + return &Valueify(fp)->global(); } JS_FRIEND_API(JSBool) diff --git a/js/src/jsinfer.cpp b/js/src/jsinfer.cpp index 2ba24e2cb6b..d50a14182e2 100644 --- a/js/src/jsinfer.cpp +++ b/js/src/jsinfer.cpp @@ -5185,7 +5185,7 @@ NestingPrologue(JSContext *cx, StackFrame *fp) TypeScriptNesting *nesting = script->nesting(); if (nesting->parent) - CheckNestingParent(cx, &fp->scopeChain(), script); + CheckNestingParent(cx, fp->scopeChain(), script); if (script->isOuterFunction) { /* diff --git a/js/src/jsinterp.cpp b/js/src/jsinterp.cpp index f342e77612c..5bcb575b9f7 100644 --- a/js/src/jsinterp.cpp +++ b/js/src/jsinterp.cpp @@ -150,7 +150,7 @@ js::GetScopeChain(JSContext *cx, StackFrame *fp) */ JS_ASSERT_IF(fp->isNonEvalFunctionFrame() && fp->fun()->isHeavyweight(), fp->hasCallObj()); - return &fp->scopeChain(); + return fp->scopeChain(); } /* @@ -162,7 +162,7 @@ js::GetScopeChain(JSContext *cx, StackFrame *fp) */ JSObject *limitBlock, *limitClone; if (fp->isNonEvalFunctionFrame() && !fp->hasCallObj()) { - JS_ASSERT_IF(fp->scopeChain().isClonedBlock(), fp->scopeChain().getPrivate() != fp); + JS_ASSERT_IF(fp->scopeChain()->isClonedBlock(), fp->scopeChain()->getPrivate() != fp); if (!CallObject::createForFunction(cx, fp)) return NULL; @@ -175,7 +175,7 @@ js::GetScopeChain(JSContext *cx, StackFrame *fp) * prototype should appear on blockChain; we'll clone blockChain up * to, but not including, that prototype. */ - limitClone = &fp->scopeChain(); + limitClone = fp->scopeChain(); while (limitClone->isWith()) limitClone = &limitClone->asWith().enclosingScope(); JS_ASSERT(limitClone); @@ -202,7 +202,7 @@ js::GetScopeChain(JSContext *cx, StackFrame *fp) /* If the innermost block has already been cloned, we are done. */ if (limitBlock == sharedBlock) - return &fp->scopeChain(); + return fp->scopeChain(); } /* @@ -238,7 +238,7 @@ js::GetScopeChain(JSContext *cx, StackFrame *fp) return NULL; newChild = clone; } - if (!newChild->setEnclosingScope(cx, RootedVarObject(cx, &fp->scopeChain()))) + if (!newChild->setEnclosingScope(cx, fp->scopeChain())) return NULL; /* @@ -440,7 +440,7 @@ js::RunScript(JSContext *cx, JSScript *script, StackFrame *fp) /* FIXME: Once bug 470510 is fixed, make this an assert. */ if (script->compileAndGo) { - if (fp->scopeChain().global().isCleared()) { + if (fp->global().isCleared()) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_CLEARED_SCOPE); return false; } @@ -953,7 +953,7 @@ EnterWith(JSContext *cx, int stackIndex) static void LeaveWith(JSContext *cx) { - WithObject &withobj = cx->fp()->scopeChain().asWith(); + WithObject &withobj = cx->fp()->scopeChain()->asWith(); JS_ASSERT(withobj.maybeStackFrame() == js_FloatingFrameIfGenerator(cx, cx->fp())); withobj.setStackFrame(NULL); cx->fp()->setScopeChainNoCallObj(withobj.enclosingScope()); @@ -983,7 +983,7 @@ js::UnwindScope(JSContext *cx, uint32_t stackDepth) fp->setBlockChain(block); for (;;) { - JSObject &scopeChain = fp->scopeChain(); + JSObject &scopeChain = *fp->scopeChain(); if (!IsActiveWithOrBlock(cx, scopeChain, stackDepth)) break; if (scopeChain.isClonedBlock()) @@ -1847,7 +1847,7 @@ BEGIN_CASE(JSOP_POPN) JS_ASSERT_IF(block, block->stackDepth() + block->slotCount() <= (size_t) (regs.sp - regs.fp()->base())); - for (JSObject *obj = ®s.fp()->scopeChain(); obj; obj = obj->enclosingScope()) { + for (JSObject *obj = regs.fp()->scopeChain(); obj; obj = obj->enclosingScope()) { if (!obj->isBlock() || !obj->isWith()) continue; if (obj->getPrivate() != js_FloatingFrameIfGenerator(cx, regs.fp())) @@ -1878,11 +1878,11 @@ BEGIN_CASE(JSOP_ENTERWITH) * We set sp[-1] to the current "with" object to help asserting the * enter/leave balance in [leavewith]. */ - regs.sp[-1].setObject(regs.fp()->scopeChain()); + regs.sp[-1].setObject(*regs.fp()->scopeChain()); END_CASE(JSOP_ENTERWITH) BEGIN_CASE(JSOP_LEAVEWITH) - JS_ASSERT(regs.sp[-1].toObject() == regs.fp()->scopeChain()); + JS_ASSERT(regs.sp[-1].toObject() == *regs.fp()->scopeChain()); regs.sp--; LeaveWith(cx); END_CASE(JSOP_LEAVEWITH) @@ -1905,7 +1905,7 @@ BEGIN_CASE(JSOP_STOP) inline_return: { JS_ASSERT(!regs.fp()->hasBlockChain()); - JS_ASSERT(!IsActiveWithOrBlock(cx, regs.fp()->scopeChain(), 0)); + JS_ASSERT(!IsActiveWithOrBlock(cx, *regs.fp()->scopeChain(), 0)); if (cx->compartment->debugMode()) interpReturnOK = ScriptDebugEpilogue(cx, regs.fp(), interpReturnOK); @@ -2179,7 +2179,7 @@ END_CASE(JSOP_ENUMCONSTELEM) #endif BEGIN_CASE(JSOP_BINDGNAME) - PUSH_OBJECT(regs.fp()->scopeChain().global()); + PUSH_OBJECT(regs.fp()->global()); END_CASE(JSOP_BINDGNAME) BEGIN_CASE(JSOP_BINDNAME) @@ -2202,14 +2202,14 @@ BEGIN_CASE(JSOP_BINDNAME) * the rhs. We desire such resolve hook equivalence between the two * forms. */ - obj = ®s.fp()->scopeChain(); + obj = regs.fp()->scopeChain(); if (obj->isGlobal()) break; PropertyName *name; LOAD_NAME(0, name); - obj = FindIdentifierBase(cx, ®s.fp()->scopeChain(), name); + obj = FindIdentifierBase(cx, regs.fp()->scopeChain(), name); if (!obj) goto error; } while (0); @@ -2719,7 +2719,7 @@ END_CASE(JSOP_ENUMELEM) BEGIN_CASE(JSOP_EVAL) { CallArgs args = CallArgsFromSp(GET_ARGC(regs.pc), regs.sp); - if (IsBuiltinEvalForScope(®s.fp()->scopeChain(), args.calleev())) { + if (IsBuiltinEvalForScope(regs.fp()->scopeChain(), args.calleev())) { if (!DirectEval(cx, args)) goto error; } else { @@ -2921,7 +2921,7 @@ BEGIN_CASE(JSOP_REGEXP) * bytecode at pc. */ uint32_t index = GET_UINT32_INDEX(regs.pc); - JSObject *proto = regs.fp()->scopeChain().global().getOrCreateRegExpPrototype(cx); + JSObject *proto = regs.fp()->global().getOrCreateRegExpPrototype(cx); if (!proto) goto error; JSObject *obj = CloneRegExpObject(cx, script->getRegExp(index), proto); @@ -3168,7 +3168,7 @@ BEGIN_CASE(JSOP_DEFFUN) * FIXME: bug 476950, although debugger users may also demand some kind * of scope link for debugger-assisted eval-in-frame. */ - obj2 = ®s.fp()->scopeChain(); + obj2 = regs.fp()->scopeChain(); } else { obj2 = GetScopeChain(cx, regs.fp()); if (!obj2) @@ -3274,7 +3274,7 @@ BEGIN_CASE(JSOP_LAMBDA) do { RootedVarObject &parent = rootObject0; if (fun->isNullClosure()) { - parent = ®s.fp()->scopeChain(); + parent = regs.fp()->scopeChain(); } else { parent = GetScopeChain(cx, regs.fp()); if (!parent) @@ -3948,7 +3948,7 @@ BEGIN_CASE(JSOP_GETFUNNS) JS_ASSERT(!script->strictModeCode); Value rval; - if (!cx->fp()->scopeChain().global().getFunctionNamespace(cx, &rval)) + if (!cx->fp()->global().getFunctionNamespace(cx, &rval)) goto error; PUSH_COPY(rval); } @@ -3987,7 +3987,7 @@ BEGIN_CASE(JSOP_ENTERLET1) * anything else we should have popped off fp->scopeChain when we left its * static scope. */ - JSObject *obj2 = ®s.fp()->scopeChain(); + JSObject *obj2 = regs.fp()->scopeChain(); while (obj2->isWith()) obj2 = &obj2->asWith().enclosingScope(); if (obj2->isBlock() && @@ -4016,7 +4016,7 @@ BEGIN_CASE(JSOP_LEAVEBLOCKEXPR) * cloned onto fp->scopeChain, clear its private data, move its locals from * the stack into the clone, and pop it off the chain. */ - JSObject &scope = regs.fp()->scopeChain(); + JSObject &scope = *regs.fp()->scopeChain(); if (scope.getProto() == &blockObj) scope.asClonedBlock().put(cx); @@ -4280,7 +4280,7 @@ END_CASE(JSOP_ARRAYPUSH) */ JS_ASSERT(entryFrame == regs.fp()); if (!regs.fp()->isGeneratorFrame()) { - JS_ASSERT(!IsActiveWithOrBlock(cx, regs.fp()->scopeChain(), 0)); + JS_ASSERT(!IsActiveWithOrBlock(cx, *regs.fp()->scopeChain(), 0)); JS_ASSERT(!regs.fp()->hasBlockChain()); } diff --git a/js/src/jsinterpinlines.h b/js/src/jsinterpinlines.h index 15d1bbaaf64..df11c76ade1 100644 --- a/js/src/jsinterpinlines.h +++ b/js/src/jsinterpinlines.h @@ -143,7 +143,7 @@ ValuePropertyBearer(JSContext *cx, StackFrame *fp, const Value &v, int spindex) if (v.isObject()) return &v.toObject(); - GlobalObject &global = fp->scopeChain().global(); + GlobalObject &global = fp->global(); if (v.isString()) return global.getOrCreateStringPrototype(cx); @@ -288,7 +288,7 @@ SetPropertyOperation(JSContext *cx, jsbytecode *pc, const Value &lval, const Val return false; JS_ASSERT_IF(*pc == JSOP_SETNAME || *pc == JSOP_SETGNAME, lval.isObject()); - JS_ASSERT_IF(*pc == JSOP_SETGNAME, obj == &cx->fp()->scopeChain().global()); + JS_ASSERT_IF(*pc == JSOP_SETGNAME, obj == &cx->fp()->global()); PropertyCacheEntry *entry; JSObject *obj2; diff --git a/js/src/jsiter.cpp b/js/src/jsiter.cpp index e9c85ff7cb1..8aea91e89de 100644 --- a/js/src/jsiter.cpp +++ b/js/src/jsiter.cpp @@ -1440,7 +1440,7 @@ js_NewGenerator(JSContext *cx) JS_ASSERT(stackfp->base() == cx->regs().sp); JS_ASSERT(stackfp->actualArgs() <= stackfp->formalArgs()); - GlobalObject *global = &stackfp->scopeChain().global(); + GlobalObject *global = &stackfp->global(); JSObject *proto = global->getOrCreateGeneratorPrototype(cx); if (!proto) return NULL; diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index 083c17b0e2e..062bfe78219 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -1096,7 +1096,7 @@ DirectEval(JSContext *cx, const CallArgs &args) /* Direct eval can assume it was called from an interpreted frame. */ StackFrame *caller = cx->fp(); JS_ASSERT(caller->isScriptFrame()); - JS_ASSERT(IsBuiltinEvalForScope(&caller->scopeChain(), args.calleev())); + JS_ASSERT(IsBuiltinEvalForScope(caller->scopeChain(), args.calleev())); JS_ASSERT(JSOp(*cx->regs().pc) == JSOP_EVAL); AutoFunctionCallProbe callProbe(cx, args.callee().toFunction(), caller->script()); @@ -6304,7 +6304,7 @@ js_DumpStackFrame(JSContext *cx, StackFrame *start) fprintf(stderr, " generator"); fputc('\n', stderr); - fprintf(stderr, " scopeChain: (JSObject *) %p\n", (void *) &fp->scopeChain()); + fprintf(stderr, " scopeChain: (JSObject *) %p\n", (void *) fp->scopeChain()); fputc('\n', stderr); } diff --git a/js/src/jsobjinlines.h b/js/src/jsobjinlines.h index c8ce3535c5d..938e6cafac8 100644 --- a/js/src/jsobjinlines.h +++ b/js/src/jsobjinlines.h @@ -1529,7 +1529,7 @@ NewBuiltinClassInstance(JSContext *cx, Class *clasp) inline GlobalObject * GetCurrentGlobal(JSContext *cx) { - JSObject *scopeChain = (cx->hasfp()) ? &cx->fp()->scopeChain() : cx->globalObject; + JSObject *scopeChain = (cx->hasfp()) ? cx->fp()->scopeChain() : cx->globalObject; return scopeChain ? &scopeChain->global() : NULL; } diff --git a/js/src/jsreflect.cpp b/js/src/jsreflect.cpp index ddcee00ddf1..a14933cd8dc 100644 --- a/js/src/jsreflect.cpp +++ b/js/src/jsreflect.cpp @@ -2825,7 +2825,7 @@ ASTSerializer::literal(ParseNode *pn, Value *dst) LOCAL_ASSERT(re1 && re1->isRegExp()); JSObject *proto; - if (!js_GetClassPrototype(cx, &cx->fp()->scopeChain(), JSProto_RegExp, &proto)) + if (!js_GetClassPrototype(cx, cx->fp()->scopeChain(), JSProto_RegExp, &proto)) return false; JSObject *re2 = CloneRegExpObject(cx, re1, proto); diff --git a/js/src/jsxml.cpp b/js/src/jsxml.cpp index af6dee799ff..b01532c45a7 100644 --- a/js/src/jsxml.cpp +++ b/js/src/jsxml.cpp @@ -1722,7 +1722,7 @@ static JSObject * GetCurrentScopeChain(JSContext *cx) { if (cx->hasfp()) - return &cx->fp()->scopeChain(); + return cx->fp()->scopeChain(); return JS_ObjectToInnerObject(cx, cx->globalObject); } @@ -7703,7 +7703,7 @@ js_ValueToXMLString(JSContext *cx, const Value &v) JSBool js_GetAnyName(JSContext *cx, jsid *idp) { - JSObject *global = cx->hasfp() ? &cx->fp()->scopeChain().global() : cx->globalObject; + JSObject *global = cx->hasfp() ? &cx->fp()->global() : cx->globalObject; Value v = global->getReservedSlot(JSProto_AnyName); if (v.isUndefined()) { JSObject *obj = NewObjectWithGivenProto(cx, &AnyNameClass, NULL, global); diff --git a/js/src/methodjit/InvokeHelpers.cpp b/js/src/methodjit/InvokeHelpers.cpp index 7848fe0be8c..e6e2be9ca6c 100644 --- a/js/src/methodjit/InvokeHelpers.cpp +++ b/js/src/methodjit/InvokeHelpers.cpp @@ -156,7 +156,7 @@ static void InlineReturn(VMFrame &f) { JS_ASSERT(f.fp() != f.entryfp); - JS_ASSERT(!IsActiveWithOrBlock(f.cx, f.fp()->scopeChain(), 0)); + JS_ASSERT(!IsActiveWithOrBlock(f.cx, *f.fp()->scopeChain(), 0)); JS_ASSERT(!f.fp()->hasBlockChain()); f.cx->stack.popInlineFrame(f.regs); @@ -430,7 +430,7 @@ stubs::Eval(VMFrame &f, uint32_t argc) { CallArgs args = CallArgsFromSp(argc, f.regs.sp); - if (!IsBuiltinEvalForScope(&f.fp()->scopeChain(), args.calleev())) { + if (!IsBuiltinEvalForScope(f.fp()->scopeChain(), args.calleev())) { if (!InvokeKernel(f.cx, args)) THROW(); diff --git a/js/src/methodjit/MonoIC.cpp b/js/src/methodjit/MonoIC.cpp index 4348cd9474d..728e285eeef 100644 --- a/js/src/methodjit/MonoIC.cpp +++ b/js/src/methodjit/MonoIC.cpp @@ -86,7 +86,7 @@ PatchGetFallback(VMFrame &f, ic::GetGlobalNameIC *ic) void JS_FASTCALL ic::GetGlobalName(VMFrame &f, ic::GetGlobalNameIC *ic) { - JSObject &obj = f.fp()->scopeChain().global(); + JSObject &obj = f.fp()->global(); PropertyName *name = f.script()->getName(GET_UINT32_INDEX(f.pc())); RecompilationMonitor monitor(f.cx); @@ -190,7 +190,7 @@ UpdateSetGlobalName(VMFrame &f, ic::SetGlobalNameIC *ic, JSObject *obj, const Sh void JS_FASTCALL ic::SetGlobalName(VMFrame &f, ic::SetGlobalNameIC *ic) { - JSObject &obj = f.fp()->scopeChain().global(); + JSObject &obj = f.fp()->global(); JSScript *script = f.script(); PropertyName *name = script->getName(GET_UINT32_INDEX(f.pc())); diff --git a/js/src/methodjit/PolyIC.cpp b/js/src/methodjit/PolyIC.cpp index fd761177e09..bbcaa31a6b1 100644 --- a/js/src/methodjit/PolyIC.cpp +++ b/js/src/methodjit/PolyIC.cpp @@ -910,7 +910,7 @@ class GetPropCompiler : public PICStubCompiler RecompilationMonitor monitor(f.cx); - JSObject *obj = f.fp()->scopeChain().global().getOrCreateStringPrototype(f.cx); + JSObject *obj = f.fp()->global().getOrCreateStringPrototype(f.cx); if (!obj) return error(); @@ -1953,7 +1953,7 @@ ic::Name(VMFrame &f, ic::PICInfo *pic) { JSScript *script = f.fp()->script(); - ScopeNameCompiler cc(f, script, &f.fp()->scopeChain(), *pic, pic->name, DisabledNameIC); + ScopeNameCompiler cc(f, script, f.fp()->scopeChain(), *pic, pic->name, DisabledNameIC); LookupStatus status = cc.updateForName(); if (status == Lookup_Error) @@ -1977,7 +1977,7 @@ ic::BindName(VMFrame &f, ic::PICInfo *pic) JSScript *script = f.fp()->script(); VoidStubPIC stub = DisabledBindNameIC; - BindNameCompiler cc(f, script, &f.fp()->scopeChain(), *pic, pic->name, stub); + BindNameCompiler cc(f, script, f.fp()->scopeChain(), *pic, pic->name, stub); JSObject *obj = cc.update(); if (!obj) diff --git a/js/src/methodjit/StubCalls.cpp b/js/src/methodjit/StubCalls.cpp index ba689108313..ca0309e4736 100644 --- a/js/src/methodjit/StubCalls.cpp +++ b/js/src/methodjit/StubCalls.cpp @@ -85,7 +85,7 @@ using namespace JSC; void JS_FASTCALL stubs::BindName(VMFrame &f, PropertyName *name) { - JSObject *obj = FindIdentifierBase(f.cx, &f.fp()->scopeChain(), name); + JSObject *obj = FindIdentifierBase(f.cx, f.fp()->scopeChain(), name); if (!obj) THROW(); f.regs.sp[0].setObject(*obj); @@ -94,7 +94,7 @@ stubs::BindName(VMFrame &f, PropertyName *name) JSObject * JS_FASTCALL stubs::BindGlobalName(VMFrame &f) { - return &f.fp()->scopeChain().global(); + return &f.fp()->global(); } template @@ -343,7 +343,7 @@ stubs::DefFun(VMFrame &f, JSFunction *fun_) * FIXME: bug 476950, although debugger users may also demand some kind * of scope link for debugger-assisted eval-in-frame. */ - obj2 = &fp->scopeChain(); + obj2 = fp->scopeChain(); } else { obj2 = GetScopeChain(cx, fp); if (!obj2) @@ -994,7 +994,7 @@ stubs::RegExp(VMFrame &f, JSObject *regex) * Push a regexp object cloned from the regexp literal object mapped by the * bytecode at pc. */ - JSObject *proto = f.fp()->scopeChain().global().getOrCreateRegExpPrototype(f.cx); + JSObject *proto = f.fp()->global().getOrCreateRegExpPrototype(f.cx); if (!proto) THROW(); JS_ASSERT(proto); @@ -1011,7 +1011,7 @@ stubs::Lambda(VMFrame &f, JSFunction *fun_) RootedVarObject parent(f.cx); if (fun->isNullClosure()) { - parent = &f.fp()->scopeChain(); + parent = f.fp()->scopeChain(); } else { parent = GetScopeChain(f.cx, f.fp()); if (!parent) @@ -1253,7 +1253,7 @@ stubs::EnterBlock(VMFrame &f, JSObject *obj) * anything else we should have popped off fp->scopeChain() when we left its * static scope. */ - JSObject *obj2 = &fp->scopeChain(); + JSObject *obj2 = fp->scopeChain(); while (obj2->isWith()) obj2 = &obj2->asWith().enclosingScope(); if (obj2->isBlock() && @@ -1282,7 +1282,7 @@ stubs::LeaveBlock(VMFrame &f) * cloned onto fp->scopeChain(), clear its private data, move its locals from * the stack into the clone, and pop it off the chain. */ - JSObject &obj = fp->scopeChain(); + JSObject &obj = *fp->scopeChain(); if (obj.getProto() == &blockObj) obj.asClonedBlock().put(cx); diff --git a/js/src/vm/ArgumentsObject.cpp b/js/src/vm/ArgumentsObject.cpp index d70c89fd438..b16240c2a01 100644 --- a/js/src/vm/ArgumentsObject.cpp +++ b/js/src/vm/ArgumentsObject.cpp @@ -77,7 +77,7 @@ js_PutArgsObject(StackFrame *fp) ArgumentsObject &argsobj = fp->argsObj(); if (argsobj.isNormalArguments()) { JS_ASSERT(argsobj.maybeStackFrame() == fp); - JSCompartment *comp = fp->scopeChain().compartment(); + JSCompartment *comp = fp->compartment(); fp->forEachCanonicalActualArg(PutArg(comp, argsobj)); argsobj.setStackFrame(NULL); } else { @@ -343,7 +343,7 @@ NormalArgumentsObject::optimizedGetElem(JSContext *cx, StackFrame *fp, const Val return true; } - JSObject *proto = fp->scopeChain().global().getOrCreateObjectPrototype(cx); + JSObject *proto = fp->global().getOrCreateObjectPrototype(cx); if (!proto) return false; diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp index 6efd8c9172a..c9bc3c740b9 100644 --- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -190,10 +190,10 @@ class Debugger::FrameRange { /* Find our global, if we were not given one. */ if (!global) - global = &fp->scopeChain().global(); + global = &fp->global(); /* The frame and global must match. */ - JS_ASSERT(&fp->scopeChain().global() == global); + JS_ASSERT(&fp->global() == global); /* Find the list of debuggers we'll iterate over. There may be none. */ debuggers = global->getDebuggers(); @@ -278,7 +278,7 @@ ScriptGlobal(JSContext *cx, JSScript *script, GlobalObject *scriptGlobal) for (AllFramesIter i(cx->stack.space()); ; ++i) { JS_ASSERT(!i.done()); if (i.fp()->maybeScript() == script) - return &i.fp()->scopeChain().global(); + return &i.fp()->global(); } JS_NOT_REACHED("ScriptGlobal: live non-held script not on stack"); } @@ -525,7 +525,7 @@ Debugger::slowPathOnEnterFrame(JSContext *cx, Value *vp) { /* Build the list of recipients. */ AutoValueVector triggered(cx); - GlobalObject *global = &cx->fp()->scopeChain().global(); + GlobalObject *global = &cx->fp()->global(); if (GlobalObject::DebuggerVector *debuggers = global->getDebuggers()) { for (Debugger **p = debuggers->begin(); p != debuggers->end(); p++) { Debugger *dbg = *p; @@ -557,7 +557,7 @@ bool Debugger::slowPathOnLeaveFrame(JSContext *cx, bool frameOk) { StackFrame *fp = cx->fp(); - GlobalObject *global = &fp->scopeChain().global(); + GlobalObject *global = &fp->global(); /* Save the frame's completion value. */ JSTrapStatus status; @@ -1025,7 +1025,7 @@ Debugger::dispatchHook(JSContext *cx, Value *vp, Hook which) * different compartments--every compartment *except* this one. */ AutoValueVector triggered(cx); - GlobalObject *global = &cx->fp()->scopeChain().global(); + GlobalObject *global = &cx->fp()->global(); if (GlobalObject::DebuggerVector *debuggers = global->getDebuggers()) { for (Debugger **p = debuggers->begin(); p != debuggers->end(); p++) { Debugger *dbg = *p; @@ -1113,7 +1113,7 @@ Debugger::onTrap(JSContext *cx, Value *vp) { StackFrame *fp = cx->fp(); JSScript *script = fp->script(); - GlobalObject *scriptGlobal = &fp->scopeChain().global(); + GlobalObject *scriptGlobal = &fp->global(); jsbytecode *pc = cx->regs().pc; BreakpointSite *site = script->getBreakpointSite(pc); JSOp op = JSOp(*pc); @@ -1211,7 +1211,7 @@ Debugger::onSingleStep(JSContext *cx, Value *vp) { uint32_t stepperCount = 0; JSScript *trappingScript = fp->script(); - GlobalObject *global = &fp->scopeChain().global(); + GlobalObject *global = &fp->global(); if (GlobalObject::DebuggerVector *debuggers = global->getDebuggers()) { for (Debugger **p = debuggers->begin(); p != debuggers->end(); p++) { Debugger *dbg = *p; @@ -1945,7 +1945,7 @@ Debugger::removeDebuggeeGlobal(FreeOp *fop, GlobalObject *global, */ for (FrameMap::Enum e(frames); !e.empty(); e.popFront()) { StackFrame *fp = e.front().key; - if (&fp->scopeChain().global() == global) { + if (&fp->global() == global) { e.front().value->setPrivate(NULL); e.removeFront(); } @@ -2120,7 +2120,7 @@ class Debugger::ScriptQuery { */ JS_ASSERT(!script->getGlobalObjectOrNull()); - GlobalObject *global = &fri.fp()->scopeChain().global(); + GlobalObject *global = &fri.fp()->global(); if (!consider(script, global, vector)) return false; } @@ -3051,7 +3051,7 @@ DebuggerFrame_getEnvironment(JSContext *cx, unsigned argc, Value *vp) Env *env; { - AutoCompartment ac(cx, &fp->scopeChain()); + AutoCompartment ac(cx, fp->scopeChain()); if (!ac.enter()) return false; env = Frame_GetEnv(cx, fp); @@ -3095,7 +3095,7 @@ DebuggerFrame_getThis(JSContext *cx, unsigned argc, Value *vp) THIS_FRAME(cx, argc, vp, "get this", args, thisobj, fp); Value thisv; { - AutoCompartment ac(cx, &fp->scopeChain()); + AutoCompartment ac(cx, fp->scopeChain()); if (!ac.enter()) return false; if (!ComputeThis(cx, fp)) @@ -3316,7 +3316,7 @@ DebuggerFrame_setOnStep(JSContext *cx, unsigned argc, Value *vp) int delta = !args[0].isUndefined() - !prior.isUndefined(); if (delta != 0) { /* Try to adjust this frame's script single-step mode count. */ - AutoCompartment ac(cx, &fp->scopeChain()); + AutoCompartment ac(cx, fp->scopeChain()); if (!ac.enter()) return false; if (!fp->script()->changeStepModeCount(cx, delta)) @@ -3379,7 +3379,7 @@ EvaluateInEnv(JSContext *cx, Env *env, StackFrame *fp, const jschar *chars, * we use a static level that will cause us not to attempt to optimize * variable references made by this frame. */ - JSPrincipals *prin = fp->scopeChain().principals(cx); + JSPrincipals *prin = fp->scopeChain()->principals(cx); JSScript *script = frontend::CompileScript(cx, env, fp, prin, prin, TCF_COMPILE_N_GO | TCF_NEED_SCRIPT_GLOBAL, chars, length, filename, lineno, @@ -3442,7 +3442,7 @@ DebuggerFrameEval(JSContext *cx, unsigned argc, Value *vp, EvalBindingsMode mode } } - AutoCompartment ac(cx, &fp->scopeChain()); + AutoCompartment ac(cx, fp->scopeChain()); if (!ac.enter()) return false; diff --git a/js/src/vm/Debugger.h b/js/src/vm/Debugger.h index 0a9eea33060..41e1521b97c 100644 --- a/js/src/vm/Debugger.h +++ b/js/src/vm/Debugger.h @@ -514,7 +514,7 @@ Debugger::observesGlobal(GlobalObject *global) const bool Debugger::observesFrame(StackFrame *fp) const { - return !fp->isDummyFrame() && observesGlobal(&fp->scopeChain().global()); + return !fp->isDummyFrame() && observesGlobal(&fp->global()); } JSTrapStatus diff --git a/js/src/vm/ScopeObject.cpp b/js/src/vm/ScopeObject.cpp index f00ee9afbe5..926941fc431 100644 --- a/js/src/vm/ScopeObject.cpp +++ b/js/src/vm/ScopeObject.cpp @@ -218,7 +218,7 @@ CallObject::createForFunction(JSContext *cx, StackFrame *fp) JS_ASSERT(fp->isNonEvalFunctionFrame()); JS_ASSERT(!fp->hasCallObj()); - RootedVarObject scopeChain(cx, &fp->scopeChain()); + RootedVarObject scopeChain(cx, fp->scopeChain()); JS_ASSERT_IF(scopeChain->isWith() || scopeChain->isBlock() || scopeChain->isCall(), scopeChain->getPrivate() != fp); @@ -250,9 +250,7 @@ CallObject::createForFunction(JSContext *cx, StackFrame *fp) CallObject * CallObject::createForStrictEval(JSContext *cx, StackFrame *fp) { - CallObject *callobj = create(cx, fp->script(), - RootedVarObject(cx, &fp->scopeChain()), - RootedVarObject(cx)); + CallObject *callobj = create(cx, fp->script(), fp->scopeChain(), RootedVarObject(cx)); if (!callobj) return NULL; @@ -421,8 +419,7 @@ DeclEnvObject::create(JSContext *cx, StackFrame *fp) RootedVarShape emptyDeclEnvShape(cx); emptyDeclEnvShape = EmptyShape::getInitialShape(cx, &DeclEnvClass, NULL, - &fp->scopeChain().global(), - FINALIZE_KIND); + &fp->global(), FINALIZE_KIND); if (!emptyDeclEnvShape) return NULL; @@ -431,7 +428,7 @@ DeclEnvObject::create(JSContext *cx, StackFrame *fp) return NULL; obj->setPrivate(fp); - if (!obj->asScope().setEnclosingScope(cx, RootedVarObject(cx, &fp->scopeChain()))) + if (!obj->asScope().setEnclosingScope(cx, fp->scopeChain())) return NULL; return &obj->asDeclEnv(); @@ -717,7 +714,7 @@ ClonedBlockObject::create(JSContext *cx, StaticBlockObject &block, StackFrame *f return NULL; /* Set the parent if necessary, as for call objects. */ - JSObject &global = fp->scopeChain().global(); + JSObject &global = fp->global(); if (&global != obj->getParent()) { JS_ASSERT(obj->getParent() == NULL); if (!obj->setParent(cx, &global)) diff --git a/js/src/vm/Stack-inl.h b/js/src/vm/Stack-inl.h index cc673ecdda1..c27da8c9b98 100644 --- a/js/src/vm/Stack-inl.h +++ b/js/src/vm/Stack-inl.h @@ -69,7 +69,7 @@ IsCacheableNonGlobalScope(JSObject *obj) return cacheable; } -inline JSObject & +inline HandleObject StackFrame::scopeChain() const { JS_ASSERT_IF(!(flags_ & HAS_SCOPECHAIN), isFunctionFrame()); @@ -77,13 +77,19 @@ StackFrame::scopeChain() const scopeChain_ = callee().toFunction()->environment(); flags_ |= HAS_SCOPECHAIN; } - return *scopeChain_; + return HandleObject::fromMarkedLocation(&scopeChain_); +} + +inline GlobalObject & +StackFrame::global() const +{ + return scopeChain()->global(); } inline JSObject & StackFrame::varObj() { - JSObject *obj = &scopeChain(); + JSObject *obj = scopeChain(); while (!obj->isVarObj()) obj = obj->enclosingScope(); return *obj; @@ -92,8 +98,8 @@ StackFrame::varObj() inline JSCompartment * StackFrame::compartment() const { - JS_ASSERT_IF(isScriptFrame(), scopeChain().compartment() == script()->compartment()); - return scopeChain().compartment(); + JS_ASSERT_IF(isScriptFrame(), scopeChain()->compartment() == script()->compartment()); + return scopeChain()->compartment(); } inline void @@ -330,7 +336,7 @@ StackFrame::callObj() const { JS_ASSERT_IF(isNonEvalFunctionFrame() || isStrictEvalFrame(), hasCallObj()); - JSObject *pobj = &scopeChain(); + JSObject *pobj = scopeChain(); while (JS_UNLIKELY(!pobj->isCall())) pobj = pobj->enclosingScope(); return pobj->asCall(); @@ -645,10 +651,10 @@ ContextStack::currentScriptWithDiagnostics(jsbytecode **ppc) const return script; } -inline JSObject * +inline HandleObject ContextStack::currentScriptedScopeChain() const { - return &fp()->scopeChain(); + return fp()->scopeChain(); } } /* namespace js */ diff --git a/js/src/vm/Stack.h b/js/src/vm/Stack.h index 72c34f1f571..47767bbf880 100644 --- a/js/src/vm/Stack.h +++ b/js/src/vm/Stack.h @@ -861,7 +861,8 @@ class StackFrame * !fp->hasCall() && fp->scopeChain().isCall() */ - inline JSObject &scopeChain() const; + inline HandleObject scopeChain() const; + inline GlobalObject &global() const; bool hasCallObj() const { bool ret = !!(flags_ & HAS_CALL_OBJ); @@ -1695,7 +1696,7 @@ class ContextStack inline JSScript *currentScriptWithDiagnostics(jsbytecode **pc = NULL) const; /* Get the scope chain for the topmost scripted call on the stack. */ - inline JSObject *currentScriptedScopeChain() const; + inline HandleObject currentScriptedScopeChain() const; /* * Called by the methodjit for an arity mismatch. Arity mismatch can be From 4c6a9736de39b6cce01e3a1b07df6f79a28f8c2c Mon Sep 17 00:00:00 2001 From: Jeff Muizelaar Date: Mon, 16 Apr 2012 14:37:59 -0400 Subject: [PATCH 007/182] Bug 745864. Add SAMPLE_LABELs to layout code. r=roc, a=joe --HG-- extra : rebase_source : d826780c34692d333442b6bf563791b53bf3aa3d --- layout/base/FrameLayerBuilder.cpp | 1 + layout/base/nsCSSRendering.cpp | 5 ++++- layout/base/nsCSSRenderingBorders.cpp | 2 ++ layout/base/nsDisplayList.cpp | 3 +++ layout/base/nsLayoutUtils.cpp | 10 ++++++++-- layout/generic/nsTextFrameThebes.cpp | 3 +++ layout/generic/nsViewportFrame.cpp | 2 ++ 7 files changed, 23 insertions(+), 3 deletions(-) diff --git a/layout/base/FrameLayerBuilder.cpp b/layout/base/FrameLayerBuilder.cpp index 90c79b241c5..9fcd676ba0d 100644 --- a/layout/base/FrameLayerBuilder.cpp +++ b/layout/base/FrameLayerBuilder.cpp @@ -1432,6 +1432,7 @@ void ContainerState::ProcessDisplayItems(const nsDisplayList& aList, FrameLayerBuilder::Clip& aClip) { + SAMPLE_LABEL("ContainerState", "ProcessDisplayItems"); for (nsDisplayItem* item = aList.GetBottom(); item; item = item->GetAbove()) { nsDisplayItem::Type type = item->GetType(); if (type == nsDisplayItem::TYPE_CLIP || diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp index 977a5de33a8..95ccce192a8 100644 --- a/layout/base/nsCSSRendering.cpp +++ b/layout/base/nsCSSRendering.cpp @@ -82,7 +82,7 @@ #include "nsSVGEffects.h" #include "nsSVGIntegrationUtils.h" #include "gfxDrawable.h" - +#include "sampler.h" #include "nsCSSRenderingBorders.h" using namespace mozilla; @@ -501,6 +501,7 @@ nsCSSRendering::PaintBorder(nsPresContext* aPresContext, nsStyleContext* aStyleContext, PRIntn aSkipSides) { + SAMPLE_LABEL("nsCSSRendering", "PaintBorder"); nsStyleContext *styleIfVisited = aStyleContext->GetStyleIfVisited(); const nsStyleBorder *styleBorder = aStyleContext->GetStyleBorder(); // Don't check RelevantLinkVisited here, since we want to take the @@ -1458,6 +1459,7 @@ nsCSSRendering::PaintBackground(nsPresContext* aPresContext, PRUint32 aFlags, nsRect* aBGClipRect) { + SAMPLE_LABEL("nsCSSRendering", "PaintBackground"); NS_PRECONDITION(aForFrame, "Frame is expected to be provided to PaintBackground"); @@ -1966,6 +1968,7 @@ nsCSSRendering::PaintGradient(nsPresContext* aPresContext, const nsRect& aOneCellArea, const nsRect& aFillArea) { + SAMPLE_LABEL("nsCSSRendering", "PaintGradient"); if (aOneCellArea.IsEmpty()) return; diff --git a/layout/base/nsCSSRenderingBorders.cpp b/layout/base/nsCSSRenderingBorders.cpp index e533d0143e8..1470ef73c7b 100644 --- a/layout/base/nsCSSRenderingBorders.cpp +++ b/layout/base/nsCSSRenderingBorders.cpp @@ -62,6 +62,7 @@ #include "nsLayoutUtils.h" #include "nsINameSpaceManager.h" #include "nsBlockFrame.h" +#include "sampler.h" #include "gfxContext.h" @@ -1570,6 +1571,7 @@ nsCSSBorderRenderer::DrawBorders() DrawBorderSides(SIDE_BITS_ALL); SN("---------------- (1)"); } else { + SAMPLE_LABEL("nsCSSBorderRenderer", "DrawBorders::multipass"); /* We have more than one pass to go. Draw the corners separately from the sides. */ /* diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index 1271cfabeb4..d7084dac5ce 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -66,6 +66,7 @@ #include "nsViewportFrame.h" #include "nsSVGEffects.h" #include "nsSVGClipPathFrame.h" +#include "sampler.h" #include "mozilla/StandardInteger.h" @@ -431,6 +432,7 @@ nsDisplayList::GetBounds(nsDisplayListBuilder* aBuilder) const { bool nsDisplayList::ComputeVisibilityForRoot(nsDisplayListBuilder* aBuilder, nsRegion* aVisibleRegion) { + SAMPLE_LABEL("nsDisplayList", "ComputeVisibilityForRoot"); nsRegion r; r.And(*aVisibleRegion, GetBounds(aBuilder)); return ComputeVisibilityForSublist(aBuilder, aVisibleRegion, r.GetBounds(), r.GetBounds()); @@ -549,6 +551,7 @@ nsDisplayList::ComputeVisibilityForSublist(nsDisplayListBuilder* aBuilder, void nsDisplayList::PaintRoot(nsDisplayListBuilder* aBuilder, nsRenderingContext* aCtx, PRUint32 aFlags) const { + SAMPLE_LABEL("nsDisplayList", "PaintRoot"); PaintForFrame(aBuilder, aCtx, aBuilder->ReferenceFrame(), aFlags); } diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index b1716b264be..c0a2a014f68 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -1406,6 +1406,7 @@ nsLayoutUtils::GetFrameForPoint(nsIFrame* aFrame, nsPoint aPt, bool aShouldIgnoreSuppression, bool aIgnoreRootScrollFrame) { + SAMPLE_LABEL("nsLayoutUtils", "GetFrameForPoint"); nsresult rv; nsAutoTArray outFrames; rv = GetFramesForArea(aFrame, nsRect(aPt, nsSize(1, 1)), outFrames, @@ -1420,6 +1421,7 @@ nsLayoutUtils::GetFramesForArea(nsIFrame* aFrame, const nsRect& aRect, bool aShouldIgnoreSuppression, bool aIgnoreRootScrollFrame) { + SAMPLE_LABEL("nsLayoutUtils","GetFramesForArea"); nsDisplayListBuilder builder(aFrame, nsDisplayListBuilder::EVENT_DELIVERY, false); nsDisplayList list; @@ -1560,6 +1562,7 @@ nsLayoutUtils::PaintFrame(nsRenderingContext* aRenderingContext, nsIFrame* aFram const nsRegion& aDirtyRegion, nscolor aBackstop, PRUint32 aFlags) { + SAMPLE_LABEL("nsLayoutUtils","PaintFrame"); if (aFlags & PAINT_WIDGET_LAYERS) { nsIView* view = aFrame->GetView(); if (!(view && view->GetWidget() && GetDisplayRootFrame(aFrame) == aFrame)) { @@ -1666,9 +1669,10 @@ nsLayoutUtils::PaintFrame(nsRenderingContext* aRenderingContext, nsIFrame* aFram nsRect dirtyRect = visibleRegion.GetBounds(); builder.EnterPresShell(aFrame, dirtyRect); - + { + SAMPLE_LABEL("nsLayoutUtils","PaintFrame::BuildDisplayList"); rv = aFrame->BuildDisplayListForStackingContext(&builder, dirtyRect, &list); - + } const bool paintAllContinuations = aFlags & PAINT_ALL_CONTINUATIONS; NS_ASSERTION(!paintAllContinuations || !aFrame->GetPrevContinuation(), "If painting all continuations, the frame must be " @@ -1689,6 +1693,7 @@ nsLayoutUtils::PaintFrame(nsRenderingContext* aRenderingContext, nsIFrame* aFram nsIFrame* page = aFrame; nscoord y = aFrame->GetSize().height; while ((page = GetNextPage(page)) != nsnull) { + SAMPLE_LABEL("nsLayoutUtils","PaintFrame::BuildDisplayListForExtraPage"); rv = BuildDisplayListForExtraPage(&builder, page, y, &list); if (NS_FAILED(rv)) break; @@ -1700,6 +1705,7 @@ nsLayoutUtils::PaintFrame(nsRenderingContext* aRenderingContext, nsIFrame* aFram nsIFrame* currentFrame = aFrame; while (NS_SUCCEEDED(rv) && (currentFrame = currentFrame->GetNextContinuation()) != nsnull) { + SAMPLE_LABEL("nsLayoutUtils","PaintFrame::ContinuationsBuildDisplayList"); nsRect frameDirty = dirtyRect - builder.ToReferenceFrame(currentFrame); rv = currentFrame->BuildDisplayListForStackingContext(&builder, frameDirty, &list); diff --git a/layout/generic/nsTextFrameThebes.cpp b/layout/generic/nsTextFrameThebes.cpp index 865be5851df..64c341610d4 100644 --- a/layout/generic/nsTextFrameThebes.cpp +++ b/layout/generic/nsTextFrameThebes.cpp @@ -118,6 +118,8 @@ #include "mozilla/Util.h" // for DebugOnly #include "mozilla/LookAndFeel.h" +#include "sampler.h" + #ifdef NS_DEBUG #undef NOISY_BLINK #undef NOISY_REFLOW @@ -4417,6 +4419,7 @@ public: void nsDisplayText::Paint(nsDisplayListBuilder* aBuilder, nsRenderingContext* aCtx) { + SAMPLE_LABEL("nsDisplayText", "Paint"); // Add 1 pixel of dirty area around mVisibleRect to allow us to paint // antialiased pixels beyond the measured text extents. // This is temporary until we do this in the actual calculation of text extents. diff --git a/layout/generic/nsViewportFrame.cpp b/layout/generic/nsViewportFrame.cpp index d9b1c178131..06202ff57cd 100644 --- a/layout/generic/nsViewportFrame.cpp +++ b/layout/generic/nsViewportFrame.cpp @@ -49,6 +49,7 @@ #include "FrameLayerBuilder.h" #include "nsSubDocumentFrame.h" #include "nsAbsoluteContainingBlock.h" +#include "sampler.h" using namespace mozilla; @@ -91,6 +92,7 @@ ViewportFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { + SAMPLE_LABEL("ViewportFrame", "BuildDisplayList"); nsIFrame* kid = mFrames.FirstChild(); if (!kid) return NS_OK; From afd7b40d0b0c8ad0f6aa896acd5dba7a1093f460 Mon Sep 17 00:00:00 2001 From: Gervase Markham Date: Tue, 24 Apr 2012 17:16:08 +0100 Subject: [PATCH 008/182] Bug 747871 - add .fr, .re, .pm, .tf, .yt and .wf to IDN TLD whitelist. --- modules/libpref/src/init/all.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index 153f752d6ff..af62316b3f8 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -960,6 +960,7 @@ pref("network.IDN.whitelist.dk", true); pref("network.IDN.whitelist.ee", true); pref("network.IDN.whitelist.es", true); pref("network.IDN.whitelist.fi", true); +pref("network.IDN.whitelist.fr", true); pref("network.IDN.whitelist.gr", true); pref("network.IDN.whitelist.hu", true); pref("network.IDN.whitelist.il", true); @@ -976,15 +977,20 @@ pref("network.IDN.whitelist.no", true); pref("network.IDN.whitelist.nu", true); pref("network.IDN.whitelist.nz", true); pref("network.IDN.whitelist.pl", true); +pref("network.IDN.whitelist.pm", true); pref("network.IDN.whitelist.pr", true); +pref("network.IDN.whitelist.re", true); pref("network.IDN.whitelist.se", true); pref("network.IDN.whitelist.sh", true); pref("network.IDN.whitelist.si", true); +pref("network.IDN.whitelist.tf", true); pref("network.IDN.whitelist.th", true); pref("network.IDN.whitelist.tm", true); pref("network.IDN.whitelist.tw", true); pref("network.IDN.whitelist.ua", true); pref("network.IDN.whitelist.vn", true); +pref("network.IDN.whitelist.wf", true); +pref("network.IDN.whitelist.yt", true); // IDN ccTLDs // ae, UAE, . From 2219301d4a29b78c1048a334b1cf4843d52229fe Mon Sep 17 00:00:00 2001 From: Joel Maher Date: Tue, 24 Apr 2012 12:57:50 -0400 Subject: [PATCH 009/182] Bug 732638 - After "make reftest" or "make crashtest" run completes w/ failures, the harness says "To rerun your failures please run 'make mochitest-plain-rerun-failures'". r=ted --- testing/testsuite-targets.mk | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/testing/testsuite-targets.mk b/testing/testsuite-targets.mk index 95a91d58c9e..c06095d66ff 100644 --- a/testing/testsuite-targets.mk +++ b/testing/testsuite-targets.mk @@ -91,17 +91,17 @@ RUN_MOCHITEST_ROBOTIUM = \ --robocop=$(DEPTH)/build/mobile/robocop/robocop.ini $(SYMBOLS_PATH) $(TEST_PATH_ARG) $(EXTRA_TEST_ARGS) ifndef NO_FAIL_ON_TEST_ERRORS -define CHECK_TEST_ERROR +define check_test_error_internal @errors=`grep "TEST-UNEXPECTED-" $@.log` ;\ if test "$$errors" ; then \ echo "$@ failed:"; \ echo "$$errors"; \ - echo "To rerun your failures please run 'make mochitest-plain-rerun-failures'"; \ + $(if $(1),echo $(1)) \ exit 1; \ - else \ - echo "$@ passed"; \ fi endef +CHECK_TEST_ERROR = $(call check_test_error_internal) +CHECK_TEST_ERROR_RERUN = $(call check_test_error_internal,"To rerun your failures please run 'make $@-rerun-failures'") endif mochitest-remote: DM_TRANS?=adb @@ -127,11 +127,11 @@ mochitest-robotium: mochitest-plain: $(RUN_MOCHITEST) - $(CHECK_TEST_ERROR) + $(CHECK_TEST_ERROR_RERUN) mochitest-plain-rerun-failures: $(RERUN_MOCHITEST) - $(CHECK_TEST_ERROR) + $(CHECK_TEST_ERROR_RERUN) # Allow mochitest-1 ... mochitest-5 for developer ease mochitest-1 mochitest-2 mochitest-3 mochitest-4 mochitest-5: mochitest-%: From 4534006f67e5ee142279b9cc34881812dfb4c34a Mon Sep 17 00:00:00 2001 From: Justin Lebar Date: Tue, 24 Apr 2012 13:12:32 -0400 Subject: [PATCH 010/182] Bug 741652 - On Linux, make JS_StartProfiling start the |perf| profiler. r=sfink --- js/src/jsdbgapi.cpp | 144 ++++++++++++++++++++++++++++++++++++++++++++ js/src/jsdbgapi.h | 10 +++ 2 files changed, 154 insertions(+) diff --git a/js/src/jsdbgapi.cpp b/js/src/jsdbgapi.cpp index 8e91611edea..cc6c5dd4f78 100644 --- a/js/src/jsdbgapi.cpp +++ b/js/src/jsdbgapi.cpp @@ -79,6 +79,7 @@ #include "vm/Stack-inl.h" #include "jsautooplen.h" +#include "mozilla/Util.h" #ifdef __APPLE__ #include "sharkctl.h" @@ -86,6 +87,7 @@ using namespace js; using namespace js::gc; +using namespace mozilla; JS_PUBLIC_API(JSBool) JS_GetDebugMode(JSContext *cx) @@ -1114,6 +1116,10 @@ JS_StartProfiling(const char *profileName) #ifdef MOZ_VTUNE if (!js_StartVtune(profileName)) ok = JS_FALSE; +#endif +#ifdef __linux__ + if (!js_StartPerf()) + ok = JS_FALSE; #endif return ok; } @@ -1128,6 +1134,10 @@ JS_StopProfiling(const char *profileName) #ifdef MOZ_VTUNE if (!js_StopVtune()) ok = JS_FALSE; +#endif +#ifdef __linux__ + if (!js_StopPerf()) + ok = JS_FALSE; #endif return ok; } @@ -1581,6 +1591,140 @@ js_ResumeVtune() #endif /* MOZ_VTUNE */ +#ifdef __linux__ + +/* + * Code for starting and stopping |perf|, the Linux profiler. + * + * Output from profiling is written to mozperf.data in your cwd. + * + * To enable, set MOZ_PROFILE_WITH_PERF=1 in your environment. + * + * To pass additional parameters to |perf record|, provide them in the + * MOZ_PROFILE_PERF_FLAGS environment variable. If this variable does not + * exist, we default it to "--call-graph". (If you don't want --call-graph but + * don't want to pass any other args, define MOZ_PROFILE_PERF_FLAGS to the empty + * string.) + * + * If you include --pid or --output in MOZ_PROFILE_PERF_FLAGS, you're just + * asking for trouble. + * + * Our split-on-spaces logic is lame, so don't expect MOZ_PROFILE_PERF_FLAGS to + * work if you pass an argument which includes a space (e.g. + * MOZ_PROFILE_PERF_FLAGS="-e 'foo bar'"). + */ + +#include +#include +#include +#include + +static bool perfInitialized = false; +static pid_t perfPid = 0; + +JSBool js_StartPerf() +{ + const char *outfile = "mozperf.data"; + + if (perfPid != 0) { + UnsafeError("js_StartPerf: called while perf was already running!\n"); + return false; + } + + // Bail if MOZ_PROFILE_WITH_PERF is empty or undefined. + if (!getenv("MOZ_PROFILE_WITH_PERF") || + !strlen(getenv("MOZ_PROFILE_WITH_PERF"))) { + return true; + } + + /* + * Delete mozperf.data the first time through -- we're going to append to it + * later on, so we want it to be clean when we start out. + */ + if (!perfInitialized) { + perfInitialized = true; + unlink(outfile); + char cwd[4096]; + printf("Writing perf profiling data to %s/%s\n", + getcwd(cwd, sizeof(cwd)), outfile); + } + + pid_t mainPid = getpid(); + + pid_t childPid = fork(); + if (childPid == 0) { + /* perf record --append --pid $mainPID --output=$outfile $MOZ_PROFILE_PERF_FLAGS */ + + char mainPidStr[16]; + snprintf(mainPidStr, sizeof(mainPidStr), "%d", mainPid); + const char *defaultArgs[] = {"perf", "record", "--append", + "--pid", mainPidStr, "--output", outfile}; + + Vector args; + args.append(defaultArgs, ArrayLength(defaultArgs)); + + const char *flags = getenv("MOZ_PROFILE_PERF_FLAGS"); + if (!flags) { + flags = "--call-graph"; + } + + // Split |flags| on spaces. (Don't bother to free it -- we're going to + // exec anyway.) + char *toksave; + char *tok = strtok_r(strdup(flags), " ", &toksave); + while (tok) { + args.append(tok); + tok = strtok_r(NULL, " ", &toksave); + } + + args.append((char*) NULL); + + execvp("perf", const_cast(args.begin())); + + /* Reached only if execlp fails. */ + fprintf(stderr, "Unable to start perf.\n"); + exit(1); + } + else if (childPid > 0) { + perfPid = childPid; + + /* Give perf a chance to warm up. */ + usleep(500 * 1000); + return true; + } + else { + UnsafeError("js_StartPerf: fork() failed\n"); + return false; + } +} + +JSBool js_StopPerf() +{ + if (perfPid == 0) { + UnsafeError("js_StopPerf: perf is not running.\n"); + return true; + } + + if (kill(perfPid, SIGINT)) { + UnsafeError("js_StopPerf: kill failed\n"); + + // Try to reap the process anyway. + waitpid(perfPid, NULL, WNOHANG); + } + else { + waitpid(perfPid, NULL, 0); + } + + /* + * If kill() failed, assume it failed because perf died early and continue + * on as though perf had been successfully killed. + */ + perfPid = 0; + return true; +} + +#endif /* __linux__ */ + JS_PUBLIC_API(void) JS_DumpBytecode(JSContext *cx, JSScript *script) { diff --git a/js/src/jsdbgapi.h b/js/src/jsdbgapi.h index 16c8cc7aef8..445172d0109 100644 --- a/js/src/jsdbgapi.h +++ b/js/src/jsdbgapi.h @@ -532,6 +532,16 @@ js_ResumeVtune(); #endif /* MOZ_VTUNE */ +#ifdef __linux__ + +extern JS_FRIEND_API(JSBool) +js_StartPerf(); + +extern JS_FRIEND_API(JSBool) +js_StopPerf(); + +#endif /* __linux__ */ + extern JS_PUBLIC_API(void) JS_DumpBytecode(JSContext *cx, JSScript *script); From 2214728b48d2a486383fcaa49e53ca0c1be938b5 Mon Sep 17 00:00:00 2001 From: Brian Nicholson Date: Thu, 5 Jan 2012 16:02:51 -0800 Subject: [PATCH 011/182] Bug 712975 - Observe plugin pref changes. r=josh a=blocking-fennec --- dom/plugins/base/nsPluginHost.cpp | 25 ++++++++++++++++++------- dom/plugins/base/nsPluginHost.h | 3 +-- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/dom/plugins/base/nsPluginHost.cpp b/dom/plugins/base/nsPluginHost.cpp index 03fc795960f..0a43567beba 100644 --- a/dom/plugins/base/nsPluginHost.cpp +++ b/dom/plugins/base/nsPluginHost.cpp @@ -353,6 +353,8 @@ nsPluginHost::nsPluginHost() mPluginsDisabled = Preferences::GetBool("plugin.disable", false); + Preferences::AddStrongObserver(this, "plugin.disable"); + nsCOMPtr obsService = mozilla::services::GetObserverService(); if (obsService) { @@ -387,7 +389,7 @@ nsPluginHost::~nsPluginHost() { PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("nsPluginHost::dtor\n")); - Destroy(); + UnloadPlugins(); sInst = nsnull; } @@ -811,15 +813,13 @@ nsresult nsPluginHost::Init() return NS_OK; } -nsresult nsPluginHost::Destroy() +nsresult nsPluginHost::UnloadPlugins() { - PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("nsPluginHost::Destroy Called\n")); + PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("nsPluginHost::UnloadPlugins Called\n")); - if (mIsDestroyed) + if (!mPluginsLoaded) return NS_OK; - mIsDestroyed = true; - // we should call nsIPluginInstance::Stop and nsIPluginInstance::SetWindow // for those plugins who want it DestroyRunningInstances(nsnull, nsnull); @@ -849,6 +849,8 @@ nsresult nsPluginHost::Destroy() } #endif /* XP_WIN */ + mPluginsLoaded = false; + return NS_OK; } @@ -3326,7 +3328,7 @@ NS_IMETHODIMP nsPluginHost::Observe(nsISupports *aSubject, { if (!nsCRT::strcmp(NS_XPCOM_SHUTDOWN_OBSERVER_ID, aTopic)) { OnShutdown(); - Destroy(); + UnloadPlugins(); sInst->Release(); } if (!nsCRT::strcmp(NS_PRIVATE_BROWSING_SWITCH_TOPIC, aTopic)) { @@ -3335,6 +3337,15 @@ NS_IMETHODIMP nsPluginHost::Observe(nsISupports *aSubject, mInstances[i]->PrivateModeStateChanged(); } } + if (!nsCRT::strcmp(NS_PREFBRANCH_PREFCHANGE_TOPIC_ID, aTopic)) { + mPluginsDisabled = Preferences::GetBool("plugin.disable", false); + // Unload or load plugins as needed + if (mPluginsDisabled) { + UnloadPlugins(); + } else { + LoadPlugins(); + } + } #ifdef MOZ_WIDGET_ANDROID if (!nsCRT::strcmp("application-background", aTopic)) { for(PRUint32 i = 0; i < mInstances.Length(); i++) { diff --git a/dom/plugins/base/nsPluginHost.h b/dom/plugins/base/nsPluginHost.h index 32428a5cb04..e8b4ad598e4 100644 --- a/dom/plugins/base/nsPluginHost.h +++ b/dom/plugins/base/nsPluginHost.h @@ -110,8 +110,8 @@ public: NS_DECL_NSITIMERCALLBACK nsresult Init(); - nsresult Destroy(); nsresult LoadPlugins(); + nsresult UnloadPlugins(); nsresult CreateListenerForChannel(nsIChannel* aChannel, nsObjectLoadingContent* aContent, nsIStreamListener** aListener); @@ -308,7 +308,6 @@ private: nsRefPtr mInvalidPlugins; bool mPluginsLoaded; bool mDontShowBadPluginMessage; - bool mIsDestroyed; // set by pref plugin.override_internal_types bool mOverrideInternalTypes; From e36bd2d7d05126ec51e49d4efade2cb52cad9afa Mon Sep 17 00:00:00 2001 From: David Bolter Date: Tue, 24 Apr 2012 13:39:03 -0400 Subject: [PATCH 012/182] Bug 563862 - Expand support for aria attribute change events. r=marcoz,surkov --- accessible/src/base/nsDocAccessible.cpp | 17 +++---- .../tests/mochitest/attributes/test_obj.html | 11 +++++ .../mochitest/events/test_aria_objattr.html | 47 ++++++++----------- 3 files changed, 37 insertions(+), 38 deletions(-) diff --git a/accessible/src/base/nsDocAccessible.cpp b/accessible/src/base/nsDocAccessible.cpp index 7702146a4ca..4d0bdf68706 100644 --- a/accessible/src/base/nsDocAccessible.cpp +++ b/accessible/src/base/nsDocAccessible.cpp @@ -1137,16 +1137,6 @@ nsDocAccessible::ARIAAttributeChanged(nsIContent* aContent, nsIAtom* aAttribute) return; } - // For aria drag and drop changes we fire a generic attribute change event; - // at least until native API comes up with a more meaningful event. - if (aAttribute == nsGkAtoms::aria_grabbed || - aAttribute == nsGkAtoms::aria_dropeffect || - aAttribute == nsGkAtoms::aria_hidden || - aAttribute == nsGkAtoms::aria_sort) { - FireDelayedAccessibleEvent(nsIAccessibleEvent::EVENT_OBJECT_ATTRIBUTE_CHANGED, - aContent); - } - // We treat aria-expanded as a global ARIA state for historical reasons if (aAttribute == nsGkAtoms::aria_expanded) { nsRefPtr event = @@ -1155,6 +1145,13 @@ nsDocAccessible::ARIAAttributeChanged(nsIContent* aContent, nsIAtom* aAttribute) return; } + // For aria attributes like drag and drop changes we fire a generic attribute + // change event; at least until native API comes up with a more meaningful event. + PRUint8 attrFlags = nsAccUtils::GetAttributeCharacteristics(aAttribute); + if (!(attrFlags & ATTR_BYPASSOBJ)) + FireDelayedAccessibleEvent(nsIAccessibleEvent::EVENT_OBJECT_ATTRIBUTE_CHANGED, + aContent); + if (!aContent->HasAttr(kNameSpaceID_None, nsGkAtoms::role)) { // We don't care about these other ARIA attribute changes unless there is // an ARIA role set for the element diff --git a/accessible/tests/mochitest/attributes/test_obj.html b/accessible/tests/mochitest/attributes/test_obj.html index f33848f1398..517fbc4243e 100644 --- a/accessible/tests/mochitest/attributes/test_obj.html +++ b/accessible/tests/mochitest/attributes/test_obj.html @@ -109,6 +109,9 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=558036 // no object attributes testAbsentAttrs(getAccessible("listitem").firstChild, { "tag": "" }); + // experimental aria + testAttrs("experimental", {"blah" : "true"}, true); + SimpleTest.finish(); } @@ -142,6 +145,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=558036 title="Add test coverage for tablist as implicit live region"> Mozilla Bug 663136 + + Mozilla Bug 563862 +

@@ -201,5 +209,8 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=558036
   
  • item
+ + +
Fake beer
diff --git a/accessible/tests/mochitest/events/test_aria_objattr.html b/accessible/tests/mochitest/events/test_aria_objattr.html index 79bcc1df191..70c2f7c1fd1 100644 --- a/accessible/tests/mochitest/events/test_aria_objattr.html +++ b/accessible/tests/mochitest/events/test_aria_objattr.html @@ -21,7 +21,7 @@ */ var gQueue = null; - function hideNode(aID, bHide) + function updateAttribute(aID, aAttr, aValue) { this.node = getNode(aID); this.accessible = getAccessible(this.node); @@ -30,34 +30,14 @@ new invokerChecker(EVENT_OBJECT_ATTRIBUTE_CHANGED, this.accessible), ]; - this.invoke = function hideNode_invoke() + this.invoke = function updateAttribute_invoke() { - this.node.setAttribute("aria-hidden", bHide); + this.node.setAttribute(aAttr, aValue); } - this.getID = function hideNode_getID() + this.getID = function updateAttribute_getID() { - return "aria-hidden for " + aID + " " + bHide; - } - } - - function updateSort(aID, aSort) - { - this.node = getNode(aID); - this.accessible = getAccessible(this.node); - - this.eventSeq = [ - new invokerChecker(EVENT_OBJECT_ATTRIBUTE_CHANGED, this.accessible), - ]; - - this.invoke = function updateSort_invoke() - { - this.node.setAttribute("aria-sort", aSort); - } - - this.getID = function updateSort_getID() - { - return "aria-sort for " + aID + " " + aSort; + return aAttr + " for " + aID + " " + aValue; } } @@ -69,9 +49,12 @@ { gQueue = new eventQueue(); - gQueue.push(new hideNode("hideable", "true")); + gQueue.push(new updateAttribute("hideable", "aria-hidden", "true")); - gQueue.push(new updateSort("sortable", "ascending")); + gQueue.push(new updateAttribute("sortable", "aria-sort", "ascending")); + + // For experimental ARIA extensions + gQueue.push(new updateAttribute("custom", "aria-blah", "true")); gQueue.invoke(); // Will call SimpleTest.finish(); } @@ -95,6 +78,12 @@ Mozilla Bug 640707 + + Mozilla Bug 563862 + +

@@ -103,6 +92,8 @@
 
   
Hi
there
-
aria-sort
+
aria-sort
+ +
Fat free cheese
From beec31cabb99650bca75d5ca1ea517f767ed997a Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Tue, 24 Apr 2012 18:52:09 +0100 Subject: [PATCH 013/182] bug 747834 - fix genUnicodePropertyData tool following harfbuzz header changes. r=smontagu --- .../tools/genUnicodePropertyData.pl | 131 +++++++++++++++++- .../util/nsUnicodePropertyData.cpp | 4 +- intl/unicharutil/util/nsUnicodeScriptCodes.h | 2 +- 3 files changed, 131 insertions(+), 6 deletions(-) diff --git a/intl/unicharutil/tools/genUnicodePropertyData.pl b/intl/unicharutil/tools/genUnicodePropertyData.pl index 77d0bc99c46..a0c539a2155 100644 --- a/intl/unicharutil/tools/genUnicodePropertyData.pl +++ b/intl/unicharutil/tools/genUnicodePropertyData.pl @@ -105,9 +105,130 @@ __EOT # We therefore define a set of MOZ_SCRIPT_* constants that are script _codes_ # compatible with those libraries, and map these to HB_SCRIPT_* _tags_ as needed. +# CHECK that this matches Pango source (as found for example at +# http://git.gnome.org/browse/pango/tree/pango/pango-script.h) +# for as many codes as that defines (currently up through Unicode 5.1) +# and the GLib enumeration +# http://developer.gnome.org/glib/2.30/glib-Unicode-Manipulation.html#GUnicodeScript +# (currently defined up through Unicode 6.0). +# Constants beyond these may be regarded as unstable for now, but we don't actually +# depend on the specific values. +my %scriptCode = ( + INVALID => -1, + COMMON => 0, + INHERITED => 1, + ARABIC => 2, + ARMENIAN => 3, + BENGALI => 4, + BOPOMOFO => 5, + CHEROKEE => 6, + COPTIC => 7, + CYRILLIC => 8, + DESERET => 9, + DEVANAGARI => 10, + ETHIOPIC => 11, + GEORGIAN => 12, + GOTHIC => 13, + GREEK => 14, + GUJARATI => 15, + GURMUKHI => 16, + HAN => 17, + HANGUL => 18, + HEBREW => 19, + HIRAGANA => 20, + KANNADA => 21, + KATAKANA => 22, + KHMER => 23, + LAO => 24, + LATIN => 25, + MALAYALAM => 26, + MONGOLIAN => 27, + MYANMAR => 28, + OGHAM => 29, + OLD_ITALIC => 30, + ORIYA => 31, + RUNIC => 32, + SINHALA => 33, + SYRIAC => 34, + TAMIL => 35, + TELUGU => 36, + THAANA => 37, + THAI => 38, + TIBETAN => 39, + CANADIAN_ABORIGINAL => 40, + YI => 41, + TAGALOG => 42, + HANUNOO => 43, + BUHID => 44, + TAGBANWA => 45, +# unicode 4.0 additions + BRAILLE => 46, + CYPRIOT => 47, + LIMBU => 48, + OSMANYA => 49, + SHAVIAN => 50, + LINEAR_B => 51, + TAI_LE => 52, + UGARITIC => 53, +# unicode 4.1 additions + NEW_TAI_LUE => 54, + BUGINESE => 55, + GLAGOLITIC => 56, + TIFINAGH => 57, + SYLOTI_NAGRI => 58, + OLD_PERSIAN => 59, + KHAROSHTHI => 60, +# unicode 5.0 additions + UNKNOWN => 61, + BALINESE => 62, + CUNEIFORM => 63, + PHOENICIAN => 64, + PHAGS_PA => 65, + NKO => 66, +# unicode 5.1 additions + KAYAH_LI => 67, + LEPCHA => 68, + REJANG => 69, + SUNDANESE => 70, + SAURASHTRA => 71, + CHAM => 72, + OL_CHIKI => 73, + VAI => 74, + CARIAN => 75, + LYCIAN => 76, + LYDIAN => 77, +# unicode 5.2 additions + AVESTAN => 78, + BAMUM => 79, + EGYPTIAN_HIEROGLYPHS => 80, + IMPERIAL_ARAMAIC => 81, + INSCRIPTIONAL_PAHLAVI => 82, + INSCRIPTIONAL_PARTHIAN => 83, + JAVANESE => 84, + KAITHI => 85, + LISU => 86, + MEETEI_MAYEK => 87, + OLD_SOUTH_ARABIAN => 88, + OLD_TURKIC => 89, + SAMARITAN => 90, + TAI_THAM => 91, + TAI_VIET => 92, +# unicode 6.0 additions + BATAK => 93, + BRAHMI => 94, + MANDAIC => 95, +# unicode 6.1 additions + CHAKMA => 96, + MEROITIC_CURSIVE => 97, + MEROITIC_HIEROGLYPHS => 98, + MIAO => 99, + SHARADA => 100, + SORA_SOMPENG => 101, + TAKRI => 102 +); + my $sc = -1; my $cc = -1; -my %scriptCode; my %catCode; my @scriptCodeToTag; my @scriptCodeToName; @@ -115,9 +236,13 @@ my @scriptCodeToName; open FH, "< $ARGV[0]" or die "can't open $ARGV[0] (should be header file hb-common.h)\n"; while () { if (m/HB_SCRIPT_([A-Z_]+)\s*=\s*HB_TAG\s*\(('.','.','.','.')\)\s*,/) { - $scriptCodeToTag[++$sc] = $2; + unless (exists $scriptCode{$1}) { + warn "unknown script name $1 found in hb-common.h\n"; + next; + } + $sc = $scriptCode{$1}; + $scriptCodeToTag[$sc] = $2; $scriptCodeToName[$sc] = $1; - $scriptCode{$1} = $sc; } if (m/HB_UNICODE_GENERAL_CATEGORY_([A-Z_]+)/) { $cc++; diff --git a/intl/unicharutil/util/nsUnicodePropertyData.cpp b/intl/unicharutil/util/nsUnicodePropertyData.cpp index b785b55a843..757f7d40a37 100644 --- a/intl/unicharutil/util/nsUnicodePropertyData.cpp +++ b/intl/unicharutil/util/nsUnicodePropertyData.cpp @@ -41,7 +41,7 @@ * ***** END LICENSE BLOCK ***** */ /* - * Created on Mon Mar 5 08:11:49 2012 from UCD data files with version info: + * Created on Mon Apr 23 14:51:01 2012 from UCD data files with version info: * # Date: 2012-01-26, 22:03:00 GMT [KW] @@ -75,7 +75,7 @@ for the Unicode Character Database (UCD) for Unicode 6.1.0. */ #include "mozilla/StandardInteger.h" -#include "harfbuzz/hb.h" +#include "harfbuzz/hb-common.h" static const PRUint32 sScriptCodeToTag[] = { HB_TAG('Z','y','y','y'), diff --git a/intl/unicharutil/util/nsUnicodeScriptCodes.h b/intl/unicharutil/util/nsUnicodeScriptCodes.h index 3a2b514703d..169aefc1a4f 100644 --- a/intl/unicharutil/util/nsUnicodeScriptCodes.h +++ b/intl/unicharutil/util/nsUnicodeScriptCodes.h @@ -41,7 +41,7 @@ * ***** END LICENSE BLOCK ***** */ /* - * Created on Mon Mar 5 08:11:49 2012 from UCD data files with version info: + * Created on Mon Apr 23 14:51:01 2012 from UCD data files with version info: * # Date: 2012-01-26, 22:03:00 GMT [KW] From 9fb1a14a1e8bd03f74edbe09a421a880aa583bf7 Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Mon, 23 Apr 2012 07:20:11 -0700 Subject: [PATCH 014/182] bug 738101 - add support for more Unicode properties. r=smontagu --- .../tools/genUnicodePropertyData.pl | 268 ++- intl/unicharutil/util/nsUnicodeProperties.cpp | 154 +- intl/unicharutil/util/nsUnicodeProperties.h | 98 +- .../util/nsUnicodePropertyData.cpp | 1807 +++++++++++------ intl/unicharutil/util/nsUnicodeScriptCodes.h | 26 +- 5 files changed, 1528 insertions(+), 825 deletions(-) diff --git a/intl/unicharutil/tools/genUnicodePropertyData.pl b/intl/unicharutil/tools/genUnicodePropertyData.pl index a0c539a2155..c54aabc6349 100644 --- a/intl/unicharutil/tools/genUnicodePropertyData.pl +++ b/intl/unicharutil/tools/genUnicodePropertyData.pl @@ -54,9 +54,14 @@ # - BidiMirroring.txt # - HangulSyllableType.txt # - ReadMe.txt (to record version/date of the UCD) +# - Unihan_Variants.txt (from Unihan.zip) # though this may change if we find a need for additional properties. # -# The Unicode data files should be together in a single directory. +# The Unicode data files listed above should be together in one directory. +# We also require the file +# http://www.unicode.org/Public/security/latest/xidmodifications.txt +# This file should be in a sub-directory "security" immediately below the +# directory containing the other Unicode data files. # # (2) Run this tool using a command line of the form # @@ -74,6 +79,7 @@ # in the current directory. use strict; +use List::Util qw(first); if ($#ARGV != 1) { print <<__EOT; @@ -251,6 +257,41 @@ while () { } close FH; +my %xidmodCode = ( +'inclusion' => 0, +'recommended' => 1, +'default-ignorable' => 2, +'historic' => 3, +'limited-use' => 4, +'not-NFKC' => 5, +'not-xid' => 6, +'obsolete' => 7, +'technical' => 8, +'not-chars' => 9 +); + +my %bidicategoryCode = ( + "L" => "0", # Left-to-Right + "R" => "1", # Right-to-Left + "EN" => "2", # European Number + "ES" => "3", # European Number Separator + "ET" => "4", # European Number Terminator + "AN" => "5", # Arabic Number + "CS" => "6", # Common Number Separator + "B" => "7", # Paragraph Separator + "S" => "8", # Segment Separator + "WS" => "9", # Whitespace + "ON" => "10", # Other Neutrals + "LRE" => "11", # Left-to-Right Embedding + "LRO" => "12", # Left-to-Right Override + "AL" => "13", # Right-to-Left Arabic + "RLE" => "14", # Right-to-Left Embedding + "RLO" => "15", # Right-to-Left Override + "PDF" => "16", # Pop Directional Format + "NSM" => "17", # Non-Spacing Mark + "BN" => "18" # Boundary Neutral +); + # initialize default properties my @script; my @category; @@ -259,11 +300,27 @@ my @eaw; my @mirror; my @hangul; my @casemap; +my @xidmod; +my @numericvalue; +my @hanVariant; +my @bidicategory; for (my $i = 0; $i < 0x110000; ++$i) { $script[$i] = $scriptCode{"UNKNOWN"}; $category[$i] = $catCode{"UNASSIGNED"}; $combining[$i] = 0; $casemap[$i] = 0; + $xidmod[$i] = $xidmodCode{"not-chars"}; + $numericvalue[$i] = -1; + $hanVariant[$i] = 0; + $bidicategory[$i] = $bidicategoryCode{"L"}; +} + +# blocks where the default for bidi category is not L +for my $i (0x0600..0x07BF, 0x08A0..0x08FF, 0xFB50..0xFDCF, 0xFDF0..0xFDFF, 0xFE70..0xFEFF, 0x1EE00..0x0001EEFF) { + $bidicategory[$i] = $bidicategoryCode{"AL"}; +} +for my $i (0x0590..0x05FF, 0x07C0..0x089F, 0xFB1D..0xFB4F, 0x00010800..0x00010FFF, 0x0001E800..0x0001EDFF, 0x0001EF00..0x0001EFFF) { + $bidicategory[$i] = $bidicategoryCode{"R"}; } my %ucd2hb = ( @@ -328,6 +385,13 @@ while () { do { $category[$first] = $catCode{$ucd2hb{$fields[2]}}; $combining[$first] = $fields[3]; + $bidicategory[$first] = $bidicategoryCode{$fields[4]}; + unless (length($fields[7]) == 0) { + $numericvalue[$first] = $fields[7]; + } + if ($fields[1] =~ /CJK/) { + @hanVariant[$first] = 3; + } $first++; } while ($first <= $last); } else { @@ -358,6 +422,13 @@ while () { $casemap[$usv] |= $kLowerToUpper; $casemap[$usv] |= ($usv ^ $upper); } + $bidicategory[$usv] = $bidicategoryCode{$fields[4]}; + unless (length($fields[7]) == 0) { + $numericvalue[$usv] = $fields[7]; + } + if ($fields[1] =~ /CJK/) { + @hanVariant[$usv] = 3; + } } } close FH; @@ -416,8 +487,9 @@ while () { close FH; # read BidiMirroring.txt -my @distantMirrors = (); -my $smallMirrorOffset = 64; +my @offsets = (); +push @offsets, 0; + open FH, "< $ARGV[1]/BidiMirroring.txt" or die "can't open UCD file BidiMirroring.txt\n"; push @versionInfo, ""; while () { @@ -429,13 +501,13 @@ while () { s/#.*//; if (m/([0-9A-F]{4,6});\s*([0-9A-F]{4,6})/) { my $mirrorOffset = hex("0x$2") - hex("0x$1"); - if ($mirrorOffset < $smallMirrorOffset && $mirrorOffset >= -128) { - $mirror[hex "0x$1"] = $mirrorOffset; - } else { - die "too many distant mirror codes\n" if scalar @distantMirrors == 128 - $smallMirrorOffset; - $mirror[hex "0x$1"] = $smallMirrorOffset + scalar @distantMirrors; - push @distantMirrors, hex("0x$2"); + my $offsetIndex = first { $offsets[$_] eq $mirrorOffset } 0..$#offsets; + if ($offsetIndex == undef) { + die "too many offset codes\n" if scalar @offsets == 31; + push @offsets, $mirrorOffset; + $offsetIndex = $#offsets; } + $mirror[hex "0x$1"] = $offsetIndex; } } close FH; @@ -470,6 +542,66 @@ while () { } close FH; +# read xidmodifications.txt +open FH, "< $ARGV[1]/security/xidmodifications.txt" or die "can't open UCD file xidmodifications.txt\n"; +push @versionInfo, ""; +while () { + chomp; + unless (/\xef\xbb\xbf/) { + push @versionInfo, $_; + } + last if /Generated:/; +} +while () { + if (m/([0-9A-F]{4,6})(?:\.\.([0-9A-F]{4,6}))*\s+;\s+[^ ]+\s+;\s+([^ ]+)/) { + my $xidmod = $3; + warn "unknown Identifier Modification $xidmod" unless exists $xidmodCode{$xidmod}; + $xidmod = $xidmodCode{$xidmod}; + my $start = hex "0x$1"; + my $end = (defined $2) ? hex "0x$2" : $start; + for (my $i = $start; $i <= $end; ++$i) { + $xidmod[$i] = $xidmod; + } + } +} +close FH; + +open FH, "< $ARGV[1]/Unihan_Variants.txt" or die "can't open UCD file Unihan_Variants.txt (from Unihan.zip)\n"; +push @versionInfo, ""; +while () { + chomp; + push @versionInfo, $_; + last if /Date:/; +} +my $savedusv = 0; +my $hasTC = 0; +my $hasSC = 0; +while () { + chomp; + if (m/U\+([0-9A-F]{4,6})\s+k([^ ]+)Variant/) { + my $usv = hex "0x$1"; + if ($usv != $savedusv) { + unless ($savedusv == 0) { + if ($hasTC && !$hasSC) { + $hanVariant[$savedusv] = 1; + } elsif (!$hasTC && $hasSC) { + $hanVariant[$savedusv] = 2; + } + } + $savedusv = $usv; + $hasTC = 0; + $hasSC = 0; + } + if ($2 eq "Traditional") { + $hasTC = 1; + } + if ($2 eq "Simplified") { + $hasSC = 1; + } + } +} +close FH; + my $timestamp = gmtime(); open DATA_TABLES, "> nsUnicodePropertyData.cpp" or die "unable to open nsUnicodePropertyData.cpp for output"; @@ -532,10 +664,28 @@ $versionInfo */ #include "mozilla/StandardInteger.h" -#include "harfbuzz/hb-common.h" +#include "harfbuzz/hb.h" __END +open HEADER, "> nsUnicodeScriptCodes.h" or die "unable to open nsUnicodeScriptCodes.h for output"; + +print HEADER <<__END; +$licenseBlock +/* + * Created on $timestamp from UCD data files with version info: + * + +$versionInfo + + * + * * * * * This file contains MACHINE-GENERATED DATA, do not edit! * * * * * + */ + +#ifndef NS_UNICODE_SCRIPT_CODES +#define NS_UNICODE_SCRIPT_CODES +__END + print DATA_TABLES "static const PRUint32 sScriptCodeToTag[] = {\n"; for (my $i = 0; $i < scalar @scriptCodeToTag; ++$i) { printf DATA_TABLES " HB_TAG(%s)", $scriptCodeToTag[$i]; @@ -543,56 +693,54 @@ for (my $i = 0; $i < scalar @scriptCodeToTag; ++$i) { } print DATA_TABLES "};\n\n"; -sub sprintScript -{ - my $usv = shift; - return sprintf("%d,", $script[$usv]); -} -&genTables("Script", "PRUint8", 10, 6, \&sprintScript, 16); +our $totalData = 0; -sub sprintCC -{ - my $usv = shift; - return sprintf("%d,", $combining[$usv]); -} -&genTables("CClass", "PRUint8", 10, 6, \&sprintCC, 1); - -print DATA_TABLES "static const PRInt32 kSmallMirrorOffset = $smallMirrorOffset;\n"; -print DATA_TABLES "static const PRUint16 sDistantMirrors[] = {\n"; -for (my $i = 0; $i < scalar @distantMirrors; ++$i) { - printf DATA_TABLES " 0x%04X", $distantMirrors[$i]; - print DATA_TABLES $i < $#distantMirrors ? ",\n" : "\n"; +print DATA_TABLES "static const PRInt16 sMirrorOffsets[] = {\n"; +for (my $i = 0; $i < scalar @offsets; ++$i) { + printf DATA_TABLES " $offsets[$i]"; + print DATA_TABLES $i < $#offsets ? ",\n" : "\n"; } print DATA_TABLES "};\n\n"; -sub sprintMirror +sub sprintCharProps1 { my $usv = shift; - return sprintf("%d,", $mirror[$usv]); + return sprintf("{%d,%d,%d}, ", $mirror[$usv], $hangul[$usv], $combining[$usv]); } -&genTables("Mirror", "PRInt8", 9, 7, \&sprintMirror, 0); +&genTables("CharProp1", "struct nsCharProps1 {\n unsigned char mMirrorOffsetIndex:5;\n unsigned char mHangulType:3;\n unsigned char mCombiningClass:8;\n};", + "nsCharProps1", 11, 5, \&sprintCharProps1, 1, 2, 1); -sub sprintCatEAW +sub sprintCharProps2 { my $usv = shift; - return sprintf("{%d,%d},", $eaw[$usv], $category[$usv]); + return sprintf("{%d,%d,%d,%d,%d,%d},", + $script[$usv], $eaw[$usv], $category[$usv], + $bidicategory[$usv], $xidmod[$usv], $numericvalue[$usv]); } -&genTables("CatEAW", "struct {\n unsigned char mEAW:3;\n unsigned char mCategory:5;\n}", - 9, 7, \&sprintCatEAW, 16); +&genTables("CharProp2", "struct nsCharProps2 {\n unsigned char mScriptCode:8;\n unsigned char mEAW:3;\n unsigned char mCategory:5;\n unsigned char mBidiCategory:5;\n unsigned char mXidmod:4;\n signed char mNumericValue:5;\n unsigned char mHanVariant:2;\n};", + "nsCharProps2", 11, 5, \&sprintCharProps2, 16, 4, 1); -sub sprintHangulType +sub sprintHanVariants { - my $usv = shift; - return sprintf("%d,", $hangul[$usv]); + my $baseUsv = shift; + my $varShift = 0; + my $val = 0; + while ($varShift < 8) { + $val |= $hanVariant[$baseUsv++] << $varShift; + $varShift += 2; + } + return sprintf("0x%02x,", $val); } -&genTables("Hangul", "PRUint8", 10, 6, \&sprintHangulType, 0); +&genTables("HanVariant", "", "PRUint8", 9, 7, \&sprintHanVariants, 2, 1, 4); sub sprintCasemap { my $usv = shift; return sprintf("0x%08x,", $casemap[$usv]); } -&genTables("CaseMap", "PRUint32", 11, 5, \&sprintCasemap, 1); +&genTables("CaseMap", "", "PRUint32", 11, 5, \&sprintCasemap, 1, 4, 1); + +print STDERR "Total data = $totalData\n"; printf DATA_TABLES "const PRUint32 kTitleToUpper = 0x%08x;\n", $kTitleToUpper; printf DATA_TABLES "const PRUint32 kUpperToLower = 0x%08x;\n", $kUpperToLower; @@ -602,14 +750,14 @@ printf DATA_TABLES "const PRUint32 kCaseMapCharMask = 0x%08x;\n\n", $kCaseMapCha sub genTables { - my ($prefix, $type, $indexBits, $charBits, $func, $maxPlane) = @_; + my ($prefix, $typedef, $type, $indexBits, $charBits, $func, $maxPlane, $bytesPerEntry, $charsPerEntry) = @_; print DATA_TABLES "#define k${prefix}MaxPlane $maxPlane\n"; print DATA_TABLES "#define k${prefix}IndexBits $indexBits\n"; print DATA_TABLES "#define k${prefix}CharBits $charBits\n"; my $indexLen = 1 << $indexBits; - my $dataLen = 1 << $charBits; + my $charsPerPage = 1 << $charBits; my %charIndex = (); my %pageMapIndex = (); my @pageMap = (); @@ -620,8 +768,8 @@ sub genTables my $pageMap = "\x00" x $indexLen * 2; foreach my $page (0 .. $indexLen - 1) { my $charValues = ""; - foreach my $ch (0 .. $dataLen - 1) { - my $usv = $plane * 0x10000 + $page * $dataLen + $ch; + for (my $ch = 0; $ch < $charsPerPage; $ch += $charsPerEntry) { + my $usv = $plane * 0x10000 + $page * $charsPerPage + $ch; $charValues .= &$func($usv); } chop $charValues; @@ -659,7 +807,10 @@ sub genTables } print DATA_TABLES "};\n\n"; - print DATA_TABLES "static const $type s${prefix}Values[$chCount][$dataLen] = {\n"; + print HEADER "$typedef\n\n" if $typedef ne ''; + + my $pageLen = $charsPerPage / $charsPerEntry; + print DATA_TABLES "static const $type s${prefix}Values[$chCount][$pageLen] = {\n"; for (my $i = 0; $i < scalar @char; ++$i) { print DATA_TABLES " {"; print DATA_TABLES $char[$i]; @@ -667,9 +818,12 @@ sub genTables } print DATA_TABLES "};\n\n"; - print STDERR "Data for $prefix = ", $pmCount*$indexLen*$pmBits/8 + - $chCount*$dataLen*(($type =~ /32/) ? 4 : 1) + - $maxPlane, "\n"; + my $dataSize = $pmCount * $indexLen * $pmBits/8 + + $chCount * $pageLen * $bytesPerEntry + + $maxPlane; + $totalData += $dataSize; + + print STDERR "Data for $prefix = $dataSize\n"; } print DATA_TABLES <<__END; @@ -680,24 +834,6 @@ __END close DATA_TABLES; -open HEADER, "> nsUnicodeScriptCodes.h" or die "unable to open nsUnicodeScriptCodes.h for output"; - -print HEADER <<__END; -$licenseBlock -/* - * Created on $timestamp from UCD data files with version info: - * - -$versionInfo - - * - * * * * * This file contains MACHINE-GENERATED DATA, do not edit! * * * * * - */ - -#ifndef NS_UNICODE_SCRIPT_CODES -#define NS_UNICODE_SCRIPT_CODES -__END - print HEADER "enum {\n"; for (my $i = 0; $i < scalar @scriptCodeToName; ++$i) { print HEADER " MOZ_SCRIPT_", $scriptCodeToName[$i], " = ", $i, ",\n"; diff --git a/intl/unicharutil/util/nsUnicodeProperties.cpp b/intl/unicharutil/util/nsUnicodeProperties.cpp index ae744b43b68..3f40ea3723e 100644 --- a/intl/unicharutil/util/nsUnicodeProperties.cpp +++ b/intl/unicharutil/util/nsUnicodeProperties.cpp @@ -38,7 +38,6 @@ #define HB_DONT_DEFINE_STDINT 1 #include "nsUnicodeProperties.h" -#include "nsUnicodeScriptCodes.h" #include "nsUnicodePropertyData.cpp" #include "mozilla/Util.h" @@ -48,6 +47,53 @@ #define UNICODE_BMP_LIMIT 0x10000 #define UNICODE_LIMIT 0x110000 + +nsCharProps1 +GetCharProps1(PRUint32 aCh) +{ + if (aCh < UNICODE_BMP_LIMIT) { + return sCharProp1Values[sCharProp1Pages[0][aCh >> kCharProp1CharBits]] + [aCh & ((1 << kCharProp1CharBits) - 1)]; + } + if (aCh < (kCharProp1MaxPlane + 1) * 0x10000) { + return sCharProp1Values[sCharProp1Pages[sCharProp1Planes[(aCh >> 16) - 1]] + [(aCh & 0xffff) >> kCharProp1CharBits]] + [aCh & ((1 << kCharProp1CharBits) - 1)]; + } + + // Default values for unassigned + nsCharProps1 undefined = {0, // Index to mirrored char offsets + 0, // Hangul Syllable type + 0}; // Combining class + return undefined; +} + +nsCharProps2 +GetCharProps2(PRUint32 aCh) +{ + if (aCh < UNICODE_BMP_LIMIT) { + return sCharProp2Values[sCharProp2Pages[0][aCh >> kCharProp2CharBits]] + [aCh & ((1 << kCharProp2CharBits) - 1)]; + } + if (aCh < (kCharProp2MaxPlane + 1) * 0x10000) { + return sCharProp2Values[sCharProp2Pages[sCharProp2Planes[(aCh >> 16) - 1]] + [(aCh & 0xffff) >> kCharProp2CharBits]] + [aCh & ((1 << kCharProp2CharBits) - 1)]; + } + + NS_NOTREACHED("Getting CharProps for codepoint outside Unicode range"); + // Default values for unassigned + nsCharProps2 undefined = { + MOZ_SCRIPT_UNKNOWN, // Script code + 0, // East Asian Width + HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED, // General Category + eCharType_LeftToRight, // Bidi Category + mozilla::unicode::XIDMOD_NOT_CHARS, // Xidmod + -1 // Numeric Value + }; + return undefined; +} + namespace mozilla { namespace unicode { @@ -113,81 +159,7 @@ nsIUGenCategory::nsUGenCategory sDetailedToGeneralCategory[] = { PRUint32 GetMirroredChar(PRUint32 aCh) { - // all mirrored chars are in plane 0 - if (aCh < UNICODE_BMP_LIMIT) { - int v = sMirrorValues[sMirrorPages[0][aCh >> kMirrorCharBits]] - [aCh & ((1 << kMirrorCharBits) - 1)]; - // The mirror value is stored as either an offset (if less than - // kSmallMirrorOffset) from the input character code, or as - // an index into the sDistantMirrors list. This allows the - // mirrored codes to be stored as 8-bit values, as most of them - // are references to nearby character codes. - if (v < kSmallMirrorOffset) { - return aCh + v; - } - return sDistantMirrors[v - kSmallMirrorOffset]; - } - return aCh; -} - -PRUint8 -GetCombiningClass(PRUint32 aCh) -{ - if (aCh < UNICODE_BMP_LIMIT) { - return sCClassValues[sCClassPages[0][aCh >> kCClassCharBits]] - [aCh & ((1 << kCClassCharBits) - 1)]; - } - if (aCh < (kCClassMaxPlane + 1) * 0x10000) { - return sCClassValues[sCClassPages[sCClassPlanes[(aCh >> 16) - 1]] - [(aCh & 0xffff) >> kCClassCharBits]] - [aCh & ((1 << kCClassCharBits) - 1)]; - } - return 0; -} - -PRUint8 -GetGeneralCategory(PRUint32 aCh) -{ - if (aCh < UNICODE_BMP_LIMIT) { - return sCatEAWValues[sCatEAWPages[0][aCh >> kCatEAWCharBits]] - [aCh & ((1 << kCatEAWCharBits) - 1)].mCategory; - } - if (aCh < (kCatEAWMaxPlane + 1) * 0x10000) { - return sCatEAWValues[sCatEAWPages[sCatEAWPlanes[(aCh >> 16) - 1]] - [(aCh & 0xffff) >> kCatEAWCharBits]] - [aCh & ((1 << kCatEAWCharBits) - 1)].mCategory; - } - return PRUint8(HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED); -} - -PRUint8 -GetEastAsianWidth(PRUint32 aCh) -{ - if (aCh < UNICODE_BMP_LIMIT) { - return sCatEAWValues[sCatEAWPages[0][aCh >> kCatEAWCharBits]] - [aCh & ((1 << kCatEAWCharBits) - 1)].mEAW; - } - if (aCh < (kCatEAWMaxPlane + 1) * 0x10000) { - return sCatEAWValues[sCatEAWPages[sCatEAWPlanes[(aCh >> 16) - 1]] - [(aCh & 0xffff) >> kCatEAWCharBits]] - [aCh & ((1 << kCatEAWCharBits) - 1)].mEAW; - } - return 0; -} - -PRInt32 -GetScriptCode(PRUint32 aCh) -{ - if (aCh < UNICODE_BMP_LIMIT) { - return sScriptValues[sScriptPages[0][aCh >> kScriptCharBits]] - [aCh & ((1 << kScriptCharBits) - 1)]; - } - if (aCh < (kScriptMaxPlane + 1) * 0x10000) { - return sScriptValues[sScriptPages[sScriptPlanes[(aCh >> 16) - 1]] - [(aCh & 0xffff) >> kScriptCharBits]] - [aCh & ((1 << kScriptCharBits) - 1)]; - } - return MOZ_SCRIPT_UNKNOWN; + return aCh + sMirrorOffsets[GetCharProps1(aCh).mMirrorOffsetIndex]; } PRUint32 @@ -200,17 +172,6 @@ GetScriptTagForCode(PRInt32 aScriptCode) return sScriptCodeToTag[aScriptCode]; } -HSType -GetHangulSyllableType(PRUint32 aCh) -{ - // all Hangul chars are in plane 0 - if (aCh < UNICODE_BMP_LIMIT) { - return HSType(sHangulValues[sHangulPages[0][aCh >> kHangulCharBits]] - [aCh & ((1 << kHangulCharBits) - 1)]); - } - return HST_NONE; -} - static inline PRUint32 GetCaseMapValue(PRUint32 aCh) { @@ -275,6 +236,25 @@ GetTitlecaseForAll(PRUint32 aCh) return aCh; } +HanVariantType +GetHanVariant(PRUint32 aCh) +{ + // In the sHanVariantValues array, data for 4 successive characters + // (2 bits each) is packed in to each PRUint8 entry, with the value + // for the lowest character stored in the least significant bits. + PRUint8 v = 0; + if (aCh < UNICODE_BMP_LIMIT) { + v = sHanVariantValues[sHanVariantPages[0][aCh >> kHanVariantCharBits]] + [(aCh & ((1 << kHanVariantCharBits) - 1)) >> 2]; + } else if (aCh < (kHanVariantMaxPlane + 1) * 0x10000) { + v = sHanVariantValues[sHanVariantPages[sHanVariantPlanes[(aCh >> 16) - 1]] + [(aCh & 0xffff) >> kHanVariantCharBits]] + [(aCh & ((1 << kHanVariantCharBits) - 1)) >> 2]; + } + // extract the appropriate 2-bit field from the value + return HanVariantType((v >> ((aCh & 3) * 2)) & 3); +} + bool IsClusterExtender(PRUint32 aCh, PRUint8 aCategory) { diff --git a/intl/unicharutil/util/nsUnicodeProperties.h b/intl/unicharutil/util/nsUnicodeProperties.h index 80ac339fa3b..3f6aa6402ad 100644 --- a/intl/unicharutil/util/nsUnicodeProperties.h +++ b/intl/unicharutil/util/nsUnicodeProperties.h @@ -39,7 +39,12 @@ #define NS_UNICODEPROPERTIES_H #include "prtypes.h" +#include "nsBidiUtils.h" #include "nsIUGenCategory.h" +#include "nsUnicodeScriptCodes.h" + +nsCharProps1 GetCharProps1(PRUint32 aCh); +nsCharProps2 GetCharProps2(PRUint32 aCh); namespace mozilla { @@ -49,38 +54,93 @@ extern nsIUGenCategory::nsUGenCategory sDetailedToGeneralCategory[]; PRUint32 GetMirroredChar(PRUint32 aCh); -PRUint8 GetCombiningClass(PRUint32 aCh); +inline PRUint8 GetCombiningClass(PRUint32 aCh) { + return GetCharProps1(aCh).mCombiningClass; +} // returns the detailed General Category in terms of HB_UNICODE_* values -PRUint8 GetGeneralCategory(PRUint32 aCh); +inline PRUint8 GetGeneralCategory(PRUint32 aCh) { + return GetCharProps2(aCh).mCategory; +} // returns the simplified Gen Category as defined in nsIUGenCategory inline nsIUGenCategory::nsUGenCategory GetGenCategory(PRUint32 aCh) { return sDetailedToGeneralCategory[GetGeneralCategory(aCh)]; } -PRUint8 GetEastAsianWidth(PRUint32 aCh); +inline PRUint8 GetEastAsianWidth(PRUint32 aCh) { + return GetCharProps2(aCh).mEAW; +} -PRInt32 GetScriptCode(PRUint32 aCh); +inline PRUint8 GetScriptCode(PRUint32 aCh) { + return GetCharProps2(aCh).mScriptCode; +} PRUint32 GetScriptTagForCode(PRInt32 aScriptCode); +inline nsCharType GetBidiCat(PRUint32 aCh) { + return nsCharType(GetCharProps2(aCh).mBidiCategory); +} + +enum XidmodType { + XIDMOD_INCLUSION, + XIDMOD_RECOMMENDED, + XIDMOD_DEFAULT_IGNORABLE, + XIDMOD_HISTORIC, + XIDMOD_LIMITED_USE, + XIDMOD_NOT_NFKC, + XIDMOD_NOT_XID, + XIDMOD_OBSOLETE, + XIDMOD_TECHNICAL, + XIDMOD_NOT_CHARS +}; + +inline XidmodType GetIdentifierModification(PRUint32 aCh) { + return XidmodType(GetCharProps2(aCh).mXidmod); +} + +inline bool IsRestrictedForIdentifiers(PRUint32 aCh) { + XidmodType xm = GetIdentifierModification(aCh); + return (xm > XIDMOD_RECOMMENDED); +} + +/** + * Return the numeric value of the character. The value returned is the value + * of the Numeric_Value in field 7 of the UCD, or -1 if field 7 is empty. + * To restrict to decimal digits, the caller should also check whether + * GetGeneralCategory returns HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER + */ +inline PRInt8 GetNumericValue(PRUint32 aCh) { + return GetCharProps2(aCh).mNumericValue; +} + +enum HanVariantType { + HVT_NotHan = 0x0, + HVT_SimplifiedOnly = 0x1, + HVT_TraditionalOnly = 0x2, + HVT_AnyHan = 0x3 +}; + +HanVariantType GetHanVariant(PRUint32 aCh); + bool IsClusterExtender(PRUint32 aCh, PRUint8 aCategory); inline bool IsClusterExtender(PRUint32 aCh) { - return IsClusterExtender(aCh, GetGeneralCategory(aCh)); + return IsClusterExtender(aCh, GetGeneralCategory(aCh)); } enum HSType { - HST_NONE = 0x00, - HST_L = 0x01, - HST_V = 0x02, - HST_T = 0x04, - HST_LV = 0x03, - HST_LVT = 0x07 + HST_NONE = 0x00, + HST_L = 0x01, + HST_V = 0x02, + HST_T = 0x04, + HST_LV = 0x03, + HST_LVT = 0x07 }; -HSType GetHangulSyllableType(PRUint32 aCh); +inline HSType GetHangulSyllableType(PRUint32 aCh) { + return HSType(GetCharProps1(aCh).mHangulType); +} // Case mappings for the full Unicode range; // note that it may be worth testing for ASCII chars and taking @@ -91,13 +151,13 @@ PRUint32 GetTitlecaseForLower(PRUint32 aCh); // maps LC to titlecase, UC unchang PRUint32 GetTitlecaseForAll(PRUint32 aCh); // maps both UC and LC to titlecase enum ShapingType { - SHAPING_DEFAULT = 0x0001, - SHAPING_ARABIC = 0x0002, - SHAPING_HEBREW = 0x0004, - SHAPING_HANGUL = 0x0008, - SHAPING_MONGOLIAN = 0x0010, - SHAPING_INDIC = 0x0020, - SHAPING_THAI = 0x0040 + SHAPING_DEFAULT = 0x0001, + SHAPING_ARABIC = 0x0002, + SHAPING_HEBREW = 0x0004, + SHAPING_HANGUL = 0x0008, + SHAPING_MONGOLIAN = 0x0010, + SHAPING_INDIC = 0x0020, + SHAPING_THAI = 0x0040 }; PRInt32 ScriptShapingType(PRInt32 aScriptCode); diff --git a/intl/unicharutil/util/nsUnicodePropertyData.cpp b/intl/unicharutil/util/nsUnicodePropertyData.cpp index 757f7d40a37..695a2292379 100644 --- a/intl/unicharutil/util/nsUnicodePropertyData.cpp +++ b/intl/unicharutil/util/nsUnicodePropertyData.cpp @@ -41,7 +41,7 @@ * ***** END LICENSE BLOCK ***** */ /* - * Created on Mon Apr 23 14:51:01 2012 from UCD data files with version info: + * Created on Mon Apr 23 20:03:29 2012 from UCD data files with version info: * # Date: 2012-01-26, 22:03:00 GMT [KW] @@ -70,12 +70,20 @@ for the Unicode Character Database (UCD) for Unicode 6.1.0. # HangulSyllableType-6.1.0.txt # Date: 2011-08-25, 00:02:18 GMT [MD] +# File: xidmodifications.txt +# Version: 2.1 +# Generated: 2010-04-13, 01:33:09 GMT + +# +# Unihan_Variants.txt +# Date: 2011-08-08 22:10:53 GMT [JHJ] + * * * * * * This file contains MACHINE-GENERATED DATA, do not edit! * * * * * */ #include "mozilla/StandardInteger.h" -#include "harfbuzz/hb-common.h" +#include "harfbuzz/hb.h" static const PRUint32 sScriptCodeToTag[] = { HB_TAG('Z','y','y','y'), @@ -183,668 +191,1163 @@ static const PRUint32 sScriptCodeToTag[] = { HB_TAG('T','a','k','r') }; -#define kScriptMaxPlane 16 -#define kScriptIndexBits 10 -#define kScriptCharBits 6 -static const PRUint8 sScriptPlanes[16] = {1,2,3,3,3,3,3,3,3,3,3,3,3,4,3,3}; - -static const PRUint16 sScriptPages[5][1024] = { - {0,1,2,3,4,4,4,4,4,4,5,6,7,8,9,10,11,11,12,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,57,58,59,60,60,60,60,61,62,63,64,65,66,67,68,69,69,69,69,69,69,69,69,69,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,87,94,95,96,97,98,4,4,4,4,99,100,101,102,103,104,105,106,107,108,109,0,0,0,0,0,0,0,0,110,111,112,0,0,0,0,0,0,0,0,0,0,113,0,0,0,114,114,114,114,0,0,0,0,0,0,0,0,0,115,87,87,116,117,118,119,120,121,122,123,124,87,125,126,127,127,127,128,129,130,131,132,133,60,134,135,136,137,0,138,139,140,0,0,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,141,0,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,142,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,144,145,146,146,146,146,147,11,148,149,150,4,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,87,87,166,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,167,168,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,127,127,127,127,127,169,127,170,171,172,19,173,19,19,19,19,174,175,176,177,178,179,19,180,181,182,183,184}, - {185,186,187,188,189,190,191,192,87,87,193,194,195,196,197,198,199,200,201,87,87,87,87,87,87,87,87,87,87,87,87,87,202,203,87,87,204,87,205,87,206,207,87,87,208,209,87,87,210,211,87,87,87,87,87,87,87,212,87,87,87,87,87,87,213,214,215,216,217,218,219,220,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,221,222,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,223,223,223,223,223,223,223,223,223,223,223,223,223,224,87,87,223,225,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,227,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,228,228,228,228,228,228,228,228,229,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,230,231,232,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,233,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,0,0,0,234,235,236,237,238,190,239,87,87,0,240,87,87,0,241,242,243,244,245,0,0,0,0,246,0,0,0,0,247,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,248,249,250,251,87,87,87,87,252,0,253,254,255,252,256,257,258,259,87,87,260,261,262,263,264,265,0,266,267,268,87,269,0,270,0,271,0,110,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87}, - {127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,272,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,273,127,127,127,274,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,127,127,127,127,127,127,127,127,274,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87}, - {87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87}, - {275,0,87,87,7,7,7,276,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87} +static const PRInt16 sMirrorOffsets[] = { + 0, + 1, + -1, + 2, + -2, + 16, + -16, + 3, + -3, + 2016, + 138, + 1824, + 2104, + 2108, + 2106, + -138, + 8, + 7, + -8, + -7, + -1824, + -2016, + -2104, + -2106, + -2108 }; -static const PRUint8 sScriptValues[277][64] = { - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,0,0,0,0,0,0,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0}, - {25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,0,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,0,25,25,25,25,25,25,25,25}, - {25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25}, - {25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,25,25,0,0,0,0,0,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, - {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,14,14,14,14,0,14,14,14,61,61,14,14,14,14,0,61}, - {61,61,61,61,14,0,14,0,14,14,14,61,14,61,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,61,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14}, - {14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,7,7,7,7,7,7,7,7,7,7,7,7,7,7,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14}, - {8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8}, - {8,8,8,8,8,1,1,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8}, - {8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,61,61,61,61,61,61,61,61,61,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3}, - {3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,61,61,3,3,3,3,3,3,3,61,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3}, - {3,3,3,3,3,3,3,3,61,0,3,61,61,61,61,3,61,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19}, - {19,19,19,19,19,19,19,19,61,61,61,61,61,61,61,61,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,61,61,61,61,61,19,19,19,19,19,61,61,61,61,61,61,61,61,61,61,61}, - {2,2,2,2,2,61,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,61,61,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, - {0,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, - {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, - {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, - {34,34,34,34,34,34,34,34,34,34,34,34,34,34,61,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34}, - {34,34,34,34,34,34,34,34,34,34,34,61,61,34,34,34,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, - {37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,61,61,61,61,61}, - {90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,61,61,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,61}, - {95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,61,61,95,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,2,61,2,2,2,2,2,2,2,2,2,2,2,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61}, - {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10}, - {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,61,10,10,10,10,10,10,10}, - {61,4,4,4,61,4,4,4,4,4,4,4,4,61,61,4,4,61,61,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,61,4,4,4,4,4,4,4,61,4,61,61,61,4,4,4,4,61,61,4,4,4,4}, - {4,4,4,4,4,61,61,4,4,61,61,4,4,4,4,61,61,61,61,61,61,61,61,4,61,61,61,61,4,4,61,4,4,4,4,4,61,61,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,61,61,61,61}, - {61,16,16,16,61,16,16,16,16,16,16,61,61,61,61,16,16,61,61,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,61,16,16,16,16,16,16,16,61,16,16,61,16,16,61,16,16,61,61,16,61,16,16}, - {16,16,16,61,61,61,61,16,16,61,61,16,16,16,61,61,61,16,61,61,61,61,61,61,61,16,16,16,16,61,16,61,61,61,61,61,61,61,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,61,61,61,61,61,61,61,61,61,61}, - {61,15,15,15,61,15,15,15,15,15,15,15,15,15,61,15,15,15,61,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,61,15,15,15,15,15,15,15,61,15,15,61,15,15,15,15,15,61,61,15,15,15,15}, - {15,15,15,15,15,15,61,15,15,15,61,15,15,15,61,61,15,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,15,15,15,15,61,61,15,15,15,15,15,15,15,15,15,15,15,15,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {61,31,31,31,61,31,31,31,31,31,31,31,31,61,61,31,31,61,61,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,61,31,31,31,31,31,31,31,61,31,31,61,31,31,31,31,31,61,61,31,31,31,31}, - {31,31,31,31,31,61,61,31,31,61,61,31,31,31,61,61,61,61,61,61,61,61,31,31,61,61,61,61,31,31,61,31,31,31,31,31,61,61,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,61,61,61,61,61,61,61,61}, - {61,61,35,35,61,35,35,35,35,35,35,61,61,61,35,35,35,61,35,35,35,35,61,61,61,35,35,61,35,61,35,35,61,61,61,35,35,61,61,61,35,35,35,61,61,61,35,35,35,35,35,35,35,35,35,35,35,35,61,61,61,61,35,35}, - {35,35,35,61,61,61,35,35,35,61,35,35,35,35,61,61,35,61,61,61,61,61,61,35,61,61,61,61,61,61,61,61,61,61,61,61,61,61,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,61,61,61,61,61}, - {61,36,36,36,61,36,36,36,36,36,36,36,36,61,36,36,36,61,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,61,36,36,36,36,36,36,36,36,36,36,61,36,36,36,36,36,61,61,61,36,36,36}, - {36,36,36,36,36,61,36,36,36,61,36,36,36,36,61,61,61,61,61,61,61,36,36,61,36,36,61,61,61,61,61,61,36,36,36,36,61,61,36,36,36,36,36,36,36,36,36,36,61,61,61,61,61,61,61,61,36,36,36,36,36,36,36,36}, - {61,61,21,21,61,21,21,21,21,21,21,21,21,61,21,21,21,61,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,61,21,21,21,21,21,21,21,21,21,21,61,21,21,21,21,21,61,61,21,21,21,21}, - {21,21,21,21,21,61,21,21,21,61,21,21,21,21,61,61,61,61,61,61,61,21,21,61,61,61,61,61,61,61,21,61,21,21,21,21,61,61,21,21,21,21,21,21,21,21,21,21,61,21,21,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {61,61,26,26,61,26,26,26,26,26,26,26,26,61,26,26,26,61,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,61,61,26,26,26}, - {26,26,26,26,26,61,26,26,26,61,26,26,26,26,26,61,61,61,61,61,61,61,61,26,61,61,61,61,61,61,61,61,26,26,26,26,61,61,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,61,61,61,26,26,26,26,26,26,26}, - {61,61,33,33,61,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,61,61,61,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,61,33,33,33,33,33,33,33,33,33,61,33,61,61}, - {33,33,33,33,33,33,33,61,61,61,33,61,61,61,61,33,33,33,33,33,33,61,33,61,33,33,33,33,33,33,33,33,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,33,33,33,61,61,61,61,61,61,61,61,61,61,61}, - {61,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,61,61,61,61,0}, - {38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {61,24,24,61,24,61,61,24,24,61,24,61,61,24,61,61,61,61,61,61,24,24,24,24,61,24,24,24,24,24,24,24,61,24,24,24,61,24,61,24,61,61,24,24,61,24,24,24,24,24,24,24,24,24,24,24,24,24,61,24,24,24,61,61}, - {24,24,24,24,24,61,24,61,24,24,24,24,24,24,61,61,24,24,24,24,24,24,24,24,24,24,61,61,24,24,24,24,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39}, - {39,39,39,39,39,39,39,39,61,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,61,61,61,61,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39}, - {39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,61,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,61,39,39}, - {39,39,39,39,39,39,39,39,39,39,39,39,39,61,39,39,39,39,39,39,39,0,0,0,0,39,39,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28}, - {28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12}, - {12,12,12,12,12,12,61,12,61,61,61,61,61,12,61,61,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,12,12,12,12}, - {18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18}, - {11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11}, - {11,11,11,11,11,11,11,11,11,61,11,11,11,11,61,61,11,11,11,11,11,11,11,61,11,61,11,11,11,11,61,61,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11}, - {11,11,11,11,11,11,11,11,11,61,11,11,11,11,61,61,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,61,11,11,11,11,61,61,11,11,11,11,11,11,11,61}, - {11,61,11,11,11,11,61,61,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11}, - {11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,61,11,11,11,11,61,61,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11}, - {11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,61,61,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,61,61,61}, - {11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,61,61,61,61,61,61,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6}, - {6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,61,61,61,61,61,61,61,61,61,61,61}, - {40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40}, - {29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,61,61,61,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32}, - {32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,0,0,32,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {42,42,42,42,42,42,42,42,42,42,42,42,42,61,42,42,42,42,42,42,42,61,61,61,61,61,61,61,61,61,61,61,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,0,61,61,61,61,61,61,61,61,61}, - {44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,61,61,61,61,61,61,61,61,61,61,61,61,45,45,45,45,45,45,45,45,45,45,45,45,45,61,45,45,45,61,45,45,61,61,61,61,61,61,61,61,61,61,61,61}, - {23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23}, - {23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,61,61,23,23,23,23,23,23,23,23,23,23,61,61,61,61,61,61,23,23,23,23,23,23,23,23,23,23,61,61,61,61,61,61}, - {27,27,0,0,27,0,27,27,27,27,27,27,27,27,27,61,27,27,27,27,27,27,27,27,27,27,61,61,61,61,61,61,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27}, - {27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,61,61,61,61,61,61,61,61}, - {27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,61,61,61,61,61,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40}, - {40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,61,61,61,61,61,61,61,61,61,61}, - {48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,61,61,61,48,48,48,48,48,48,48,48,48,48,48,48,61,61,61,61,48,48,48,48,48,48,48,48,48,48,48,48,61,61,61,61}, - {48,61,61,61,48,48,48,48,48,48,48,48,48,48,48,48,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,61,61,52,52,52,52,52,61,61,61,61,61,61,61,61,61,61,61}, - {54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,61,61,61,61,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54}, - {54,54,54,54,54,54,54,54,54,54,61,61,61,61,61,61,54,54,54,54,54,54,54,54,54,54,54,61,61,61,54,54,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23}, - {55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,61,61,55,55,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91}, - {91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,61,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,61,61,91}, - {91,91,91,91,91,91,91,91,91,91,61,61,61,61,61,61,91,91,91,91,91,91,91,91,91,91,61,61,61,61,61,61,91,91,91,91,91,91,91,91,91,91,91,91,91,91,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62}, - {62,62,62,62,62,62,62,62,62,62,62,62,61,61,61,61,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,61,61,61}, - {70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70}, - {93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,61,61,61,61,61,61,61,61,93,93,93,93}, - {68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,61,61,61,68,68,68,68,68}, - {68,68,68,68,68,68,68,68,68,68,61,61,61,68,68,68,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73}, - {70,70,70,70,70,70,70,70,61,61,61,61,61,61,61,61,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,61,61,61,61,61,61,61,61,61}, - {25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,14,14,14,14,14,8,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25}, - {25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,14,14,14,14,14,25,25,25,25,14,14,14,14,14,25,25,25,25,25,25,25,25,25,25,25,25,25,8,25,25,25,25,25,25,25}, - {25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,14}, - {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,1,1,1,1}, - {14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,61,61,14,14,14,14,14,14,61,61,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14}, - {14,14,14,14,14,14,61,61,14,14,14,14,14,14,61,61,14,14,14,14,14,14,14,14,61,14,61,14,61,14,61,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,61,61}, - {14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,61,14,14,14,14,14,14,14,14,14,14}, - {14,14,14,14,14,61,14,14,14,14,14,14,14,14,14,14,14,14,14,14,61,61,14,14,14,14,14,14,61,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,61,61,14,14,14,61,14,14,14,14,14,14,14,14,14,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,0,0,0,0,0,0,0,25,61,61,0,0,0,0,0,0,0,0,0,0,0,25}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,25,25,25,25,25,25,25,25,25,25,25,25,25,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61}, - {61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,25,25,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25}, - {25,25,25,25,25,25,25,25,25,0,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,61,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56}, - {56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,61,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25}, - {7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7}, - {7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,61,61,61,61,61,7,7,7,7,7,7,7}, - {12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,61,12,61,61,61,61,61,12,61,61,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57}, - {57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,61,61,61,61,61,61,61,57,57,61,61,61,61,61,61,61,61,61,61,61,61,61,61,57}, - {11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,61,61,61,61,61,61,61,61,61,11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61}, - {11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61}, - {17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,61,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17}, - {17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,61,61,61,61,61,61,61,61,61,61,61,61}, - {17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17}, - {17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61}, - {0,0,0,0,0,17,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,17,17,17,17,17,17,17,17,1,1,1,1,18,18,0,0,0,0,0,0,0,0,17,17,17,17,0,0,0,0}, - {61,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20}, - {20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,61,61,1,1,0,0,20,20,20,0,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22}, - {22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,0,0,22,22,22}, - {61,61,61,61,61,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,61,61,61,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18}, - {18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22}, - {18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,61}, - {22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22}, - {22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,61,61,61,61,61,61,61,61,61,61}, - {17,17,17,17,17,17,17,17,17,17,17,17,17,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41}, - {41,41,41,41,41,41,41,41,41,41,41,41,41,61,61,61,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41}, - {41,41,41,41,41,41,41,61,61,61,61,61,61,61,61,61,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86}, - {74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74}, - {74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,61,61,61,61,61,61,61,8,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79}, - {79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,61,61,61,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25}, - {25,25,25,25,25,25,25,25,0,0,0,25,25,25,25,61,25,25,25,25,61,61,61,61,61,61,61,61,61,61,61,61,25,25,25,25,25,25,25,25,25,25,25,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,25,25,25,25,25,25,25,25}, - {58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,61,61,61,61,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61}, - {65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,61,61,61,61,61,61,61,61}, - {71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71}, - {71,71,71,71,71,61,61,61,61,61,61,61,61,61,71,71,71,71,71,71,71,71,71,71,71,71,61,61,61,61,61,61,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,61,61,61,61}, - {67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69}, - {69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,61,61,61,61,61,61,61,61,61,61,61,69,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,61,61,61}, - {84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84}, - {84,84,84,84,84,84,84,84,84,84,84,84,84,84,61,84,84,84,84,84,84,84,84,84,84,84,61,61,61,61,84,84,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,61,61,61,61,61,61,61,61,61}, - {72,72,72,72,72,72,72,72,72,72,72,72,72,72,61,61,72,72,72,72,72,72,72,72,72,72,61,61,72,72,72,72,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,61,61,61,61}, - {92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92}, - {92,92,92,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,92,92,92,92,92,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,61,61,61,61,61,61,61,61,61}, - {61,11,11,11,11,11,11,61,61,11,11,11,11,11,11,61,61,11,11,11,11,11,11,61,61,61,61,61,61,61,61,61,11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,61,61,87,87,87,87,87,87,87,87,87,87,61,61,61,61,61,61}, - {18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,61,61,61,61,61,61,61,61,61,61,61,61,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18}, - {18,18,18,18,18,18,18,61,61,61,61,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,61,61,61,61}, - {17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,61,61,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17}, - {17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {25,25,25,25,25,25,25,61,61,61,61,61,61,61,61,61,61,61,61,3,3,3,3,3,61,61,61,61,61,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,61,19,19,19,19,19,61,19,61}, - {19,19,61,19,19,61,19,19,19,19,19,19,19,19,19,19,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, - {2,2,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, - {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0}, - {61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, - {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, - {2,2,2,2,2,2,2,2,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,2,2,2,2,2,2,2,2,2,2,2,2,2,0,61,61}, - {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,1,1,1,1,1,1,1,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,61,61,61,61,2,2,2,2,2,61,2,2,2,2,2,2,2,2,2,2}, - {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61,61,0}, - {61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,0,0,0,0,0}, - {0,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,0,0,0,0,0,0,0,0,0,0,0,22,22,22,22,22,22,22,22,22,22,0,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22}, - {22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,0,0,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,61}, - {61,61,18,18,18,18,18,18,61,61,18,18,18,18,18,18,61,61,18,18,18,18,18,18,61,61,18,18,18,61,61,61,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,61,61}, - {51,51,51,51,51,51,51,51,51,51,51,51,61,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,61,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,61,51,51,61,51}, - {51,51,51,51,51,51,51,51,51,51,51,51,51,51,61,61,51,51,51,51,51,51,51,51,51,51,51,51,51,51,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51}, - {51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,61,61,61,61,61}, - {0,0,0,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,0,0,0,0,0,0,0,0,0}, - {14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14}, - {14,14,14,14,14,14,14,14,14,14,14,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,61,61}, - {76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,61,61,61,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75}, - {75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,61,30,30,30,30,61,61,61,61,61,61,61,61,61,61,61,61,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13}, - {13,13,13,13,13,13,13,13,13,13,13,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,61,53,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59}, - {59,59,59,59,61,61,61,61,59,59,59,59,59,59,59,59,59,59,59,59,59,59,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}, - {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50}, - {49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,61,61,49,49,49,49,49,49,49,49,49,49,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {47,47,47,47,47,47,61,61,47,61,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,61,47,47,61,61,61,47,61,61,47}, - {81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,61,81,81,81,81,81,81,81,81,81,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,61,61,61,64,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,61,61,61,61,61,77}, - {98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,61,61,61,61,61,61,97,97}, - {60,60,60,60,61,60,60,61,61,61,61,61,60,60,60,60,60,60,60,60,61,60,60,60,61,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,61,61,61,61,60,60,60,61,61,61,61,60}, - {60,60,60,60,60,60,60,60,61,61,61,61,61,61,61,61,60,60,60,60,60,60,60,60,60,61,61,61,61,61,61,61,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88}, - {78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,61,61,61,78,78,78,78,78,78,78}, - {83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,61,61,83,83,83,83,83,83,83,83,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,61,61,61,61,61,82,82,82,82,82,82,82,82}, - {89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89}, - {89,89,89,89,89,89,89,89,89,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61}, - {94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94}, - {94,94,94,94,94,94,94,94,94,94,94,94,94,94,61,61,61,61,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85}, - {85,85,61,61,61,61,61,61,61,61,61,61,61,61,61,61,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,61,61,61,61,61,61,61,101,101,101,101,101,101,101,101,101,101,61,61,61,61,61,61}, - {96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,61,96,96,96,96,96,96,96,96,96,96}, - {96,96,96,96,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100}, - {100,100,100,100,100,100,100,100,100,61,61,61,61,61,61,61,100,100,100,100,100,100,100,100,100,100,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,61,61,61,61,61,61,61,61}, - {102,102,102,102,102,102,102,102,102,102,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63}, - {63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,61,61,61,61,61,61,61,61,61,61,61,61,61,63,63,63,63,61,61,61,61,61,61,61,61,61,61,61,61}, - {80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80}, - {80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79}, - {79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,61,61,61,61,61,61,61}, - {99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99}, - {99,99,99,99,99,61,61,61,61,61,61,61,61,61,61,61,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,61}, - {61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {22,20,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1}, - {1,1,1,0,0,1,1,1,1,1,1,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,1,1,1,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,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {14,14,14,14,14,14,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,61,61,0,61,61,0,0,61,61,0,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,61,0,61,0,0,0}, - {0,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,61,0,0,0,0,61,61,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,61}, - {0,0,0,0,0,61,0,61,61,61,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,2,2,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61,2,2,61,2,61,61,2,61,2,2,2,2,2,2,2,2,2,2,61,2,2,2,2,61,2,61,2,61,61,61,61}, - {61,61,2,61,61,61,61,2,61,2,61,2,61,2,2,2,61,2,2,61,2,61,61,2,61,2,61,2,61,2,61,2,61,2,2,61,2,61,61,2,2,2,2,61,2,2,2,2,2,2,2,61,2,2,2,2,61,2,2,2,2,61,2,61}, - {2,2,2,2,2,2,2,2,2,2,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61,61,61,61,61,2,2,2,61,2,2,2,2,2,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61,61,61,61}, - {61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,2,2,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61}, - {61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {20,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,61,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61}, - {0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,61,61,61}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61}, - {0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0}, - {0,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,61,61,61,61,61,61,61,61,61,61,61}, - {17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61}, - {61,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61} +#define kCharProp1MaxPlane 1 +#define kCharProp1IndexBits 11 +#define kCharProp1CharBits 5 +static const PRUint8 sCharProp1Planes[1] = {1}; + +static const PRUint8 sCharProp1Pages[2][2048] = { + {0,1,2,2,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,5,6,7,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,9,10,11,0,12,0,13,14,0,0,15,16,17,18,19,0,0,0,0,20,21,22,23,0,0,0,0,24,0,25,26,0,0,25,27,0,0,25,27,0,0,25,27,0,0,25,27,0,0,0,27,0,0,0,28,0,0,25,27,0,0,0,27,0,0,0,29,0,0,30,31,0,0,32,33,0,34,35,0,36,37,0,38,0,0,39,0,0,40,0,0,0,41,41,41,42,42,43,44,44,0,0,0,0,0,0,0,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,47,47,0,0,0,0,48,0,0,0,0,0,0,49,0,0,0,50,0,0,0,0,0,0,51,0,0,52,0,0,0,0,0,53,54,55,0,56,0,57,0,58,0,0,0,0,59,60,0,0,0,0,0,0,61,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,64,65,66,0,67,68,0,0,0,0,0,0,0,0,69,70,71,72,73,74,75,76,77,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,0,0,80,81,0,0,0,0,0,0,0,0,0,0,0,0,82,83,84,85,0,86,0,87,88,89,90,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,92,0,0,0,93,0,0,0,94,95,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,98,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,101,0,0,102,0,0,0,0,0,0,0,0,103,0,0,0,0,0,54,104,0,105,106,107,0,108,109,0,0,0,0,0,0,110,111,112,0,0,0,0,0,0,0,27,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,119,113,114,115,116,117,118,120,121,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,125,126,0,0,0,0,1,2,127,128,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130,131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,0,0,132,0,0,133,134,0,0,0,0,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,137,138,0,0,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} }; -#define kCClassMaxPlane 1 -#define kCClassIndexBits 10 -#define kCClassCharBits 6 -static const PRUint8 sCClassPlanes[1] = {1}; - -static const PRUint8 sCClassPages[2][1024] = { - {0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,3,0,0,0,4,5,6,7,0,8,9,10,0,11,12,13,0,14,15,16,15,17,15,17,15,17,15,17,0,17,0,18,15,17,0,17,0,19,20,21,22,23,24,25,26,27,28,0,29,0,0,0,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,32,0,0,33,0,34,0,0,0,35,36,0,0,37,38,39,40,41,0,0,42,0,0,0,43,0,0,0,0,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,0,46,0,47,0,0,0,0,0,0,0,0,48,0,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,51,52,0,0,0,0,53,0,0,54,55,56,57,58,0,0,59,60,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,63,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,66,0,67,0,0,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,70,0,0,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} +static const nsCharProps1 sCharProp1Values[140][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,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{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}, {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}, {3,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,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {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}, {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,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {5,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {6,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,232}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,232}, {0,0,216}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220},}, + {{0,0,220}, {0,0,202}, {0,0,202}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,202}, {0,0,202}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,230},}, + {{0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,240}, {0,0,230}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,220}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,230}, {0,0,232}, {0,0,220}, {0,0,220}, {0,0,230}, {0,0,233}, {0,0,234}, {0,0,234}, {0,0,233},}, + {{0,0,234}, {0,0,234}, {0,0,233}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,222}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230},}, + {{0,0,230}, {0,0,230}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,222}, {0,0,228}, {0,0,230}, {0,0,10}, {0,0,11}, {0,0,12}, {0,0,13}, {0,0,14}, {0,0,15}, {0,0,16}, {0,0,17}, {0,0,18}, {0,0,19}, {0,0,19}, {0,0,20}, {0,0,21}, {0,0,22}, {0,0,0}, {0,0,23},}, + {{0,0,0}, {0,0,24}, {0,0,25}, {0,0,0}, {0,0,230}, {0,0,220}, {0,0,0}, {0,0,18}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,30}, {0,0,31}, {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,0}, {0,0,27}, {0,0,28}, {0,0,29}, {0,0,30}, {0,0,31}, {0,0,32}, {0,0,33}, {0,0,34}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,220},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,35}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,230},}, + {{0,0,230}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,36}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,230}, {0,0,220}, {0,0,220}, {0,0,230}, {0,0,220}, {0,0,230},}, + {{0,0,230}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230},}, + {{0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,27}, {0,0,28}, {0,0,29}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,7}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,84}, {0,0,91}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,103}, {0,0,103}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,107}, {0,0,107}, {0,0,107}, {0,0,107}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,118}, {0,0,118}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,122}, {0,0,122}, {0,0,122}, {0,0,122}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,220}, {0,0,220}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,220}, {0,0,0}, {0,0,220}, {0,0,0}, {0,0,216}, {1,0,0}, {2,0,0}, {1,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}, {0,0,129}, {0,0,130}, {0,0,0}, {0,0,132}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,130}, {0,0,130}, {0,0,130}, {0,0,130}, {0,0,0}, {0,0,0},}, + {{0,0,130}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,9}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,220}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,7}, {0,0,0}, {0,0,9}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,220}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,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,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0},}, + {{0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0},}, + {{0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0},}, + {{0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,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}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {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}, {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}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,228}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,222}, {0,0,230}, {0,0,220}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,220}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,220},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,7}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,7}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,7}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,1}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220},}, + {{0,0,230}, {0,0,0}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,220}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,230}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,230}, {0,0,234}, {0,0,214}, {0,0,220}, {0,0,202}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230},}, + {{0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,233}, {0,0,220}, {0,0,230}, {0,0,220},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {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}, {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}, {1,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}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {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}, {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}, {1,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}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,1}, {0,0,1}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,1}, {0,0,1}, {0,0,230}, {0,0,220}, {0,0,230}, {0,0,1}, {0,0,1}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {7,0,0}, {7,0,0}, {7,0,0}, {8,0,0}, {8,0,0}, {8,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {9,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {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}, {2,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {10,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {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}, {2,0,0}, {1,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}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0},}, + {{1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {11,0,0}, {0,0,0}, {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}, {2,0,0}, {0,0,0}, {0,0,0}, {12,0,0}, {0,0,0}, {13,0,0}, {14,0,0}, {0,0,0}, {14,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,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}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {15,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0},}, + {{1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {16,0,0}, {16,0,0}, {16,0,0}, {0,0,0}, {17,0,0}, {17,0,0}, {0,0,0}, {0,0,0}, {18,0,0}, {18,0,0}, {18,0,0}, {19,0,0}, {19,0,0}, {0,0,0},}, + {{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}, {2,0,0}, {1,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}, {0,0,0},}, + {{0,0,0}, {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}, {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}, {0,0,0}, {0,0,0},}, + {{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}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,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}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {3,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}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,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}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {7,0,0}, {1,0,0}, {2,0,0}, {8,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,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}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {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},}, + {{1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {1,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}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {1,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}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {21,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {1,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}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,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}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {1,0,0},}, + {{2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0},}, + {{2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,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}, {22,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {23,0,0}, {24,0,0}, {23,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,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}, {1,0,0}, {2,0,0}, {1,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}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9},}, + {{0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230},}, + {{0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {1,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}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0},}, + {{1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,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}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{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}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0}, {0,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {1,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,218}, {0,0,228}, {0,0,232}, {0,0,222}, {0,0,224}, {0,0,224}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,8}, {0,0,8}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,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,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,7}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230},}, + {{0,0,0}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,0}, {0,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,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,3,0}, {0,7,0}, {0,7,0}, {0,7,0},}, + {{0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,3,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0},}, + {{0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,3,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0},}, + {{0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,3,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0},}, + {{0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,3,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0},}, + {{0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,3,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0},}, + {{0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,3,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,7,0},}, + {{0,7,0}, {0,7,0}, {0,7,0}, {0,7,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,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,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0},}, + {{0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,2,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0},}, + {{0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,0}, {0,4,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}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,26}, {0,0,0},}, + {{0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {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}, {2,0,0}, {1,0,0}, {2,0,0}, {1,0,0}, {2,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {1,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}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {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}, {4,0,0}, {0,0,0}, {1,0,0},}, + {{2,0,0}, {0,0,0}, {1,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}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,220}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,220}, {0,0,0}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,1}, {0,0,220}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,7}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,9}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,9}, {0,0,7}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,216}, {0,0,216}, {0,0,1}, {0,0,1}, {0,0,1}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,226}, {0,0,216}, {0,0,216}, {0,0,216}, {0,0,216}, {0,0,216}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220}, {0,0,220},}, + {{0,0,220}, {0,0,220}, {0,0,220}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,220}, {0,0,220}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},}, + {{0,0,0}, {0,0,0}, {0,0,230}, {0,0,230}, {0,0,230}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},} }; -static const PRUint8 sCClassValues[72][64] = { - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220,220,220,220,220,220,220,220,220,1,1,1,1,1,220,220,220,220,230,230,230}, - {230,230,230,230,230,240,230,220,220,220,230,230,230,220,220,0,230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233,234,234,233,230,230,230,230,230,230,230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,220,230,230,230,230,220,230,230,230,222,220,230,230,230,230,230,230,220,220,220,220,220,220,230,230,220,230,230,222,228,230,10,11,12,13,14,15,16,17,18,19,19,20,21,22,0,23}, - {0,24,25,0,230,220,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,230,230,230,30,31,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,0,27,28,29,30,31,32,33,34,230,230,220,220,230,230,230,230,230,220,230,230,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,230,230,0,0,230,230,230,230,220,230,0,0,230,230,0,220,230,230,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,220,230,230,220,230,230,220,220,220,230,220,220,230,220,230}, - {230,230,220,230,220,230,220,230,220,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,230,230,220,230,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,0,230,230,230,230,230,230,230,230,230,0,230,230,230,0,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,220,220,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,220,230,230,220,230,230,230,220,220,220,27,28,29,230,230,230,220,230,230,220,220,230,230,230,230,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,230,220,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,84,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,103,9,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,107,107,107,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,118,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,122,122,122,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,220,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,220,0,220,0,216,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,130,0,132,0,0,0,0,0,130,130,130,130,0,0}, - {130,0,230,230,9,0,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,9,9,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,222,230,220,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,230,230,230,0,0,220}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,220,230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,0,1,220,220,220,220,220,230,230,220,220,220,220,230,0,1,1,1,1,1,1,1,0,0,0,0,220,0,0,0,0,0,0,230,0,0,0,0,0,0,0,0,0,0,0}, - {230,230,220,230,230,230,230,230,230,230,220,230,230,234,214,220,202,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,220,230,220}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,1,1,230,230,230,230,1,1,1,230,230,0,0,0,0,230,0,0,0,1,1,230,220,230,1,1,220,220,220,220,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,218,228,232,222,224,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,0,0,0,0,230,230,230,230,230,230,230,230,230,230,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,220,220,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0}, - {9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,0,230,230,220,0,0,230,230,0,0,0,0,0,230,230}, - {0,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,220,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,220,0,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,1,220,0,0,0,0,9}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0}, - {230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,216,1,1,1,0,0,0,226,216,216,216,216,216,0,0,0,0,0,0,0,0,220,220,220,220,220}, - {220,220,220,0,0,230,230,230,230,230,220,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} +#define kCharProp2MaxPlane 16 +#define kCharProp2IndexBits 11 +#define kCharProp2CharBits 5 +static const PRUint8 sCharProp2Planes[16] = {1,2,3,4,4,4,4,4,4,4,4,4,4,5,6,6}; + +static const PRUint16 sCharProp2Pages[7][2048] = { + {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,37,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,51,57,58,59,60,61,62,63,64,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,111,115,116,117,118,119,120,121,111,122,123,124,125,126,127,128,129,130,130,131,132,133,134,133,135,136,136,137,136,138,139,140,136,141,136,142,143,144,145,145,146,147,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,149,150,151,151,152,153,154,155,156,157,158,159,160,161,162,163,164,162,165,148,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,111,111,181,182,183,184,185,186,187,188,189,190,191,192,111,111,193,194,195,196,197,198,199,200,201,202,203,203,203,203,204,205,205,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,250,251,252,252,253,254,255,256,257,258,259,245,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,274,274,274,274,274,274,274,236,236,236,236,275,236,276,277,278,236,236,279,236,236,280,236,245,281,282,111,111,111,111,111,283,284,285,286,287,287,287,288,289,290,291,292,293,294,294,295,296,297,111,111,298,299,299,300,301,301,301,301,301,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,321,324,325,326,327,327,328,329,330,330,331,332,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,334,245,245,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,335,336,337,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,339,340,341,342,343,343,343,343,343,343,343,343,344,345,35,346,347,348,348,349,350,351,352,353,354,355,111,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,111,372,373,374,375,376,377,378,379,380,381,111,111,111,111,382,383,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,385,386,387,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,390,390,390,390,390,390,390,390,391,392,390,393,390,390,394,336,395,396,397,398,398,399,400,398,398,398,398,398,398,398,398,398,398,401,402,398,403,398,404,405,406,407,408,409,398,398,398,410,411,412,413,414,415,416,417,418}, + {419,420,421,111,422,422,422,423,424,425,426,427,428,111,429,430,111,111,111,111,431,432,433,111,434,435,436,111,437,438,439,111,440,441,442,443,444,445,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,446,447,448,64,64,64,64,64,449,450,64,64,451,452,64,64,453,454,455,456,64,64,64,64,457,458,459,460,64,64,64,64,461,461,462,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,463,64,64,64,64,64,64,64,64,64,64,64,64,464,465,466,467,468,469,470,471,472,473,474,111,475,476,477,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,478,479,480,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,482,111,111,111,111,483,483,483,484,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,486,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,488,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,489,489,490,491,492,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,493,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,239,239,239,239,239,239,239,494,239,495,496,497,498,499,500,111,501,501,502,111,111,111,111,111,245,245,503,504,111,111,111,111,505,506,507,508,509,510,511,512,513,514,515,516,517,505,506,518,508,519,520,521,512,522,523,524,525,526,527,528,529,530,531,532,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,533,534,535,536,537,538,66,539,64,64,64,64,64,64,64,64,245,540,245,245,541,542,543,111,544,545,546,547,548,111,111,549,550,551,552,111,111,111,111,111,553,554,553,555,556,553,557,558,553,559,560,553,553,553,553,561,553,562,563,564,111,111,111,565,553,553,566,111,553,553,567,111,553,553,553,556,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111}, + {333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,568,336,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,569,570,570,570,570,570,570,571,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,572,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,573}, + {336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,573}, + {111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111}, + {574,575,575,575,111,111,111,111,576,576,576,576,576,576,576,577,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111}, + {389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,578} }; -static const PRInt32 kSmallMirrorOffset = 64; -static const PRUint16 sDistantMirrors[] = { - 0x29F5, - 0x22CD, - 0x29B8, - 0x2ADE, - 0x2AE4, - 0x2AE3, - 0x2AE5, - 0x2243, - 0x2298, - 0x2215, - 0x22A6, - 0x22A9, - 0x22A8, - 0x22AB +static const nsCharProps2 sCharProp2Values[579][32] = { + {{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,8,6,-1},{0,3,0,7,6,-1},{0,3,0,8,6,-1},{0,3,0,9,6,-1},{0,3,0,7,6,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,7,9,-1},{0,3,0,7,9,-1},{0,3,0,7,9,-1},{0,3,0,8,9,-1}}, + {{0,4,29,9,6,-1},{0,4,21,10,6,-1},{0,4,21,10,6,-1},{0,4,21,4,6,-1},{0,4,23,4,6,-1},{0,4,21,4,6,-1},{0,4,21,10,6,-1},{0,4,21,10,4,-1},{0,4,22,10,6,-1},{0,4,18,10,6,-1},{0,4,21,10,6,-1},{0,4,25,3,6,-1},{0,4,21,6,6,-1},{0,4,17,3,0,-1},{0,4,21,6,0,-1},{0,4,21,6,6,-1},{0,4,13,2,1,0},{0,4,13,2,1,1},{0,4,13,2,1,2},{0,4,13,2,1,3},{0,4,13,2,1,4},{0,4,13,2,1,5},{0,4,13,2,1,6},{0,4,13,2,1,7},{0,4,13,2,1,8},{0,4,13,2,1,9},{0,4,21,6,4,-1},{0,4,21,10,6,-1},{0,4,25,10,6,-1},{0,4,25,10,6,-1},{0,4,25,10,6,-1},{0,4,21,10,6,-1}}, + {{0,4,21,10,6,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{25,4,9,0,1,-1},{0,4,22,10,6,-1},{0,4,21,10,6,-1},{0,4,18,10,6,-1},{0,4,24,10,6,-1},{0,4,16,10,1,-1}}, + {{0,4,24,10,6,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{25,4,5,0,1,-1},{0,4,22,10,6,-1},{0,4,25,10,6,-1},{0,4,18,10,6,-1},{0,4,25,10,6,-1},{0,3,0,18,9,-1}}, + {{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,7,6,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1},{0,3,0,18,9,-1}}, + {{0,3,29,6,5,-1},{0,0,21,10,6,-1},{0,4,23,4,6,-1},{0,4,23,4,6,-1},{0,0,23,4,6,-1},{0,4,23,4,6,-1},{0,4,26,10,6,-1},{0,0,21,10,6,-1},{0,0,24,10,5,-1},{0,3,26,10,6,-1},{25,0,7,0,5,-1},{0,3,20,10,6,-1},{0,4,25,10,6,-1},{0,0,1,18,2,-1},{0,0,26,10,6,-1},{0,4,24,10,5,-1},{0,0,26,4,6,-1},{0,0,25,4,6,-1},{0,0,15,2,5,2},{0,0,15,2,5,3},{0,0,24,10,5,-1},{0,3,5,0,5,-1},{0,0,21,10,6,-1},{0,0,21,10,0,-1},{0,0,24,10,5,-1},{0,0,15,2,5,1},{25,0,7,0,5,-1},{0,3,19,10,6,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,21,10,6,-1}}, + {{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,0,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,0,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{0,0,25,10,6,-1},{25,0,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,0,9,0,1,-1},{25,0,5,0,1,-1}}, + {{25,0,5,0,1,-1},{25,0,5,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,1,-1},{25,0,5,0,1,-1},{25,3,5,0,1,-1},{25,0,5,0,1,-1},{25,0,5,0,1,-1},{25,0,5,0,1,-1},{25,3,5,0,1,-1},{25,0,5,0,1,-1},{25,0,5,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,1,-1},{25,0,5,0,1,-1},{25,3,5,0,1,-1},{25,0,5,0,1,-1},{25,0,5,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,1,-1},{0,0,25,10,6,-1},{25,0,5,0,1,-1},{25,0,5,0,1,-1},{25,0,5,0,1,-1},{25,3,5,0,1,-1},{25,0,5,0,1,-1},{25,3,5,0,1,-1},{25,0,5,0,1,-1},{25,3,5,0,1,-1}}, + {{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1}}, + {{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,0,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,0,9,0,5,-1},{25,0,5,0,5,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,0,9,0,5,-1}}, + {{25,0,5,0,5,-1},{25,0,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,0,5,0,5,-1},{25,0,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,0,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1}}, + {{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,0,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,5,-1}}, + {{25,3,5,0,8,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,5,0,7,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,5,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1}}, + {{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,7,-1},{25,3,5,0,7,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,7,-1},{25,3,5,0,7,-1},{25,3,7,0,7,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,5,0,7,-1},{25,3,5,0,3,-1}}, + {{25,3,7,0,8,-1},{25,3,7,0,8,-1},{25,3,7,0,8,-1},{25,3,7,0,8,-1},{25,3,9,0,5,-1},{25,3,8,0,5,-1},{25,3,5,0,5,-1},{25,3,9,0,5,-1},{25,3,8,0,5,-1},{25,3,5,0,5,-1},{25,3,9,0,5,-1},{25,3,8,0,5,-1},{25,3,5,0,5,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,9,0,1,-1},{25,0,5,0,1,-1},{25,3,5,0,4,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1}}, + {{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,5,-1},{25,3,8,0,5,-1},{25,3,5,0,5,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,3,-1},{25,3,9,0,3,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1}}, + {{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1}}, + {{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,4,-1},{25,3,5,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1}}, + {{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,0,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,4,-1},{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,3,5,0,4,-1},{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,7,-1}}, + {{25,3,5,0,4,-1},{25,0,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,4,-1},{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,3,5,0,7,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,7,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1}}, + {{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,4,-1},{25,3,5,0,4,-1},{25,3,5,0,4,-1},{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,4,-1},{25,3,5,0,8,-1},{25,3,7,0,4,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,7,-1},{25,3,5,0,8,-1}}, + {{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{0,3,6,10,8,-1},{0,3,6,10,8,-1},{0,3,6,0,1,-1},{0,3,6,0,1,-1},{0,3,6,0,8,-1},{0,3,6,0,8,-1},{0,3,6,0,8,-1}}, + {{0,3,6,0,8,-1},{0,3,6,0,8,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,0,24,10,6,-1},{0,3,24,10,6,-1},{0,3,6,10,8,-1},{0,0,6,10,8,-1},{0,3,6,10,8,-1},{0,0,6,10,8,-1},{0,0,6,10,8,-1},{0,0,6,10,8,-1},{0,3,6,10,8,-1},{0,0,6,10,8,-1},{0,3,6,10,8,-1},{0,3,6,10,8,-1},{0,0,6,0,8,-1},{0,3,6,0,8,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,0,24,10,5,-1},{0,0,24,10,5,-1},{0,0,24,10,5,-1},{0,0,24,10,5,-1},{0,3,24,10,5,-1},{0,0,24,10,5,-1},{0,3,24,10,6,-1},{0,0,24,10,6,-1}}, + {{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{5,3,24,10,6,-1},{5,3,24,10,6,-1},{0,3,6,10,1,-1},{0,3,24,10,6,-1},{0,3,6,0,8,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1}}, + {{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,4,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,4,-1},{1,0,12,17,8,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,8,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,8,-1},{1,0,12,17,4,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,1,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1}}, + {{1,0,12,17,8,-1},{1,0,12,17,4,-1},{1,0,12,17,4,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,8,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,4,-1},{1,0,12,17,8,-1},{1,0,12,17,4,-1},{1,0,12,17,1,-1},{1,0,12,17,4,-1},{1,0,12,17,8,-1},{1,0,12,17,1,-1},{1,0,12,17,1,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1}}, + {{1,0,12,17,5,-1},{1,0,12,17,5,-1},{1,0,12,17,1,-1},{1,0,12,17,5,-1},{1,0,12,17,5,-1},{1,0,12,17,1,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,2,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,4,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1}}, + {{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,8,-1},{1,0,12,17,3,-1},{1,0,12,17,3,-1},{1,0,12,17,3,-1},{1,0,12,17,3,-1},{1,0,12,17,3,-1},{1,0,12,17,3,-1},{1,0,12,17,3,-1},{1,0,12,17,3,-1},{1,0,12,17,3,-1},{1,0,12,17,3,-1},{1,0,12,17,3,-1},{1,0,12,17,3,-1},{1,0,12,17,3,-1},{14,3,9,0,3,-1},{14,3,5,0,3,-1},{14,3,9,0,3,-1},{14,3,5,0,3,-1},{0,3,6,10,5,-1},{14,3,24,10,6,-1},{14,3,9,0,3,-1},{14,3,5,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{14,3,6,0,5,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{0,3,21,10,5,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{14,3,24,10,5,-1},{0,3,24,10,5,-1},{14,3,9,0,1,-1},{0,3,21,10,5,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{61,0,2,0,9,-1},{14,3,9,0,1,-1},{61,0,2,0,9,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,5,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1}}, + {{14,0,9,0,1,-1},{14,0,9,0,1,-1},{61,0,2,0,9,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,0,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1}}, + {{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,3,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,0,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,9,0,8,-1},{14,3,5,0,5,-1},{14,3,5,0,5,-1},{14,3,9,0,5,-1},{14,3,9,0,5,-1},{14,3,9,0,5,-1},{14,3,5,0,5,-1},{14,3,5,0,5,-1},{14,3,5,0,8,-1},{14,3,9,0,3,-1},{14,3,5,0,3,-1},{14,3,9,0,3,-1},{14,3,5,0,3,-1},{14,3,9,0,3,-1},{14,3,5,0,3,-1},{14,3,9,0,3,-1},{14,3,5,0,3,-1}}, + {{14,3,9,0,3,-1},{14,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{14,3,5,0,5,-1},{14,3,5,0,5,-1},{14,3,5,0,5,-1},{14,3,5,0,8,-1},{14,3,9,0,5,-1},{14,3,5,0,5,-1},{14,3,25,10,6,-1},{14,3,9,0,3,-1},{14,3,5,0,3,-1},{14,3,9,0,5,-1},{14,3,9,0,3,-1},{14,3,5,0,3,-1},{14,3,5,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1}}, + {{8,3,9,0,1,-1},{8,0,9,0,1,-1},{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1}}, + {{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,9,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1}}, + {{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,0,5,0,1,-1},{8,3,5,0,1,-1},{8,0,5,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1}}, + {{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1}}, + {{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,26,0,6,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,11,17,6,-1},{8,3,11,17,6,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1}}, + {{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1}}, + {{8,3,9,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1}}, + {{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,1,-1},{8,3,5,0,1,-1},{8,3,9,0,9,-1},{8,3,5,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1}}, + {{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{3,3,9,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{3,3,6,0,1,-1},{3,3,21,0,6,-1},{3,3,21,0,6,-1},{3,3,21,0,6,-1},{3,3,21,0,6,-1},{3,3,21,0,6,-1},{3,3,21,0,6,-1}}, + {{61,0,2,0,9,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1}}, + {{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,1,-1},{3,3,5,0,5,-1},{61,0,2,0,9,-1},{0,3,21,0,6,-1},{3,3,17,10,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{3,3,23,4,9,-1},{61,0,2,1,9,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1}}, + {{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,17,1,6,-1},{19,3,12,17,4,-1}}, + {{19,3,21,1,6,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,21,1,6,-1},{19,3,12,17,4,-1},{19,3,12,17,4,-1},{19,3,21,1,6,-1},{19,3,12,17,4,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1}}, + {{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,7,1,1,-1},{19,3,21,1,0,-1},{19,3,21,1,0,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1}}, + {{2,3,1,5,6,-1},{2,3,1,5,6,-1},{2,3,1,5,6,-1},{2,3,1,5,6,-1},{2,3,1,5,9,-1},{61,0,2,13,9,-1},{2,3,25,10,6,-1},{2,3,25,10,6,-1},{2,3,25,13,6,-1},{2,3,21,4,6,-1},{2,3,21,4,6,-1},{2,3,23,13,6,-1},{0,3,21,6,6,-1},{2,3,21,13,6,-1},{2,3,26,10,6,-1},{2,3,26,10,6,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{0,3,21,13,6,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{2,3,21,13,6,-1},{0,3,21,13,6,-1}}, + {{2,3,7,13,9,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1}}, + {{0,3,6,13,3,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{1,3,12,17,1,-1},{1,3,12,17,1,-1},{1,3,12,17,1,-1},{1,3,12,17,1,-1},{1,3,12,17,1,-1},{1,3,12,17,1,-1},{1,3,12,17,1,-1},{1,3,12,17,1,-1},{1,3,12,17,1,-1},{1,3,12,17,1,-1},{1,3,12,17,1,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{1,3,12,17,9,-1}}, + {{0,3,13,5,1,0},{0,3,13,5,1,1},{0,3,13,5,1,2},{0,3,13,5,1,3},{0,3,13,5,1,4},{0,3,13,5,1,5},{0,3,13,5,1,6},{0,3,13,5,1,7},{0,3,13,5,1,8},{0,3,13,5,1,9},{2,3,21,4,6,-1},{2,3,21,5,6,-1},{2,3,21,5,6,-1},{2,3,21,13,6,-1},{2,3,7,13,3,-1},{2,3,7,13,3,-1},{1,3,12,17,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1}}, + {{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,3,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1}}, + {{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1}}, + {{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,21,13,6,-1},{2,3,7,13,1,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{0,3,1,5,6,-1},{2,3,26,10,6,-1},{2,3,12,17,4,-1}}, + {{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,6,13,1,-1},{2,3,6,13,1,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,26,10,6,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,12,17,4,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,13,2,1,0},{2,3,13,2,1,1},{2,3,13,2,1,2},{2,3,13,2,1,3},{2,3,13,2,1,4},{2,3,13,2,1,5},{2,3,13,2,1,6},{2,3,13,2,1,7},{2,3,13,2,1,8},{2,3,13,2,1,9},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,26,13,6,-1},{2,3,26,13,6,-1},{2,3,7,13,1,-1}}, + {{34,3,21,13,6,-1},{34,3,21,13,6,-1},{34,3,21,13,6,-1},{34,3,21,13,6,-1},{34,3,21,13,6,-1},{34,3,21,13,6,-1},{34,3,21,13,6,-1},{34,3,21,13,6,-1},{34,3,21,13,6,-1},{34,3,21,13,6,-1},{34,3,21,13,6,-1},{34,3,21,13,6,-1},{34,3,21,13,6,-1},{34,3,21,13,6,-1},{61,0,2,13,9,-1},{34,3,1,13,6,-1},{34,3,7,13,3,-1},{34,3,12,17,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1}}, + {{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1}}, + {{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{34,3,12,17,3,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{34,3,7,13,3,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1},{2,3,7,13,1,-1}}, + {{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1}}, + {{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,7,13,1,-1},{37,3,12,17,1,-1},{37,3,12,17,1,-1},{37,3,12,17,1,-1},{37,3,12,17,1,-1},{37,3,12,17,1,-1},{37,3,12,17,1,-1},{37,3,12,17,1,-1},{37,3,12,17,1,-1},{37,3,12,17,1,-1},{37,3,12,17,1,-1},{37,3,12,17,1,-1},{37,3,7,13,1,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1}}, + {{66,3,13,1,4,0},{66,3,13,1,4,1},{66,3,13,1,4,2},{66,3,13,1,4,3},{66,3,13,1,4,4},{66,3,13,1,4,5},{66,3,13,1,4,6},{66,3,13,1,4,7},{66,3,13,1,4,8},{66,3,13,1,4,9},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1}}, + {{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,4,-1},{66,3,7,1,3,-1},{66,3,7,1,3,-1},{66,3,7,1,3,-1},{66,3,12,17,4,-1},{66,3,12,17,4,-1},{66,3,12,17,4,-1},{66,3,12,17,4,-1},{66,3,12,17,4,-1},{66,3,12,17,4,-1},{66,3,12,17,4,-1},{66,3,12,17,4,-1},{66,3,12,17,4,-1},{66,3,6,1,4,-1},{66,3,6,1,4,-1},{66,3,26,10,6,-1},{66,3,21,10,6,-1},{66,3,21,10,6,-1},{66,3,21,10,6,-1},{66,3,6,1,4,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1}}, + {{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,7,1,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,6,1,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1}}, + {{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,6,1,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,6,1,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{90,3,12,17,3,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{90,3,21,1,6,-1},{61,0,2,1,9,-1}}, + {{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,7,1,9,-1},{95,3,12,17,9,-1},{95,3,12,17,9,-1},{95,3,12,17,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{95,3,21,1,9,-1},{61,0,2,1,9,-1}}, + {{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1}}, + {{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1}}, + {{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1}}, + {{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{2,3,12,17,9,-1},{61,0,2,13,9,-1}}, + {{10,3,12,17,4,-1},{10,3,12,17,1,-1},{10,3,12,17,1,-1},{10,3,10,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1}}, + {{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,12,17,9,-1},{10,3,10,0,9,-1},{10,3,12,17,1,-1},{10,3,7,0,1,-1},{10,3,10,0,1,-1},{10,3,10,0,1,-1}}, + {{10,3,10,0,1,-1},{10,3,12,17,1,-1},{10,3,12,17,1,-1},{10,3,12,17,1,-1},{10,3,12,17,1,-1},{10,3,12,17,1,-1},{10,3,12,17,1,-1},{10,3,12,17,1,-1},{10,3,12,17,1,-1},{10,3,10,0,1,-1},{10,3,10,0,1,-1},{10,3,10,0,1,-1},{10,3,10,0,1,-1},{10,3,12,17,1,-1},{10,3,10,0,3,-1},{10,3,10,0,9,-1},{10,3,7,0,1,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{10,3,12,17,8,-1},{10,3,12,17,8,-1},{10,3,12,17,4,-1},{10,3,12,17,9,-1},{10,3,12,17,9,-1},{10,3,7,0,5,-1},{10,3,7,0,5,-1},{10,3,7,0,5,-1},{10,3,7,0,5,-1},{10,3,7,0,5,-1},{10,3,7,0,5,-1},{10,3,7,0,5,-1},{10,3,7,0,5,-1}}, + {{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,12,17,1,-1},{10,3,12,17,1,-1},{0,3,21,0,6,-1},{0,3,21,0,6,-1},{10,3,13,0,1,0},{10,3,13,0,1,1},{10,3,13,0,1,2},{10,3,13,0,1,3},{10,3,13,0,1,4},{10,3,13,0,1,5},{10,3,13,0,1,6},{10,3,13,0,1,7},{10,3,13,0,1,8},{10,3,13,0,1,9},{10,3,21,0,6,-1},{10,3,6,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,9,-1},{10,3,7,0,9,-1},{10,3,7,0,9,-1},{10,3,7,0,9,-1},{10,3,7,0,9,-1},{61,0,2,0,9,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1},{10,3,7,0,1,-1}}, + {{61,0,2,0,9,-1},{4,3,12,17,1,-1},{4,3,10,0,1,-1},{4,3,10,0,1,-1},{61,0,2,0,9,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1}}, + {{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{61,0,2,0,9,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{61,0,2,0,9,-1},{4,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{4,3,12,17,1,-1},{4,3,7,0,1,-1},{4,3,10,0,1,-1},{4,3,10,0,1,-1}}, + {{4,3,10,0,1,-1},{4,3,12,17,1,-1},{4,3,12,17,1,-1},{4,3,12,17,1,-1},{4,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{4,3,10,0,1,-1},{4,3,10,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{4,3,10,0,1,-1},{4,3,10,0,1,-1},{4,3,12,17,1,-1},{4,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{4,3,10,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{4,3,7,0,5,-1},{4,3,7,0,5,-1},{61,0,2,0,9,-1},{4,3,7,0,5,-1}}, + {{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,12,17,1,-1},{4,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{4,3,13,0,1,0},{4,3,13,0,1,1},{4,3,13,0,1,2},{4,3,13,0,1,3},{4,3,13,0,1,4},{4,3,13,0,1,5},{4,3,13,0,1,6},{4,3,13,0,1,7},{4,3,13,0,1,8},{4,3,13,0,1,9},{4,3,7,0,1,-1},{4,3,7,0,1,-1},{4,3,23,4,6,-1},{4,3,23,4,6,-1},{4,3,15,0,6,-1},{4,3,15,0,6,-1},{4,3,15,0,6,-1},{4,3,15,0,6,-1},{4,3,15,0,6,-1},{4,3,15,0,6,-1},{4,3,26,0,6,-1},{4,3,23,4,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{16,3,12,17,1,-1},{16,3,12,17,1,-1},{16,3,10,0,1,-1},{61,0,2,0,9,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1}}, + {{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{61,0,2,0,9,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{61,0,2,0,9,-1},{16,3,7,0,1,-1},{16,3,7,0,5,-1},{61,0,2,0,9,-1},{16,3,7,0,1,-1},{16,3,7,0,5,-1},{61,0,2,0,9,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{16,3,12,17,1,-1},{61,0,2,0,9,-1},{16,3,10,0,1,-1},{16,3,10,0,1,-1}}, + {{16,3,10,0,1,-1},{16,3,12,17,1,-1},{16,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{16,3,12,17,1,-1},{16,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{16,3,12,17,1,-1},{16,3,12,17,1,-1},{16,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{16,3,12,17,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{16,3,7,0,5,-1},{16,3,7,0,5,-1},{16,3,7,0,5,-1},{16,3,7,0,1,-1},{61,0,2,0,9,-1},{16,3,7,0,5,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{16,3,13,0,1,0},{16,3,13,0,1,1},{16,3,13,0,1,2},{16,3,13,0,1,3},{16,3,13,0,1,4},{16,3,13,0,1,5},{16,3,13,0,1,6},{16,3,13,0,1,7},{16,3,13,0,1,8},{16,3,13,0,1,9},{16,3,12,17,1,-1},{16,3,12,17,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,7,0,1,-1},{16,3,12,17,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{15,3,12,17,1,-1},{15,3,12,17,1,-1},{15,3,10,0,1,-1},{61,0,2,0,9,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{61,0,2,0,9,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{61,0,2,0,9,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1}}, + {{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{61,0,2,0,9,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{61,0,2,0,9,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{61,0,2,0,9,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{15,3,12,17,1,-1},{15,3,7,0,1,-1},{15,3,10,0,1,-1},{15,3,10,0,1,-1}}, + {{15,3,10,0,1,-1},{15,3,12,17,1,-1},{15,3,12,17,1,-1},{15,3,12,17,1,-1},{15,3,12,17,1,-1},{15,3,12,17,1,-1},{61,0,2,0,9,-1},{15,3,12,17,1,-1},{15,3,12,17,1,-1},{15,3,10,0,1,-1},{61,0,2,0,9,-1},{15,3,10,0,1,-1},{15,3,10,0,1,-1},{15,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{15,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{15,3,7,0,1,-1},{15,3,7,0,1,-1},{15,3,12,17,1,-1},{15,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{15,3,13,0,1,0},{15,3,13,0,1,1},{15,3,13,0,1,2},{15,3,13,0,1,3},{15,3,13,0,1,4},{15,3,13,0,1,5},{15,3,13,0,1,6},{15,3,13,0,1,7},{15,3,13,0,1,8},{15,3,13,0,1,9},{15,3,21,0,9,-1},{15,3,23,4,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{31,3,12,17,1,-1},{31,3,10,0,1,-1},{31,3,10,0,1,-1},{61,0,2,0,9,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1}}, + {{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{61,0,2,0,9,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{61,0,2,0,9,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{61,0,2,0,9,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{31,3,12,17,1,-1},{31,3,7,0,1,-1},{31,3,10,0,1,-1},{31,3,12,17,1,-1}}, + {{31,3,10,0,1,-1},{31,3,12,17,1,-1},{31,3,12,17,1,-1},{31,3,12,17,1,-1},{31,3,12,17,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{31,3,10,0,1,-1},{31,3,10,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{31,3,10,0,1,-1},{31,3,10,0,1,-1},{31,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{31,3,12,17,1,-1},{31,3,10,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{31,3,7,0,5,-1},{31,3,7,0,5,-1},{61,0,2,0,9,-1},{31,3,7,0,1,-1}}, + {{31,3,7,0,1,-1},{31,3,7,0,1,-1},{31,3,12,17,4,-1},{31,3,12,17,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{31,3,13,0,1,0},{31,3,13,0,1,1},{31,3,13,0,1,2},{31,3,13,0,1,3},{31,3,13,0,1,4},{31,3,13,0,1,5},{31,3,13,0,1,6},{31,3,13,0,1,7},{31,3,13,0,1,8},{31,3,13,0,1,9},{31,3,26,0,6,-1},{31,3,7,0,1,-1},{31,3,15,0,9,-1},{31,3,15,0,9,-1},{31,3,15,0,9,-1},{31,3,15,0,9,-1},{31,3,15,0,9,-1},{31,3,15,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{35,3,12,17,1,-1},{35,3,7,0,1,-1},{61,0,2,0,9,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{61,0,2,0,9,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{61,0,2,0,9,-1},{35,3,7,0,1,-1},{61,0,2,0,9,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{35,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{35,3,10,0,1,-1},{35,3,10,0,1,-1}}, + {{35,3,12,17,1,-1},{35,3,10,0,1,-1},{35,3,10,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{35,3,10,0,1,-1},{35,3,10,0,1,-1},{35,3,10,0,1,-1},{61,0,2,0,9,-1},{35,3,10,0,1,-1},{35,3,10,0,1,-1},{35,3,10,0,1,-1},{35,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{35,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{35,3,10,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{35,3,13,0,1,0},{35,3,13,0,1,1},{35,3,13,0,1,2},{35,3,13,0,1,3},{35,3,13,0,1,4},{35,3,13,0,1,5},{35,3,13,0,1,6},{35,3,13,0,1,7},{35,3,13,0,1,8},{35,3,13,0,1,9},{35,3,15,0,6,-1},{35,3,15,0,6,-1},{35,3,15,0,6,-1},{35,3,26,10,6,-1},{35,3,26,10,6,-1},{35,3,26,10,6,-1},{35,3,26,10,6,-1},{35,3,26,10,6,-1},{35,3,26,10,6,-1},{35,3,23,4,6,-1},{35,3,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{36,3,10,0,1,-1},{36,3,10,0,1,-1},{36,3,10,0,1,-1},{61,0,2,0,9,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{61,0,2,0,9,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{61,0,2,0,9,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1}}, + {{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{61,0,2,0,9,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{61,0,2,0,9,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{36,3,7,0,1,-1},{36,3,12,17,1,-1},{36,3,12,17,1,-1}}, + {{36,3,12,17,1,-1},{36,3,10,0,1,-1},{36,3,10,0,1,-1},{36,3,10,0,1,-1},{36,3,10,0,1,-1},{61,0,2,0,9,-1},{36,3,12,17,1,-1},{36,3,12,17,1,-1},{36,3,12,17,1,-1},{61,0,2,0,9,-1},{36,3,12,17,1,-1},{36,3,12,17,1,-1},{36,3,12,17,1,-1},{36,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{36,3,12,17,1,-1},{36,3,12,17,1,-1},{61,0,2,0,9,-1},{36,3,7,0,3,-1},{36,3,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{36,3,7,0,1,-1},{36,3,7,0,1,-1},{36,3,12,17,4,-1},{36,3,12,17,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{36,3,13,0,1,0},{36,3,13,0,1,1},{36,3,13,0,1,2},{36,3,13,0,1,3},{36,3,13,0,1,4},{36,3,13,0,1,5},{36,3,13,0,1,6},{36,3,13,0,1,7},{36,3,13,0,1,8},{36,3,13,0,1,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{36,3,15,10,6,-1},{36,3,15,10,6,-1},{36,3,15,10,6,-1},{36,3,15,10,6,-1},{36,3,15,10,6,-1},{36,3,15,10,6,-1},{36,3,15,10,6,-1},{36,3,26,0,6,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{21,3,10,0,1,-1},{21,3,10,0,1,-1},{61,0,2,0,9,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{61,0,2,0,9,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{61,0,2,0,9,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1}}, + {{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{61,0,2,0,9,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{61,0,2,0,9,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{21,3,12,17,1,-1},{21,3,7,0,1,-1},{21,3,10,0,1,-1},{21,3,12,0,1,-1}}, + {{21,3,10,0,1,-1},{21,3,10,0,1,-1},{21,3,10,0,1,-1},{21,3,10,0,1,-1},{21,3,10,0,1,-1},{61,0,2,0,9,-1},{21,3,12,0,1,-1},{21,3,10,0,1,-1},{21,3,10,0,1,-1},{61,0,2,0,9,-1},{21,3,10,0,1,-1},{21,3,10,0,1,-1},{21,3,12,17,1,-1},{21,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{21,3,10,0,1,-1},{21,3,10,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{21,3,7,0,3,-1},{61,0,2,0,9,-1}}, + {{21,3,7,0,1,-1},{21,3,7,0,1,-1},{21,3,12,17,1,-1},{21,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{21,3,13,0,1,0},{21,3,13,0,1,1},{21,3,13,0,1,2},{21,3,13,0,1,3},{21,3,13,0,1,4},{21,3,13,0,1,5},{21,3,13,0,1,6},{21,3,13,0,1,7},{21,3,13,0,1,8},{21,3,13,0,1,9},{61,0,2,0,9,-1},{21,3,7,0,6,-1},{21,3,7,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{26,3,10,0,1,-1},{26,3,10,0,1,-1},{61,0,2,0,9,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{61,0,2,0,9,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{61,0,2,0,9,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1}}, + {{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,9,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{26,3,7,0,1,-1},{26,3,10,0,1,-1},{26,3,10,0,1,-1}}, + {{26,3,10,0,1,-1},{26,3,12,17,1,-1},{26,3,12,17,1,-1},{26,3,12,17,1,-1},{26,3,12,17,4,-1},{61,0,2,0,9,-1},{26,3,10,0,1,-1},{26,3,10,0,1,-1},{26,3,10,0,1,-1},{61,0,2,0,9,-1},{26,3,10,0,1,-1},{26,3,10,0,1,-1},{26,3,10,0,1,-1},{26,3,12,17,1,-1},{26,3,7,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{26,3,10,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,12,17,4,-1},{26,3,12,17,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{26,3,13,0,1,0},{26,3,13,0,1,1},{26,3,13,0,1,2},{26,3,13,0,1,3},{26,3,13,0,1,4},{26,3,13,0,1,5},{26,3,13,0,1,6},{26,3,13,0,1,7},{26,3,13,0,1,8},{26,3,13,0,1,9},{26,3,15,0,6,-1},{26,3,15,0,6,-1},{26,3,15,0,6,-1},{26,3,15,0,6,-1},{26,3,15,0,6,-1},{26,3,15,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{26,3,26,0,6,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1},{26,3,7,0,1,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{33,3,10,0,1,-1},{33,3,10,0,1,-1},{61,0,2,0,9,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,8,-1},{33,3,7,0,8,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1}}, + {{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,8,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{61,0,2,0,9,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{61,0,2,0,9,-1},{33,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{33,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{33,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{33,3,10,0,1,-1},{33,3,10,0,1,-1},{33,3,10,0,1,-1},{33,3,12,17,1,-1},{33,3,12,17,1,-1},{33,3,12,17,1,-1},{61,0,2,0,9,-1},{33,3,12,17,1,-1},{61,0,2,0,9,-1},{33,3,10,0,1,-1},{33,3,10,0,1,-1},{33,3,10,0,1,-1},{33,3,10,0,1,-1},{33,3,10,0,1,-1},{33,3,10,0,1,-1},{33,3,10,0,1,-1},{33,3,10,0,8,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{33,3,10,0,1,-1},{33,3,10,0,8,-1},{33,3,21,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1}}, + {{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,12,17,1,-1},{38,3,7,0,1,-1},{38,3,7,0,5,-1},{38,3,12,17,1,-1},{38,3,12,17,1,-1},{38,3,12,17,1,-1},{38,3,12,17,1,-1},{38,3,12,17,1,-1},{38,3,12,17,1,-1},{38,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,23,4,6,-1}}, + {{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,7,0,1,-1},{38,3,6,0,1,-1},{38,3,12,17,1,-1},{38,3,12,17,1,-1},{38,3,12,17,1,-1},{38,3,12,17,1,-1},{38,3,12,17,1,-1},{38,3,12,17,1,-1},{38,3,12,17,1,-1},{38,3,12,17,1,-1},{38,3,21,0,6,-1},{38,3,13,0,1,0},{38,3,13,0,1,1},{38,3,13,0,1,2},{38,3,13,0,1,3},{38,3,13,0,1,4},{38,3,13,0,1,5},{38,3,13,0,1,6},{38,3,13,0,1,7},{38,3,13,0,1,8},{38,3,13,0,1,9},{38,3,21,0,6,-1},{38,3,21,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{61,0,2,0,9,-1},{24,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{61,0,2,0,9,-1},{24,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{24,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{61,0,2,0,9,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1}}, + {{61,0,2,0,9,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{61,0,2,0,9,-1},{24,3,7,0,1,-1},{61,0,2,0,9,-1},{24,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{61,0,2,0,9,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,12,17,1,-1},{24,3,7,0,1,-1},{24,3,7,0,5,-1},{24,3,12,17,1,-1},{24,3,12,17,1,-1},{24,3,12,17,1,-1},{24,3,12,17,1,-1},{24,3,12,17,1,-1},{24,3,12,17,1,-1},{61,0,2,0,9,-1},{24,3,12,17,1,-1},{24,3,12,17,1,-1},{24,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{24,3,7,0,1,-1},{61,0,2,0,9,-1},{24,3,6,0,1,-1},{61,0,2,0,9,-1},{24,3,12,17,1,-1},{24,3,12,17,1,-1},{24,3,12,17,1,-1},{24,3,12,17,1,-1},{24,3,12,17,1,-1},{24,3,12,17,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{24,3,13,0,1,0},{24,3,13,0,1,1},{24,3,13,0,1,2},{24,3,13,0,1,3},{24,3,13,0,1,4},{24,3,13,0,1,5},{24,3,13,0,1,6},{24,3,13,0,1,7},{24,3,13,0,1,8},{24,3,13,0,1,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{24,3,7,0,5,-1},{24,3,7,0,5,-1},{24,3,7,0,9,-1},{24,3,7,0,9,-1}}, + {{39,3,7,0,1,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,0,-1},{39,3,21,0,5,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,26,0,6,-1},{39,3,21,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,12,17,8,-1},{39,3,12,17,8,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1}}, + {{39,3,13,0,1,0},{39,3,13,0,1,1},{39,3,13,0,1,2},{39,3,13,0,1,3},{39,3,13,0,1,4},{39,3,13,0,1,5},{39,3,13,0,1,6},{39,3,13,0,1,7},{39,3,13,0,1,8},{39,3,13,0,1,9},{39,3,15,0,6,-1},{39,3,15,0,6,-1},{39,3,15,0,6,-1},{39,3,15,0,6,-1},{39,3,15,0,6,-1},{39,3,15,0,6,-1},{39,3,15,0,6,-1},{39,3,15,0,6,-1},{39,3,15,0,6,-1},{39,3,15,0,6,-1},{39,3,26,0,6,-1},{39,3,12,17,1,-1},{39,3,26,0,6,-1},{39,3,12,17,1,-1},{39,3,26,0,6,-1},{39,3,12,17,1,-1},{39,3,22,10,6,-1},{39,3,18,10,6,-1},{39,3,22,10,6,-1},{39,3,18,10,6,-1},{39,3,10,0,1,-1},{39,3,10,0,1,-1}}, + {{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,5,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{61,0,2,0,9,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,5,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,5,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,5,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,5,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1}}, + {{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,5,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,5,-1},{39,3,12,17,1,-1},{39,3,12,17,5,-1},{39,3,12,17,5,-1},{39,3,12,17,5,-1},{39,3,12,17,5,-1},{39,3,12,17,5,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,10,0,1,-1}}, + {{39,3,12,17,1,-1},{39,3,12,17,5,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,21,0,6,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,1,-1},{39,3,7,0,9,-1},{39,3,12,17,9,-1},{39,3,12,17,9,-1},{39,3,12,17,9,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,5,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{61,0,2,0,9,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,5,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1}}, + {{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,5,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,5,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,5,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,5,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{39,3,12,17,1,-1},{61,0,2,0,9,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1}}, + {{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,12,17,1,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{61,0,2,0,9,-1},{39,3,26,0,6,-1},{39,3,26,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{39,3,21,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{39,3,21,0,9,-1},{39,3,21,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1}}, + {{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,10,0,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,10,0,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,7,0,1,-1}}, + {{28,3,13,0,1,0},{28,3,13,0,1,1},{28,3,13,0,1,2},{28,3,13,0,1,3},{28,3,13,0,1,4},{28,3,13,0,1,5},{28,3,13,0,1,6},{28,3,13,0,1,7},{28,3,13,0,1,8},{28,3,13,0,1,9},{28,3,21,0,6,-1},{28,3,21,0,6,-1},{28,3,21,0,6,-1},{28,3,21,0,6,-1},{28,3,21,0,6,-1},{28,3,21,0,6,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1}}, + {{28,3,12,17,1,-1},{28,3,7,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1}}, + {{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,12,17,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,12,17,1,-1},{28,3,12,17,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,12,17,1,-1},{28,3,7,0,1,-1},{28,3,10,0,1,-1},{28,3,13,0,1,0},{28,3,13,0,1,1},{28,3,13,0,1,2},{28,3,13,0,1,3},{28,3,13,0,1,4},{28,3,13,0,1,5},{28,3,13,0,1,6},{28,3,13,0,1,7},{28,3,13,0,1,8},{28,3,13,0,1,9},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,10,0,1,-1},{28,3,12,17,1,-1},{28,3,26,0,6,-1},{28,3,26,0,6,-1}}, + {{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1}}, + {{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{12,3,9,0,3,-1},{61,0,2,0,9,-1},{12,3,9,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{12,3,9,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1}}, + {{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,3,-1},{12,3,7,0,3,-1},{12,3,7,0,3,-1},{12,3,7,0,3,-1},{12,3,7,0,3,-1},{12,3,7,0,3,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{12,3,7,0,1,-1},{0,3,21,0,6,-1},{12,3,6,0,5,-1},{12,3,7,0,9,-1},{12,3,7,0,9,-1},{12,3,7,0,9,-1}}, + {{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1}}, + {{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,2,-1}}, + {{18,3,7,0,2,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1}}, + {{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1}}, + {{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1}}, + {{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,3,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1}}, + {{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1}}, + {{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1}}, + {{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1}}, + {{11,3,7,0,1,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1}}, + {{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1}}, + {{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{11,3,12,17,9,-1},{11,3,12,17,9,-1},{11,3,12,17,1,-1}}, + {{11,3,21,0,6,-1},{11,3,21,0,6,-1},{11,3,21,0,6,-1},{11,3,21,0,6,-1},{11,3,21,0,6,-1},{11,3,21,0,6,-1},{11,3,21,0,6,-1},{11,3,21,0,6,-1},{11,3,21,0,6,-1},{11,3,15,0,7,1},{11,3,15,0,7,2},{11,3,15,0,7,3},{11,3,15,0,7,4},{11,3,15,0,7,5},{11,3,15,0,7,6},{11,3,15,0,7,7},{11,3,15,0,7,8},{11,3,15,0,7,9},{11,3,15,0,6,-1},{11,3,15,0,6,-1},{11,3,15,0,6,-1},{11,3,15,0,6,-1},{11,3,15,0,6,-1},{11,3,15,0,6,-1},{11,3,15,0,6,-1},{11,3,15,0,6,-1},{11,3,15,0,6,-1},{11,3,15,0,6,-1},{11,3,15,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,26,10,6,-1},{11,3,26,10,6,-1},{11,3,26,10,6,-1},{11,3,26,10,6,-1},{11,3,26,10,6,-1},{11,3,26,10,6,-1},{11,3,26,10,6,-1},{11,3,26,10,6,-1},{11,3,26,10,6,-1},{11,3,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1}}, + {{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{6,3,7,0,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{40,3,17,10,6,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1}}, + {{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1}}, + {{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,21,0,6,-1},{40,3,21,0,6,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1}}, + {{29,3,29,9,6,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,7,0,3,-1},{29,3,22,10,6,-1},{29,3,18,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1}}, + {{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{32,3,7,0,3,-1},{0,3,21,0,6,-1},{0,3,21,0,6,-1},{0,3,21,0,6,-1},{32,3,14,0,3,-1},{32,3,14,0,3,-1},{32,3,14,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{61,0,2,0,9,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,7,0,3,-1},{42,3,12,17,3,-1},{42,3,12,17,3,-1},{42,3,12,17,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,7,0,3,-1},{43,3,12,17,3,-1},{43,3,12,17,3,-1},{43,3,12,17,3,-1},{0,3,21,0,6,-1},{0,3,21,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,7,0,3,-1},{44,3,12,17,3,-1},{44,3,12,17,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{45,3,7,0,3,-1},{45,3,7,0,3,-1},{45,3,7,0,3,-1},{45,3,7,0,3,-1},{45,3,7,0,3,-1},{45,3,7,0,3,-1},{45,3,7,0,3,-1},{45,3,7,0,3,-1},{45,3,7,0,3,-1},{45,3,7,0,3,-1},{45,3,7,0,3,-1},{45,3,7,0,3,-1},{45,3,7,0,3,-1},{61,0,2,0,9,-1},{45,3,7,0,3,-1},{45,3,7,0,3,-1},{45,3,7,0,3,-1},{61,0,2,0,9,-1},{45,3,12,17,3,-1},{45,3,12,17,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1}}, + {{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,7,-1},{23,3,7,0,7,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,3,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,7,0,1,-1},{23,3,12,17,2,-1},{23,3,12,17,2,-1},{23,3,10,0,1,-1},{23,3,12,17,1,-1},{23,3,12,17,1,-1},{23,3,12,17,1,-1},{23,3,12,17,1,-1},{23,3,12,17,1,-1},{23,3,12,17,1,-1},{23,3,12,17,1,-1},{23,3,10,0,1,-1},{23,3,10,0,1,-1}}, + {{23,3,10,0,1,-1},{23,3,10,0,1,-1},{23,3,10,0,1,-1},{23,3,10,0,1,-1},{23,3,10,0,1,-1},{23,3,10,0,1,-1},{23,3,12,17,1,-1},{23,3,10,0,1,-1},{23,3,10,0,1,-1},{23,3,12,17,1,-1},{23,3,12,17,1,-1},{23,3,12,17,8,-1},{23,3,12,17,8,-1},{23,3,12,17,8,-1},{23,3,12,17,8,-1},{23,3,12,17,8,-1},{23,3,12,17,8,-1},{23,3,12,17,7,-1},{23,3,12,17,1,-1},{23,3,12,17,7,-1},{23,3,21,0,6,-1},{23,3,21,0,6,-1},{23,3,21,0,6,-1},{23,3,6,0,1,-1},{23,3,21,0,6,-1},{23,3,21,0,6,-1},{23,3,21,0,6,-1},{23,3,23,4,6,-1},{23,3,7,0,1,-1},{23,3,12,17,7,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{23,3,13,0,1,0},{23,3,13,0,1,1},{23,3,13,0,1,2},{23,3,13,0,1,3},{23,3,13,0,1,4},{23,3,13,0,1,5},{23,3,13,0,1,6},{23,3,13,0,1,7},{23,3,13,0,1,8},{23,3,13,0,1,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{23,3,15,10,6,-1},{23,3,15,10,6,-1},{23,3,15,10,6,-1},{23,3,15,10,6,-1},{23,3,15,10,6,-1},{23,3,15,10,6,-1},{23,3,15,10,6,-1},{23,3,15,10,6,-1},{23,3,15,10,6,-1},{23,3,15,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{27,3,21,10,6,-1},{27,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{27,3,21,10,6,-1},{0,3,21,10,6,-1},{27,3,17,10,6,-1},{27,3,21,10,6,-1},{27,3,21,10,6,-1},{27,3,21,10,6,-1},{27,3,21,10,6,-1},{27,3,12,17,2,-1},{27,3,12,17,2,-1},{27,3,12,17,2,-1},{27,3,29,9,6,-1},{61,0,2,0,9,-1},{27,3,13,0,1,0},{27,3,13,0,1,1},{27,3,13,0,1,2},{27,3,13,0,1,3},{27,3,13,0,1,4},{27,3,13,0,1,5},{27,3,13,0,1,6},{27,3,13,0,1,7},{27,3,13,0,1,8},{27,3,13,0,1,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1}}, + {{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,6,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1}}, + {{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,7,0,1,-1},{27,3,12,17,4,-1},{27,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1}}, + {{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{40,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{48,3,7,0,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{48,3,12,17,4,-1},{48,3,12,17,4,-1},{48,3,12,17,4,-1},{48,3,10,0,4,-1},{48,3,10,0,4,-1},{48,3,10,0,4,-1},{48,3,10,0,4,-1},{48,3,12,17,4,-1},{48,3,12,17,4,-1},{48,3,10,0,4,-1},{48,3,10,0,4,-1},{48,3,10,0,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{48,3,10,0,4,-1},{48,3,10,0,4,-1},{48,3,12,17,4,-1},{48,3,10,0,4,-1},{48,3,10,0,4,-1},{48,3,10,0,4,-1},{48,3,10,0,4,-1},{48,3,10,0,4,-1},{48,3,10,0,4,-1},{48,3,12,17,4,-1},{48,3,12,17,4,-1},{48,3,12,17,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{48,3,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{48,3,21,10,6,-1},{48,3,21,10,6,-1},{48,3,13,0,4,0},{48,3,13,0,4,1},{48,3,13,0,4,2},{48,3,13,0,4,3},{48,3,13,0,4,4},{48,3,13,0,4,5},{48,3,13,0,4,6},{48,3,13,0,4,7},{48,3,13,0,4,8},{48,3,13,0,4,9},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1}}, + {{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{52,3,7,0,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1}}, + {{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1}}, + {{54,3,10,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,7,0,4,-1},{54,3,10,0,4,-1},{54,3,10,0,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{54,3,13,0,4,0},{54,3,13,0,4,1},{54,3,13,0,4,2},{54,3,13,0,4,3},{54,3,13,0,4,4},{54,3,13,0,4,5},{54,3,13,0,4,6},{54,3,13,0,4,7},{54,3,13,0,4,8},{54,3,13,0,4,9},{54,3,15,0,4,1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{54,3,26,10,6,-1},{54,3,26,10,6,-1}}, + {{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1},{23,3,26,10,6,-1}}, + {{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,7,0,3,-1},{55,3,12,17,3,-1},{55,3,12,17,3,-1},{55,3,10,0,3,-1},{55,3,10,0,3,-1},{55,3,10,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{55,3,21,0,6,-1},{55,3,21,0,6,-1}}, + {{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1}}, + {{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,7,0,4,-1},{91,3,10,0,4,-1},{91,3,12,17,4,-1},{91,3,10,0,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{61,0,2,0,9,-1}}, + {{91,3,12,17,4,-1},{91,3,10,0,4,-1},{91,3,12,17,4,-1},{91,3,10,0,4,-1},{91,3,10,0,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,10,0,4,-1},{91,3,10,0,4,-1},{91,3,10,0,4,-1},{91,3,10,0,4,-1},{91,3,10,0,4,-1},{91,3,10,0,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{91,3,12,17,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{91,3,12,17,4,-1}}, + {{91,3,13,0,4,0},{91,3,13,0,4,1},{91,3,13,0,4,2},{91,3,13,0,4,3},{91,3,13,0,4,4},{91,3,13,0,4,5},{91,3,13,0,4,6},{91,3,13,0,4,7},{91,3,13,0,4,8},{91,3,13,0,4,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{91,3,13,0,4,0},{91,3,13,0,4,1},{91,3,13,0,4,2},{91,3,13,0,4,3},{91,3,13,0,4,4},{91,3,13,0,4,5},{91,3,13,0,4,6},{91,3,13,0,4,7},{91,3,13,0,4,8},{91,3,13,0,4,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{91,3,21,0,6,-1},{91,3,21,0,6,-1},{91,3,21,0,6,-1},{91,3,21,0,6,-1},{91,3,21,0,6,-1},{91,3,21,0,6,-1},{91,3,21,0,6,-1},{91,3,6,0,4,-1},{91,3,21,0,6,-1},{91,3,21,0,6,-1},{91,3,21,0,6,-1},{91,3,21,0,6,-1},{91,3,21,0,6,-1},{91,3,21,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,10,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1}}, + {{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,12,17,4,-1},{62,3,10,0,4,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,10,0,4,-1},{62,3,12,17,4,-1},{62,3,10,0,4,-1},{62,3,10,0,4,-1},{62,3,10,0,4,-1}}, + {{62,3,10,0,4,-1},{62,3,10,0,4,-1},{62,3,12,17,4,-1},{62,3,10,0,4,-1},{62,3,10,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{62,3,7,0,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{62,3,13,0,4,0},{62,3,13,0,4,1},{62,3,13,0,4,2},{62,3,13,0,4,3},{62,3,13,0,4,4},{62,3,13,0,4,5},{62,3,13,0,4,6},{62,3,13,0,4,7},{62,3,13,0,4,8},{62,3,13,0,4,9},{62,3,21,0,6,-1},{62,3,21,0,6,-1},{62,3,21,0,6,-1},{62,3,21,0,6,-1},{62,3,21,0,6,-1},{62,3,21,0,6,-1}}, + {{62,3,21,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,12,17,4,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{62,3,26,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{70,3,12,17,4,-1},{70,3,12,17,4,-1},{70,3,10,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1}}, + {{70,3,7,0,4,-1},{70,3,10,0,4,-1},{70,3,12,17,4,-1},{70,3,12,17,4,-1},{70,3,12,17,4,-1},{70,3,12,17,4,-1},{70,3,10,0,4,-1},{70,3,10,0,4,-1},{70,3,12,17,4,-1},{70,3,12,17,4,-1},{70,3,10,0,4,-1},{70,3,12,17,9,-1},{70,3,10,0,9,-1},{70,3,10,0,9,-1},{70,3,7,0,4,-1},{70,3,7,0,4,-1},{70,3,13,0,4,0},{70,3,13,0,4,1},{70,3,13,0,4,2},{70,3,13,0,4,3},{70,3,13,0,4,4},{70,3,13,0,4,5},{70,3,13,0,4,6},{70,3,13,0,4,7},{70,3,13,0,4,8},{70,3,13,0,4,9},{70,3,7,0,9,-1},{70,3,7,0,9,-1},{70,3,7,0,9,-1},{70,3,7,0,9,-1},{70,3,7,0,9,-1},{70,3,7,0,9,-1}}, + {{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1}}, + {{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,7,0,9,-1},{93,3,12,17,9,-1},{93,3,10,0,9,-1},{93,3,12,17,9,-1},{93,3,12,17,9,-1},{93,3,10,0,9,-1},{93,3,10,0,9,-1},{93,3,10,0,9,-1},{93,3,12,17,9,-1},{93,3,10,0,9,-1},{93,3,12,17,9,-1},{93,3,12,17,9,-1},{93,3,12,17,9,-1},{93,3,10,0,9,-1},{93,3,10,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{93,3,21,0,9,-1},{93,3,21,0,9,-1},{93,3,21,0,9,-1},{93,3,21,0,9,-1}}, + {{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1}}, + {{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,10,0,4,-1},{68,3,10,0,4,-1},{68,3,10,0,4,-1},{68,3,10,0,4,-1},{68,3,10,0,4,-1},{68,3,10,0,4,-1},{68,3,10,0,4,-1},{68,3,10,0,4,-1},{68,3,12,17,4,-1},{68,3,12,17,4,-1},{68,3,12,17,4,-1},{68,3,12,17,4,-1},{68,3,12,17,4,-1},{68,3,12,17,4,-1},{68,3,12,17,4,-1},{68,3,12,17,4,-1},{68,3,10,0,4,-1},{68,3,10,0,4,-1},{68,3,12,17,4,-1},{68,3,12,17,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{68,3,21,0,6,-1},{68,3,21,0,6,-1},{68,3,21,0,6,-1},{68,3,21,0,6,-1},{68,3,21,0,6,-1}}, + {{68,3,13,0,4,0},{68,3,13,0,4,1},{68,3,13,0,4,2},{68,3,13,0,4,3},{68,3,13,0,4,4},{68,3,13,0,4,5},{68,3,13,0,4,6},{68,3,13,0,4,7},{68,3,13,0,4,8},{68,3,13,0,4,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{68,3,7,0,4,-1},{73,3,13,0,4,0},{73,3,13,0,4,1},{73,3,13,0,4,2},{73,3,13,0,4,3},{73,3,13,0,4,4},{73,3,13,0,4,5},{73,3,13,0,4,6},{73,3,13,0,4,7},{73,3,13,0,4,8},{73,3,13,0,4,9},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1}}, + {{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,7,0,4,-1},{73,3,6,0,4,-1},{73,3,6,0,4,-1},{73,3,6,0,4,-1},{73,3,6,0,4,-1},{73,3,6,0,4,-1},{73,3,6,0,4,-1},{73,3,21,0,6,-1},{73,3,21,0,6,-1}}, + {{70,3,21,0,9,-1},{70,3,21,0,9,-1},{70,3,21,0,9,-1},{70,3,21,0,9,-1},{70,3,21,0,9,-1},{70,3,21,0,9,-1},{70,3,21,0,9,-1},{70,3,21,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{0,3,21,0,6,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1}}, + {{1,3,12,17,3,-1},{0,3,10,0,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{0,3,7,0,3,-1},{0,3,7,0,3,-1},{0,3,7,0,3,-1},{0,3,7,0,3,-1},{1,3,12,17,3,-1},{0,3,7,0,3,-1},{0,3,7,0,3,-1},{0,3,7,0,3,-1},{0,3,7,0,3,-1},{0,3,10,0,3,-1},{0,3,10,0,9,-1},{1,3,12,17,9,-1},{0,3,7,0,9,-1},{0,3,7,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1}}, + {{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{14,3,5,0,8,-1},{14,3,5,0,8,-1},{14,3,5,0,8,-1},{14,3,5,0,8,-1},{14,3,5,0,8,-1},{8,3,5,0,8,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,8,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,8,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1}}, + {{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,8,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{14,3,6,0,5,-1},{14,3,6,0,5,-1},{14,3,6,0,5,-1}}, + {{14,3,6,0,5,-1},{14,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{14,3,6,0,5,-1},{14,3,6,0,5,-1},{14,3,6,0,5,-1},{14,3,6,0,5,-1},{14,3,6,0,5,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{8,3,6,0,5,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1}}, + {{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1}}, + {{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{14,3,6,0,5,-1}}, + {{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1}}, + {{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{1,3,12,17,9,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1}}, + {{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1}}, + {{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,9,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,1,-1},{25,3,5,0,5,-1},{25,3,5,0,5,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1}}, + {{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1}}, + {{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1}}, + {{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{61,0,2,0,9,-1},{14,3,9,0,1,-1},{61,0,2,0,9,-1},{14,3,9,0,1,-1},{61,0,2,0,9,-1},{14,3,9,0,1,-1},{61,0,2,0,9,-1},{14,3,9,0,1,-1}}, + {{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,5,-1},{14,3,5,0,1,-1},{14,3,5,0,5,-1},{14,3,5,0,1,-1},{14,3,5,0,5,-1},{14,3,5,0,1,-1},{14,3,5,0,5,-1},{14,3,5,0,1,-1},{14,3,5,0,5,-1},{14,3,5,0,1,-1},{14,3,5,0,5,-1},{14,3,5,0,1,-1},{14,3,5,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1}}, + {{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,8,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{61,0,2,0,9,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,5,-1},{14,3,8,0,1,-1},{14,3,24,10,5,-1},{14,3,5,0,5,-1},{14,3,24,10,5,-1}}, + {{14,3,24,10,5,-1},{14,3,24,10,5,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{61,0,2,0,9,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,5,-1},{14,3,9,0,1,-1},{14,3,9,0,5,-1},{14,3,8,0,1,-1},{14,3,24,10,5,-1},{14,3,24,10,5,-1},{14,3,24,10,5,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,5,-1},{61,0,2,0,9,-1},{14,3,24,10,5,-1},{14,3,24,10,5,-1},{14,3,24,10,5,-1}}, + {{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,5,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,5,-1},{14,3,9,0,1,-1},{14,3,24,10,5,-1},{14,3,24,10,5,-1},{14,3,24,10,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{61,0,2,0,9,-1},{14,3,5,0,1,-1},{14,3,5,0,1,-1},{14,3,9,0,1,-1},{14,3,9,0,5,-1},{14,3,9,0,1,-1},{14,3,9,0,5,-1},{14,3,8,0,1,-1},{14,3,24,10,5,-1},{14,3,24,10,5,-1},{61,0,2,0,9,-1}}, + {{0,3,29,9,5,-1},{0,3,29,9,5,-1},{0,3,29,9,5,-1},{0,3,29,9,5,-1},{0,3,29,9,5,-1},{0,3,29,9,5,-1},{0,3,29,9,5,-1},{0,3,29,9,5,-1},{0,3,29,9,5,-1},{0,3,29,9,5,-1},{0,3,29,9,5,-1},{0,3,1,18,2,-1},{1,3,1,18,0,-1},{1,3,1,18,0,-1},{0,3,1,0,2,-1},{0,3,1,1,2,-1},{0,0,17,10,4,-1},{0,3,17,10,5,-1},{0,3,17,10,6,-1},{0,0,17,10,6,-1},{0,0,17,10,6,-1},{0,0,17,10,6,-1},{0,0,21,10,6,-1},{0,3,21,10,5,-1},{0,0,20,10,6,-1},{0,0,19,10,0,-1},{0,3,22,10,6,-1},{0,3,20,10,6,-1},{0,0,20,10,6,-1},{0,0,19,10,6,-1},{0,3,22,10,6,-1},{0,3,20,10,6,-1}}, + {{0,0,21,10,6,-1},{0,0,21,10,6,-1},{0,0,21,10,6,-1},{0,3,21,10,6,-1},{0,0,21,10,5,-1},{0,0,21,10,5,-1},{0,0,21,10,5,-1},{0,0,21,10,4,-1},{0,3,27,9,6,-1},{0,3,28,7,6,-1},{0,3,1,11,2,-1},{0,3,1,14,2,-1},{0,3,1,16,2,-1},{0,3,1,12,2,-1},{0,3,1,15,2,-1},{0,3,29,6,5,-1},{0,0,21,4,6,-1},{0,3,21,4,6,-1},{0,0,21,4,6,-1},{0,0,21,4,5,-1},{0,3,21,4,5,-1},{0,0,21,10,6,-1},{0,3,21,10,5,-1},{0,3,21,10,5,-1},{0,3,21,10,6,-1},{0,3,20,10,6,-1},{0,3,19,10,6,-1},{0,0,21,10,6,-1},{0,3,21,10,5,-1},{0,3,21,10,6,-1},{0,0,21,10,5,-1},{0,3,16,10,8,-1}}, + {{0,3,16,10,8,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,25,6,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,21,10,5,-1},{0,3,21,10,5,-1},{0,3,21,10,5,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,25,10,6,-1},{0,3,21,10,6,-1},{0,3,16,10,4,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,5,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,29,9,5,-1}}, + {{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,15,2,5,0},{25,3,6,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,0,15,2,5,4},{0,3,15,2,5,5},{0,3,15,2,5,6},{0,3,15,2,5,7},{0,3,15,2,5,8},{0,3,15,2,5,9},{0,3,25,3,5,-1},{0,3,25,3,5,-1},{0,3,25,10,5,-1},{0,3,22,10,5,-1},{0,3,18,10,5,-1},{25,0,6,0,5,-1}}, + {{0,3,15,2,5,0},{0,0,15,2,5,1},{0,0,15,2,5,2},{0,0,15,2,5,3},{0,0,15,2,5,4},{0,3,15,2,5,5},{0,3,15,2,5,6},{0,3,15,2,5,7},{0,3,15,2,5,8},{0,3,15,2,5,9},{0,3,25,3,5,-1},{0,3,25,3,5,-1},{0,3,25,10,5,-1},{0,3,22,10,5,-1},{0,3,18,10,5,-1},{61,0,2,0,9,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,6,0,9,-1},{25,3,6,0,9,-1},{25,3,6,0,9,-1},{25,3,6,0,9,-1},{25,3,6,0,9,-1},{25,3,6,0,9,-1},{25,3,6,0,9,-1},{25,3,6,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,5,-1},{0,2,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,0,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,6,-1},{0,3,23,4,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,11,17,6,-1},{1,3,11,17,6,-1},{1,3,11,17,6,-1}}, + {{1,3,11,17,6,-1},{1,3,12,17,3,-1},{1,3,11,17,6,-1},{1,3,11,17,6,-1},{1,3,11,17,6,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,5,-1},{0,3,26,10,5,-1},{0,3,9,0,5,-1},{0,0,26,10,5,-1},{0,3,26,10,6,-1},{0,0,26,10,5,-1},{0,3,26,10,5,-1},{0,3,9,0,5,-1},{0,3,26,10,6,-1},{0,0,26,10,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,0,5,0,5,-1},{0,3,26,10,6,-1},{0,3,9,0,5,-1},{0,0,26,10,5,-1},{0,3,26,10,6,-1},{0,3,25,10,8,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,26,10,5,-1},{0,0,26,10,5,-1},{0,0,26,10,5,-1},{0,3,26,10,6,-1},{0,3,9,0,5,-1},{0,3,26,10,6,-1},{14,0,9,0,5,-1},{0,3,26,10,6,-1},{0,3,9,0,5,-1},{0,3,26,10,6,-1},{25,3,9,0,5,-1},{25,0,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,26,4,8,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{25,3,9,0,3,-1},{0,3,9,0,5,-1},{0,3,5,0,5,-1},{0,3,7,0,5,-1},{0,3,7,0,5,-1},{0,3,7,0,5,-1},{0,3,7,0,5,-1},{0,3,5,0,5,-1},{0,3,26,10,6,-1},{0,3,26,10,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1}}, + {{0,3,25,10,5,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,9,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,26,10,6,-1},{0,3,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{25,3,5,0,3,-1},{0,3,26,0,6,-1},{0,3,15,10,5,-1},{0,3,15,10,5,-1},{0,3,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,3,15,10,5,-1},{0,3,15,10,5,-1},{0,3,15,10,5,-1},{0,3,15,10,5,-1},{0,3,15,10,5,-1},{0,3,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,3,15,10,5,-1}}, + {{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,3,14,0,5,-1},{25,3,14,0,5,-1},{25,3,14,0,5,-1},{25,3,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,0,14,0,5,-1},{25,3,14,0,5,-1},{25,3,14,0,5,-1},{25,3,14,0,5,-1},{25,3,14,0,5,-1},{25,3,14,0,5,-1},{25,3,14,0,5,-1}}, + {{25,3,14,0,3,-1},{25,3,14,0,3,-1},{25,3,14,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,14,0,3,-1},{25,3,14,0,3,-1},{25,3,14,0,3,-1},{25,3,14,0,3,-1},{0,0,15,10,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,25,10,6,-1},{0,3,26,10,6,-1},{0,0,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,3,6,-1},{0,3,25,4,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1}}, + {{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,5,-1},{0,3,25,10,5,-1},{0,0,25,10,6,-1},{0,3,25,10,5,-1},{0,3,25,10,5,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,0,25,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,5,22,10,5,-1},{0,5,18,10,5,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1}}, + {{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1}}, + {{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,10,6,-1},{0,3,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,0,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,0,15,10,5,1},{0,0,15,10,5,2},{0,0,15,10,5,3},{0,0,15,10,5,4},{0,0,15,10,5,5},{0,0,15,10,5,6},{0,0,15,10,5,7},{0,0,15,10,5,8},{0,0,15,10,5,9},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,1},{0,0,15,10,5,2},{0,0,15,10,5,3},{0,0,15,10,5,4},{0,0,15,10,5,5},{0,0,15,10,5,6},{0,0,15,10,5,7},{0,0,15,10,5,8},{0,0,15,10,5,9},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1}}, + {{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,10,5,-1},{0,0,15,2,5,1},{0,0,15,2,5,2},{0,0,15,2,5,3},{0,0,15,2,5,4},{0,0,15,2,5,5},{0,0,15,2,5,6},{0,0,15,2,5,7},{0,0,15,2,5,8},{0,0,15,2,5,9},{0,0,15,2,5,-1},{0,0,15,2,5,-1},{0,0,15,2,5,-1},{0,0,15,2,5,-1},{0,0,15,2,5,-1},{0,0,15,2,5,-1},{0,0,15,2,5,-1},{0,0,15,2,5,-1},{0,0,15,2,5,-1},{0,0,15,2,5,-1},{0,0,15,2,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1}}, + {{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1}}, + {{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,3,15,10,5,0},{0,0,15,10,6,-1},{0,0,15,10,6,-1},{0,0,15,10,6,-1},{0,0,15,10,6,-1},{0,0,15,10,6,-1},{0,0,15,10,6,-1},{0,0,15,10,6,-1},{0,0,15,10,6,-1},{0,0,15,10,6,-1},{0,0,15,10,6,-1},{0,0,15,10,6,1},{0,0,15,10,6,2},{0,0,15,10,6,3},{0,0,15,10,6,4},{0,0,15,10,6,5},{0,0,15,10,6,6},{0,0,15,10,6,7},{0,0,15,10,6,8},{0,0,15,10,6,9},{0,0,15,10,6,-1},{0,0,15,10,6,0}}, + {{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1}}, + {{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1}}, + {{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,0,26,10,6,-1},{0,0,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,0,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,0,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,9,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1}}, + {{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,9,-1},{0,0,26,10,6,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1}}, + {{61,0,2,0,9,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,9,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,9,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,9,-1},{0,3,26,10,6,-1},{0,3,26,10,9,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,9,-1}}, + {{0,3,26,10,9,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,0,15,10,6,1},{0,0,15,10,6,2},{0,0,15,10,6,3},{0,0,15,10,6,4},{0,0,15,10,6,5},{0,0,15,10,6,6},{0,0,15,10,6,7},{0,0,15,10,6,8},{0,0,15,10,6,9},{0,0,15,10,6,-1}}, + {{0,3,15,10,6,1},{0,3,15,10,6,2},{0,3,15,10,6,3},{0,3,15,10,6,4},{0,3,15,10,6,5},{0,3,15,10,6,6},{0,3,15,10,6,7},{0,3,15,10,6,8},{0,3,15,10,6,9},{0,3,15,10,6,-1},{0,3,15,10,6,1},{0,3,15,10,6,2},{0,3,15,10,6,3},{0,3,15,10,6,4},{0,3,15,10,6,5},{0,3,15,10,6,6},{0,3,15,10,6,7},{0,3,15,10,6,8},{0,3,15,10,6,9},{0,3,15,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,9,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,9,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,9,-1},{0,3,25,10,6,-1},{0,3,25,10,9,-1},{0,3,25,10,9,-1},{0,3,25,10,9,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,4,22,10,6,-1},{0,4,18,10,6,-1},{0,4,22,10,6,-1},{0,4,18,10,6,-1},{0,4,22,10,6,-1},{0,4,18,10,6,-1},{0,4,22,10,6,-1},{0,4,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1},{46,3,26,0,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,4,22,10,6,-1},{0,4,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,5,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,5,-1},{0,3,25,10,5,-1},{0,3,25,10,5,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,5,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1}}, + {{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{0,3,25,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{0,0,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1}}, + {{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{56,3,9,0,3,-1},{61,0,2,0,9,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1}}, + {{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{56,3,5,0,3,-1},{61,0,2,0,9,-1}}, + {{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,8,-1},{25,3,9,0,8,-1},{25,3,9,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,3,-1},{25,3,9,0,3,-1},{25,3,9,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,5,0,8,-1},{25,3,6,0,5,-1},{25,3,6,0,5,-1},{25,3,9,0,3,-1},{25,3,9,0,3,-1}}, + {{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1}}, + {{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,5,0,3,-1},{7,3,26,10,6,-1},{7,3,26,10,6,-1},{7,3,26,10,6,-1},{7,3,26,10,6,-1},{7,3,26,10,6,-1},{7,3,26,10,6,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,9,0,3,-1},{7,3,5,0,3,-1},{7,3,12,17,3,-1},{7,3,12,17,3,-1},{7,3,12,17,3,-1},{7,3,9,0,9,-1},{7,3,5,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{7,3,21,10,6,-1},{7,3,21,10,6,-1},{7,3,21,10,6,-1},{7,3,21,10,6,-1},{7,3,15,10,6,-1},{7,3,21,10,6,-1},{7,3,21,10,6,-1}}, + {{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1}}, + {{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{12,3,5,0,3,-1},{61,0,2,0,9,-1},{12,3,5,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{12,3,5,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1}}, + {{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1}}, + {{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,1,-1},{57,3,7,0,9,-1},{57,3,7,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{57,3,6,0,5,-1},{57,3,21,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{57,3,12,17,9,-1}}, + {{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{11,3,7,0,1,-1},{61,0,2,0,9,-1}}, + {{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1},{8,3,12,17,3,-1}}, + {{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,20,10,6,-1},{0,3,19,10,6,-1},{0,3,20,10,6,-1},{0,3,19,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,20,10,6,-1},{0,3,19,10,6,-1},{0,3,21,10,6,-1},{0,3,20,10,6,-1},{0,3,19,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,17,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,17,10,6,-1},{0,3,21,10,6,-1},{0,3,20,10,6,-1},{0,3,19,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1}}, + {{0,3,20,10,6,-1},{0,3,19,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,6,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,6,-1},{0,3,21,10,9,-1},{0,3,21,10,9,-1},{0,3,21,10,9,-1},{0,3,21,10,9,-1},{0,3,21,10,9,-1},{0,3,21,10,9,-1},{0,3,21,10,9,-1},{0,3,21,10,9,-1},{0,3,17,10,9,-1},{0,3,17,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{61,0,2,0,9,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,5,-1}}, + {{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1}}, + {{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,6,-1},{17,5,26,10,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1}}, + {{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{17,5,26,10,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,1,29,9,5,-1},{0,5,21,10,6,-1},{0,5,21,10,6,-1},{0,5,21,10,6,-1},{0,5,26,10,6,-1},{17,5,6,0,1,-1},{0,5,7,0,1,-1},{17,5,14,0,1,-1},{0,5,22,10,6,-1},{0,5,18,10,6,-1},{0,5,22,10,6,-1},{0,5,18,10,6,-1},{0,5,22,10,6,-1},{0,5,18,10,6,-1},{0,5,22,10,6,-1},{0,5,18,10,6,-1},{0,5,22,10,6,-1},{0,5,18,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,22,10,6,-1},{0,5,18,10,6,-1},{0,5,22,10,6,-1},{0,5,18,10,6,-1},{0,5,22,10,6,-1},{0,5,18,10,6,-1},{0,5,22,10,6,-1},{0,5,18,10,6,-1},{0,5,17,10,6,-1},{0,5,22,10,6,-1},{0,5,18,10,6,-1},{0,5,18,10,6,-1}}, + {{0,5,26,10,6,-1},{17,5,14,0,8,-1},{17,5,14,0,8,-1},{17,5,14,0,8,-1},{17,5,14,0,8,-1},{17,5,14,0,8,-1},{17,5,14,0,8,-1},{17,5,14,0,8,-1},{17,5,14,0,8,-1},{17,5,14,0,8,-1},{1,5,12,17,8,-1},{1,5,12,17,8,-1},{1,5,12,17,8,-1},{1,5,12,17,8,-1},{18,5,10,0,8,-1},{18,5,10,0,8,-1},{0,5,17,10,6,-1},{0,5,6,0,8,-1},{0,5,6,0,8,-1},{0,5,6,0,8,-1},{0,5,6,0,8,-1},{0,5,6,0,8,-1},{0,5,26,10,5,-1},{0,5,26,10,6,-1},{17,5,14,0,5,-1},{17,5,14,0,5,-1},{17,5,14,0,5,-1},{17,5,6,0,8,-1},{0,5,7,0,8,-1},{0,5,21,10,6,-1},{0,5,26,10,6,-1},{0,3,26,10,6,-1}}, + {{61,0,2,0,9,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1}}, + {{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1}}, + {{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{20,5,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{1,5,12,17,1,-1},{1,5,12,17,1,-1},{0,5,24,10,5,-1},{0,5,24,10,5,-1},{20,5,6,0,1,-1},{20,5,6,0,1,-1},{20,5,7,0,5,-1}}, + {{0,5,17,10,4,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1}}, + {{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1}}, + {{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{22,5,7,0,1,-1},{0,5,21,10,4,-1},{0,5,6,0,1,-1},{22,5,6,0,1,-1},{22,5,6,0,1,-1},{22,5,7,0,5,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1}}, + {{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1}}, + {{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1}}, + {{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,2,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1}}, + {{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{18,5,7,0,5,-1},{61,0,2,0,9,-1},{0,5,26,0,6,-1},{0,5,26,0,6,-1},{0,5,15,0,5,-1},{0,5,15,0,5,-1},{0,5,15,0,5,-1},{0,5,15,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1}}, + {{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,1,-1},{5,5,7,0,9,-1},{5,5,7,0,9,-1},{5,5,7,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1}}, + {{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{0,5,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1},{22,5,7,0,8,-1}}, + {{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,10,5,-1},{18,5,26,10,5,-1},{61,0,2,0,9,-1}}, + {{0,5,15,0,5,-1},{0,5,15,0,5,-1},{0,5,15,0,5,-1},{0,5,15,0,5,-1},{0,5,15,0,5,-1},{0,5,15,0,5,-1},{0,5,15,0,5,-1},{0,5,15,0,5,-1},{0,5,15,0,5,-1},{0,5,15,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1}}, + {{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,0,15,0,6,-1},{0,0,15,0,6,-1},{0,0,15,0,6,-1},{0,0,15,0,6,-1},{0,0,15,0,6,-1},{0,0,15,0,6,-1},{0,0,15,0,6,-1},{0,0,15,0,6,-1},{0,5,26,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1}}, + {{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,0,5,-1},{18,5,26,10,5,-1},{18,5,26,10,5,-1},{18,5,26,10,5,-1},{0,5,26,0,6,-1}}, + {{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1},{0,5,15,10,5,-1}}, + {{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,10,5,-1},{0,5,26,10,5,-1},{0,5,26,10,5,-1},{0,5,26,10,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1}}, + {{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{61,0,2,0,9,-1}}, + {{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1}}, + {{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{22,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1}}, + {{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,10,5,-1},{0,5,26,10,5,-1},{0,5,26,10,5,-1},{0,5,26,10,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1}}, + {{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1}}, + {{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,10,5,-1},{0,5,26,10,5,-1}}, + {{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,10,5,-1}}, + {{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1}}, + {{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1}}, + {{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1}}, + {{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1}}, + {{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,6,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1}}, + {{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1}}, + {{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{41,5,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1}}, + {{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1}}, + {{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{41,5,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1}}, + {{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,7,0,4,-1},{86,3,6,0,4,-1},{86,3,6,0,4,-1},{86,3,6,0,4,-1},{86,3,6,0,4,-1},{86,3,6,0,4,-1},{86,3,6,0,4,-1},{86,3,21,0,6,-1},{86,3,21,0,6,-1}}, + {{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1}}, + {{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,6,0,4,-1},{74,3,21,10,6,-1},{74,3,21,10,6,-1},{74,3,21,10,6,-1},{74,3,7,0,3,-1},{74,3,7,0,3,-1},{74,3,7,0,3,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1},{74,3,7,0,4,-1}}, + {{74,3,13,0,4,0},{74,3,13,0,4,1},{74,3,13,0,4,2},{74,3,13,0,4,3},{74,3,13,0,4,4},{74,3,13,0,4,5},{74,3,13,0,4,6},{74,3,13,0,4,7},{74,3,13,0,4,8},{74,3,13,0,4,9},{74,3,7,0,3,-1},{74,3,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{8,3,9,0,9,-1},{8,3,5,0,9,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,7,0,3,-1},{8,3,12,17,4,-1},{8,3,11,17,6,-1},{8,3,11,17,6,-1},{8,3,11,17,6,-1},{8,3,21,10,6,-1},{8,3,12,17,9,-1},{8,3,12,17,9,-1},{8,3,12,17,9,-1},{8,3,12,17,9,-1},{8,3,12,17,9,-1},{8,3,12,17,9,-1},{8,3,12,17,9,-1},{8,3,12,17,9,-1},{8,3,12,17,4,-1},{8,3,12,17,4,-1},{8,3,21,10,6,-1},{8,3,6,10,1,-1}}, + {{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{8,3,9,0,3,-1},{8,3,5,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{8,3,12,17,9,-1}}, + {{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1}}, + {{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,7,0,4,-1},{79,3,14,0,4,-1},{79,3,14,0,4,-1},{79,3,14,0,4,-1},{79,3,14,0,4,-1},{79,3,14,0,4,-1},{79,3,14,0,4,-1},{79,3,14,0,4,-1},{79,3,14,0,4,-1},{79,3,14,0,4,-1},{79,3,14,0,4,-1},{79,3,12,17,4,-1},{79,3,12,17,4,-1},{79,3,21,0,6,-1},{79,3,21,0,6,-1},{79,3,21,0,6,-1},{79,3,21,0,6,-1},{79,3,21,0,6,-1},{79,3,21,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,24,10,6,-1},{0,3,6,10,1,-1},{0,3,6,10,1,-1},{0,3,6,10,1,-1},{0,3,6,10,1,-1},{0,3,6,10,1,-1},{0,3,6,10,1,-1},{0,3,6,10,1,-1},{0,3,6,10,1,-1},{0,3,6,10,1,-1}}, + {{0,3,24,10,6,-1},{0,3,24,10,6,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,5,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1}}, + {{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1}}, + {{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,6,0,5,-1},{25,3,5,0,3,-1},{25,3,5,0,3,-1},{25,3,5,0,3,-1},{25,3,5,0,3,-1},{25,3,5,0,3,-1},{25,3,5,0,3,-1},{25,3,5,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1}}, + {{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{25,3,9,0,3,-1},{25,3,5,0,3,-1},{0,3,6,10,1,-1},{0,3,24,0,6,-1},{0,3,24,0,6,-1},{25,3,9,0,4,-1},{25,3,5,0,4,-1},{25,3,9,0,9,-1},{25,3,5,0,9,-1},{61,0,2,0,9,-1},{25,3,9,0,9,-1},{25,3,5,0,9,-1},{25,3,9,0,9,-1},{25,3,5,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{25,3,9,0,9,-1},{25,3,5,0,9,-1},{25,3,9,0,9,-1},{25,3,5,0,9,-1},{25,3,9,0,9,-1},{25,3,5,0,9,-1},{25,3,9,0,9,-1},{25,3,5,0,9,-1},{25,3,9,0,9,-1},{25,3,5,0,9,-1},{25,3,9,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{25,3,6,0,9,-1},{25,3,6,0,9,-1},{25,3,5,0,9,-1},{25,3,7,0,3,-1},{25,3,7,0,3,-1},{25,3,7,0,3,-1},{25,3,7,0,3,-1},{25,3,7,0,3,-1}}, + {{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,12,17,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,12,17,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,12,17,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1}}, + {{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,7,0,4,-1},{58,3,10,0,4,-1},{58,3,10,0,4,-1},{58,3,12,17,4,-1},{58,3,12,17,4,-1},{58,3,10,0,4,-1},{58,3,26,10,6,-1},{58,3,26,10,6,-1},{58,3,26,10,6,-1},{58,3,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,23,4,6,-1},{0,3,26,4,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1}}, + {{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,7,0,3,-1},{65,3,21,10,6,-1},{65,3,21,10,6,-1},{65,3,21,10,6,-1},{65,3,21,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1}}, + {{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,7,0,4,-1},{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,10,0,4,-1}}, + {{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,10,0,4,-1},{71,3,12,17,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{71,3,21,0,6,-1},{71,3,21,0,6,-1},{71,3,13,0,4,0},{71,3,13,0,4,1},{71,3,13,0,4,2},{71,3,13,0,4,3},{71,3,13,0,4,4},{71,3,13,0,4,5},{71,3,13,0,4,6},{71,3,13,0,4,7},{71,3,13,0,4,8},{71,3,13,0,4,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,12,17,3,-1},{10,3,7,0,3,-1},{10,3,7,0,3,-1},{10,3,7,0,3,-1},{10,3,7,0,3,-1},{10,3,7,0,3,-1},{10,3,7,0,3,-1},{10,3,21,0,6,-1},{10,3,21,0,6,-1},{10,3,21,0,6,-1},{10,3,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{67,3,13,0,4,0},{67,3,13,0,4,1},{67,3,13,0,4,2},{67,3,13,0,4,3},{67,3,13,0,4,4},{67,3,13,0,4,5},{67,3,13,0,4,6},{67,3,13,0,4,7},{67,3,13,0,4,8},{67,3,13,0,4,9},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1}}, + {{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,7,0,4,-1},{67,3,12,17,4,-1},{67,3,12,17,4,-1},{67,3,12,17,4,-1},{67,3,12,17,4,-1},{67,3,12,17,4,-1},{67,3,12,17,4,-1},{67,3,12,17,4,-1},{67,3,12,17,4,-1},{67,3,21,0,6,-1},{67,3,21,0,6,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1}}, + {{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,7,0,3,-1},{69,3,12,17,3,-1},{69,3,12,17,3,-1},{69,3,12,17,3,-1},{69,3,12,17,3,-1},{69,3,12,17,3,-1},{69,3,12,17,3,-1},{69,3,12,17,3,-1},{69,3,12,17,3,-1},{69,3,12,17,3,-1},{69,3,12,17,3,-1},{69,3,12,17,3,-1},{69,3,10,0,3,-1},{69,3,10,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{69,3,21,0,6,-1}}, + {{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{84,3,12,17,4,-1},{84,3,12,17,4,-1},{84,3,12,17,4,-1},{84,3,10,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1}}, + {{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,7,0,4,-1},{84,3,12,17,4,-1},{84,3,10,0,4,-1},{84,3,10,0,4,-1},{84,3,12,17,4,-1},{84,3,12,17,4,-1},{84,3,12,17,4,-1},{84,3,12,17,4,-1},{84,3,10,0,4,-1},{84,3,10,0,4,-1},{84,3,12,17,4,-1},{84,3,10,0,4,-1},{84,3,10,0,4,-1},{84,3,10,0,4,-1}}, + {{84,3,10,0,4,-1},{84,3,21,0,6,-1},{84,3,21,0,6,-1},{84,3,21,0,6,-1},{84,3,21,0,6,-1},{84,3,21,0,6,-1},{84,3,21,0,6,-1},{84,3,21,0,6,-1},{84,3,21,0,6,-1},{84,3,21,0,6,-1},{84,3,21,0,6,-1},{84,3,21,0,6,-1},{84,3,21,0,6,-1},{84,3,21,0,6,-1},{61,0,2,0,9,-1},{84,3,6,0,4,-1},{84,3,13,0,4,0},{84,3,13,0,4,1},{84,3,13,0,4,2},{84,3,13,0,4,3},{84,3,13,0,4,4},{84,3,13,0,4,5},{84,3,13,0,4,6},{84,3,13,0,4,7},{84,3,13,0,4,8},{84,3,13,0,4,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{84,3,21,0,6,-1},{84,3,21,0,6,-1}}, + {{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1}}, + {{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,12,17,4,-1},{72,3,12,17,4,-1},{72,3,12,17,4,-1},{72,3,12,17,4,-1},{72,3,12,17,4,-1},{72,3,12,17,4,-1},{72,3,10,0,4,-1},{72,3,10,0,4,-1},{72,3,12,17,4,-1},{72,3,12,17,4,-1},{72,3,10,0,4,-1},{72,3,10,0,4,-1},{72,3,12,17,4,-1},{72,3,12,17,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,12,17,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,7,0,4,-1},{72,3,12,17,4,-1},{72,3,10,0,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{72,3,13,0,4,0},{72,3,13,0,4,1},{72,3,13,0,4,2},{72,3,13,0,4,3},{72,3,13,0,4,4},{72,3,13,0,4,5},{72,3,13,0,4,6},{72,3,13,0,4,7},{72,3,13,0,4,8},{72,3,13,0,4,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{72,3,21,0,6,-1},{72,3,21,0,6,-1},{72,3,21,0,6,-1},{72,3,21,0,6,-1}}, + {{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,6,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,7,0,1,-1},{28,3,26,0,6,-1},{28,3,26,0,6,-1},{28,3,26,0,6,-1},{28,3,7,0,1,-1},{28,3,10,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1}}, + {{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,12,17,4,-1},{92,3,7,0,4,-1},{92,3,12,17,4,-1},{92,3,12,17,4,-1},{92,3,12,17,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,12,17,4,-1},{92,3,12,17,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,12,17,4,-1},{92,3,12,17,4,-1}}, + {{92,3,7,0,4,-1},{92,3,12,17,4,-1},{92,3,7,0,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{92,3,7,0,4,-1},{92,3,7,0,4,-1},{92,3,6,0,4,-1},{92,3,21,0,6,-1},{92,3,21,0,6,-1}}, + {{87,3,7,0,9,-1},{87,3,7,0,9,-1},{87,3,7,0,9,-1},{87,3,7,0,9,-1},{87,3,7,0,9,-1},{87,3,7,0,9,-1},{87,3,7,0,9,-1},{87,3,7,0,9,-1},{87,3,7,0,9,-1},{87,3,7,0,9,-1},{87,3,7,0,9,-1},{87,3,10,0,9,-1},{87,3,12,17,9,-1},{87,3,12,17,9,-1},{87,3,10,0,9,-1},{87,3,10,0,9,-1},{87,3,21,0,9,-1},{87,3,21,0,9,-1},{87,3,7,0,9,-1},{87,3,6,0,9,-1},{87,3,6,0,9,-1},{87,3,10,0,9,-1},{87,3,12,17,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{61,0,2,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{11,3,7,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1}}, + {{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,7,0,4,-1},{87,3,10,0,4,-1},{87,3,10,0,4,-1},{87,3,12,17,4,-1},{87,3,10,0,4,-1},{87,3,10,0,4,-1},{87,3,12,17,4,-1},{87,3,10,0,4,-1},{87,3,10,0,4,-1},{87,3,21,0,6,-1},{87,3,10,0,4,-1},{87,3,12,17,4,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{87,3,13,0,4,0},{87,3,13,0,4,1},{87,3,13,0,4,2},{87,3,13,0,4,3},{87,3,13,0,4,4},{87,3,13,0,4,5},{87,3,13,0,4,6},{87,3,13,0,4,7},{87,3,13,0,4,8},{87,3,13,0,4,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1}}, + {{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{18,5,7,0,1,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1}}, + {{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1}}, + {{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{18,5,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1},{61,3,4,0,9,-1}}, + {{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1}}, + {{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1}}, + {{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,5,-1},{17,5,7,0,1,-1},{17,5,7,0,5,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,1,-1}}, + {{17,5,7,0,5,-1},{17,5,7,0,1,-1},{17,5,7,0,5,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1}}, + {{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1}}, + {{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1}}, + {{25,3,5,0,5,-1},{25,3,5,0,5,-1},{25,3,5,0,5,-1},{25,3,5,0,5,-1},{25,3,5,0,5,-1},{25,3,5,0,5,-1},{25,3,5,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{3,3,5,0,5,-1},{3,3,5,0,5,-1},{3,3,5,0,5,-1},{3,3,5,0,5,-1},{3,3,5,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{19,3,7,1,5,-1},{19,3,12,17,4,-1},{19,3,7,1,5,-1}}, + {{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,25,3,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{61,0,2,1,9,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{61,0,2,1,9,-1},{19,3,7,1,5,-1},{61,0,2,1,9,-1}}, + {{19,3,7,1,5,-1},{19,3,7,1,5,-1},{61,0,2,1,9,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{61,0,2,1,9,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{19,3,7,1,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1}}, + {{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1}}, + {{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,24,13,9,-1},{2,3,24,13,9,-1},{2,3,24,13,9,-1},{2,3,24,13,9,-1},{2,3,24,13,9,-1},{2,3,24,13,9,-1},{2,3,24,13,9,-1},{2,3,24,13,9,-1},{2,3,24,13,9,-1},{2,3,24,13,9,-1},{2,3,24,13,9,-1},{2,3,24,13,9,-1},{2,3,24,13,9,-1},{2,3,24,13,9,-1}}, + {{2,3,24,13,9,-1},{2,3,24,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1}}, + {{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{0,3,22,10,6,-1},{0,3,18,10,6,-1}}, + {{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1}}, + {{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1}}, + {{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,23,13,5,-1},{0,3,26,10,6,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1}}, + {{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{0,5,21,10,5,-1},{0,5,21,10,5,-1},{0,5,21,10,5,-1},{0,5,21,10,5,-1},{0,5,21,10,5,-1},{0,5,21,10,5,-1},{0,5,21,10,5,-1},{0,5,22,10,5,-1},{0,5,18,10,5,-1},{0,5,21,10,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{1,3,12,17,8,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,5,21,10,5,-1},{0,5,17,10,5,-1},{0,5,17,10,5,-1},{0,5,16,10,5,-1},{0,5,16,10,5,-1},{0,5,22,10,5,-1},{0,5,18,10,5,-1},{0,5,22,10,5,-1},{0,5,18,10,5,-1},{0,5,22,10,5,-1},{0,5,18,10,5,-1},{0,5,22,10,5,-1},{0,5,18,10,5,-1},{0,5,22,10,5,-1},{0,5,18,10,5,-1},{0,5,22,10,5,-1}}, + {{0,5,18,10,5,-1},{0,5,22,10,5,-1},{0,5,18,10,5,-1},{0,5,22,10,5,-1},{0,5,18,10,5,-1},{0,5,21,10,6,-1},{0,5,21,10,6,-1},{0,5,22,10,5,-1},{0,5,18,10,5,-1},{0,5,21,10,5,-1},{0,5,21,10,5,-1},{0,5,21,10,5,-1},{0,5,21,10,5,-1},{0,5,16,10,5,-1},{0,5,16,10,5,-1},{0,5,16,10,5,-1},{0,5,21,6,5,-1},{0,5,21,10,5,-1},{0,5,21,6,5,-1},{61,0,2,0,9,-1},{0,5,21,10,5,-1},{0,5,21,6,5,-1},{0,5,21,10,5,-1},{0,5,21,10,5,-1},{0,5,17,10,5,-1},{0,5,22,10,5,-1},{0,5,18,10,5,-1},{0,5,22,10,5,-1},{0,5,18,10,5,-1},{0,5,22,10,5,-1},{0,5,18,10,5,-1},{0,5,21,4,5,-1}}, + {{0,5,21,10,5,-1},{0,5,21,10,5,-1},{0,5,25,3,5,-1},{0,5,17,3,5,-1},{0,5,25,10,5,-1},{0,5,25,10,5,-1},{0,5,25,10,5,-1},{61,0,2,0,9,-1},{0,5,21,10,5,-1},{0,5,23,4,5,-1},{0,5,21,4,5,-1},{0,5,21,10,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,8,-1},{2,3,7,13,5,-1},{61,0,2,13,9,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1}}, + {{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{2,3,7,13,5,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{0,3,1,18,2,-1}}, + {{61,0,2,0,9,-1},{0,1,21,10,5,-1},{0,1,21,10,5,-1},{0,1,21,4,5,-1},{0,1,23,4,5,-1},{0,1,21,4,5,-1},{0,1,21,10,5,-1},{0,1,21,10,5,-1},{0,1,22,10,5,-1},{0,1,18,10,5,-1},{0,1,21,10,5,-1},{0,1,25,3,5,-1},{0,1,21,6,5,-1},{0,1,17,3,5,-1},{0,1,21,6,5,-1},{0,1,21,6,5,-1},{0,1,13,2,5,0},{0,1,13,2,5,1},{0,1,13,2,5,2},{0,1,13,2,5,3},{0,1,13,2,5,4},{0,1,13,2,5,5},{0,1,13,2,5,6},{0,1,13,2,5,7},{0,1,13,2,5,8},{0,1,13,2,5,9},{0,1,21,6,5,-1},{0,1,21,10,5,-1},{0,1,25,10,5,-1},{0,1,25,10,5,-1},{0,1,25,10,5,-1},{0,1,21,10,5,-1}}, + {{0,1,21,10,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{25,1,9,0,5,-1},{0,1,22,10,5,-1},{0,1,21,10,5,-1},{0,1,18,10,5,-1},{0,1,24,10,5,-1},{0,1,16,10,5,-1}}, + {{0,1,24,10,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{25,1,5,0,5,-1},{0,1,22,10,5,-1},{0,1,25,10,5,-1},{0,1,18,10,5,-1},{0,1,25,10,5,-1},{0,1,22,10,5,-1}}, + {{0,1,18,10,5,-1},{0,2,21,10,5,-1},{0,2,22,10,5,-1},{0,2,18,10,5,-1},{0,2,21,10,5,-1},{0,2,21,10,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{0,2,6,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1}}, + {{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{22,2,7,0,5,-1},{0,2,6,0,5,-1},{0,2,6,0,5,-1}}, + {{18,2,7,0,2,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{18,2,7,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,1,23,4,5,-1},{0,1,23,4,5,-1},{0,1,25,10,5,-1},{0,1,24,10,5,-1},{0,1,26,10,5,-1},{0,1,23,4,5,-1},{0,1,23,4,5,-1},{61,0,2,0,9,-1},{0,2,26,10,5,-1},{0,2,25,10,5,-1},{0,2,25,10,5,-1},{0,2,25,10,5,-1},{0,2,25,10,5,-1},{0,2,26,10,5,-1},{0,2,26,10,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,1,10,6,-1},{0,3,1,10,6,-1},{0,3,1,10,6,-1},{0,3,26,10,6,-1},{0,0,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{61,0,2,0,9,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1}}, + {{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{61,0,2,0,9,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{61,0,2,0,9,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{61,0,2,0,9,-1},{51,3,7,0,3,-1}}, + {{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1}}, + {{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{51,3,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,21,0,6,-1},{0,3,21,10,6,-1},{0,3,21,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1}}, + {{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1}}, + {{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1}}, + {{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,14,10,3,-1},{14,3,15,10,6,-1},{14,3,15,10,6,-1},{14,3,15,10,6,-1},{14,3,15,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1}}, + {{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,15,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1}}, + {{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{1,3,12,17,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{76,3,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1}}, + {{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{75,3,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{30,3,7,0,3,-1},{61,0,2,0,9,-1}}, + {{30,3,15,0,6,-1},{30,3,15,0,6,-1},{30,3,15,0,6,-1},{30,3,15,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1}}, + {{13,3,7,0,3,-1},{13,3,14,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,7,0,3,-1},{13,3,14,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{53,3,7,0,3,-1},{61,0,2,0,9,-1},{53,3,21,0,6,-1}}, + {{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1}}, + {{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,7,0,3,-1},{59,3,21,0,6,-1},{59,3,14,0,3,-1},{59,3,14,0,3,-1},{59,3,14,0,3,-1},{59,3,14,0,3,-1},{59,3,14,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1}}, + {{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,9,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1}}, + {{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{9,3,5,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1}}, + {{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1},{50,3,7,0,3,-1}}, + {{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{49,3,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{49,3,13,0,3,0},{49,3,13,0,3,1},{49,3,13,0,3,2},{49,3,13,0,3,3},{49,3,13,0,3,4},{49,3,13,0,3,5},{49,3,13,0,3,6},{49,3,13,0,3,7},{49,3,13,0,3,8},{49,3,13,0,3,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{47,3,7,1,3,-1},{61,0,2,1,9,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1}}, + {{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{61,0,2,1,9,-1},{47,3,7,1,3,-1},{47,3,7,1,3,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{47,3,7,1,3,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{47,3,7,1,3,-1}}, + {{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{81,3,7,1,3,-1},{61,0,2,1,9,-1},{81,3,21,1,6,-1},{81,3,15,1,6,-1},{81,3,15,1,6,-1},{81,3,15,1,6,-1},{81,3,15,1,6,-1},{81,3,15,1,6,-1},{81,3,15,1,6,-1},{81,3,15,1,6,-1},{81,3,15,1,6,-1}}, + {{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,7,1,3,-1},{64,3,15,1,6,-1},{64,3,15,1,6,-1},{64,3,15,1,6,-1},{64,3,15,1,6,-1},{64,3,15,1,6,-1},{64,3,15,1,6,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{64,3,21,10,6,-1}}, + {{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{77,3,7,1,3,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{77,3,21,1,6,-1}}, + {{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1},{98,3,7,1,9,-1}}, + {{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{97,3,7,1,9,-1},{97,3,7,1,9,-1}}, + {{60,3,7,1,3,-1},{60,3,12,17,3,-1},{60,3,12,17,3,-1},{60,3,12,17,3,-1},{61,0,2,1,9,-1},{60,3,12,17,3,-1},{60,3,12,17,3,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{60,3,12,17,3,-1},{60,3,12,17,3,-1},{60,3,12,17,3,-1},{60,3,12,17,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{61,0,2,1,9,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{61,0,2,1,9,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1}}, + {{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{60,3,7,1,3,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{60,3,12,17,3,-1},{60,3,12,17,3,-1},{60,3,12,17,3,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{60,3,12,17,3,-1}}, + {{60,3,15,1,6,1},{60,3,15,1,6,2},{60,3,15,1,6,3},{60,3,15,1,6,4},{60,3,15,1,6,-1},{60,3,15,1,6,-1},{60,3,15,1,6,-1},{60,3,15,1,6,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{60,3,21,1,6,-1},{60,3,21,1,6,-1},{60,3,21,1,6,-1},{60,3,21,1,6,-1},{60,3,21,1,6,-1},{60,3,21,1,6,-1},{60,3,21,1,6,-1},{60,3,21,1,6,-1},{60,3,21,1,6,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1}}, + {{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,7,1,3,-1},{88,3,15,1,6,-1},{88,3,15,1,6,-1},{88,3,21,1,6,-1}}, + {{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1}}, + {{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{78,3,7,1,3,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{78,3,21,10,6,-1},{78,3,21,10,6,-1},{78,3,21,10,6,-1},{78,3,21,10,6,-1},{78,3,21,10,6,-1},{78,3,21,10,6,-1},{78,3,21,10,6,-1}}, + {{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{83,3,7,1,3,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{83,3,15,1,6,-1},{83,3,15,1,6,-1},{83,3,15,1,6,-1},{83,3,15,1,6,-1},{83,3,15,1,6,-1},{83,3,15,1,6,-1},{83,3,15,1,6,-1},{83,3,15,1,6,-1}}, + {{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{82,3,7,1,3,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{82,3,15,1,6,-1},{82,3,15,1,6,-1},{82,3,15,1,6,-1},{82,3,15,1,6,-1},{82,3,15,1,6,-1},{82,3,15,1,6,-1},{82,3,15,1,6,-1},{82,3,15,1,6,-1}}, + {{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1}}, + {{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{89,3,7,1,3,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1},{61,0,2,1,9,-1}}, + {{2,3,15,5,6,1},{2,3,15,5,6,2},{2,3,15,5,6,3},{2,3,15,5,6,4},{2,3,15,5,6,5},{2,3,15,5,6,6},{2,3,15,5,6,7},{2,3,15,5,6,8},{2,3,15,5,6,9},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{2,3,15,5,6,-1},{61,0,2,1,9,-1}}, + {{94,3,10,0,9,-1},{94,3,12,17,9,-1},{94,3,10,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1}}, + {{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,7,0,9,-1},{94,3,12,17,9,-1},{94,3,12,17,9,-1},{94,3,12,17,9,-1},{94,3,12,17,9,-1},{94,3,12,17,9,-1},{94,3,12,17,9,-1},{94,3,12,17,9,-1},{94,3,12,17,9,-1}}, + {{94,3,12,17,9,-1},{94,3,12,17,9,-1},{94,3,12,17,9,-1},{94,3,12,17,9,-1},{94,3,12,17,9,-1},{94,3,12,17,9,-1},{94,3,12,17,9,-1},{94,3,21,0,9,-1},{94,3,21,0,9,-1},{94,3,21,0,9,-1},{94,3,21,0,9,-1},{94,3,21,0,9,-1},{94,3,21,0,9,-1},{94,3,21,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{94,3,15,10,9,1},{94,3,15,10,9,2},{94,3,15,10,9,3},{94,3,15,10,9,4},{94,3,15,10,9,5},{94,3,15,10,9,6},{94,3,15,10,9,7},{94,3,15,10,9,8},{94,3,15,10,9,9},{94,3,15,10,9,-1},{94,3,15,10,9,-1},{94,3,15,10,9,-1},{94,3,15,10,9,-1},{94,3,15,10,9,-1}}, + {{94,3,15,10,9,-1},{94,3,15,10,9,-1},{94,3,15,10,9,-1},{94,3,15,10,9,-1},{94,3,15,10,9,-1},{94,3,15,10,9,-1},{94,3,13,0,9,0},{94,3,13,0,9,1},{94,3,13,0,9,2},{94,3,13,0,9,3},{94,3,13,0,9,4},{94,3,13,0,9,5},{94,3,13,0,9,6},{94,3,13,0,9,7},{94,3,13,0,9,8},{94,3,13,0,9,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{85,3,12,17,3,-1},{85,3,12,17,3,-1},{85,3,10,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1}}, + {{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,7,0,3,-1},{85,3,10,0,3,-1},{85,3,10,0,3,-1},{85,3,10,0,3,-1},{85,3,12,17,3,-1},{85,3,12,17,3,-1},{85,3,12,17,3,-1},{85,3,12,17,3,-1},{85,3,10,0,3,-1},{85,3,10,0,3,-1},{85,3,12,17,3,-1},{85,3,12,17,3,-1},{85,3,21,0,6,-1},{85,3,21,0,6,-1},{85,3,1,0,6,-1},{85,3,21,0,6,-1},{85,3,21,0,6,-1}}, + {{85,3,21,0,6,-1},{85,3,21,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1}}, + {{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{101,3,7,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{101,3,13,0,9,0},{101,3,13,0,9,1},{101,3,13,0,9,2},{101,3,13,0,9,3},{101,3,13,0,9,4},{101,3,13,0,9,5},{101,3,13,0,9,6},{101,3,13,0,9,7},{101,3,13,0,9,8},{101,3,13,0,9,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{96,3,12,17,9,-1},{96,3,12,17,9,-1},{96,3,12,17,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1}}, + {{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,7,0,9,-1},{96,3,12,17,9,-1},{96,3,12,17,9,-1},{96,3,12,17,9,-1},{96,3,12,17,9,-1},{96,3,12,17,9,-1},{96,3,10,0,9,-1},{96,3,12,17,9,-1},{96,3,12,17,9,-1},{96,3,12,17,9,-1},{96,3,12,17,9,-1},{96,3,12,17,9,-1},{96,3,12,17,9,-1},{96,3,12,17,9,-1},{96,3,12,17,9,-1},{61,0,2,0,9,-1},{96,3,13,0,9,0},{96,3,13,0,9,1},{96,3,13,0,9,2},{96,3,13,0,9,3},{96,3,13,0,9,4},{96,3,13,0,9,5},{96,3,13,0,9,6},{96,3,13,0,9,7},{96,3,13,0,9,8},{96,3,13,0,9,9}}, + {{96,3,21,0,9,-1},{96,3,21,0,9,-1},{96,3,21,0,9,-1},{96,3,21,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{100,3,12,17,9,-1},{100,3,12,17,9,-1},{100,3,10,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1}}, + {{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,10,0,9,-1},{100,3,10,0,9,-1},{100,3,10,0,9,-1},{100,3,12,17,9,-1},{100,3,12,17,9,-1},{100,3,12,17,9,-1},{100,3,12,17,9,-1},{100,3,12,17,9,-1},{100,3,12,17,9,-1},{100,3,12,17,9,-1},{100,3,12,17,9,-1},{100,3,12,17,9,-1},{100,3,10,0,9,-1}}, + {{100,3,10,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,7,0,9,-1},{100,3,21,0,9,-1},{100,3,21,0,9,-1},{100,3,21,0,9,-1},{100,3,21,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{100,3,13,0,9,0},{100,3,13,0,9,1},{100,3,13,0,9,2},{100,3,13,0,9,3},{100,3,13,0,9,4},{100,3,13,0,9,5},{100,3,13,0,9,6},{100,3,13,0,9,7},{100,3,13,0,9,8},{100,3,13,0,9,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1}}, + {{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,7,0,9,-1},{102,3,12,17,9,-1},{102,3,10,0,9,-1},{102,3,12,17,9,-1},{102,3,10,0,9,-1},{102,3,10,0,9,-1},{102,3,12,17,9,-1},{102,3,12,17,9,-1},{102,3,12,17,9,-1},{102,3,12,17,9,-1},{102,3,12,17,9,-1},{102,3,12,17,9,-1},{102,3,10,0,9,-1},{102,3,12,17,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{102,3,13,0,9,0},{102,3,13,0,9,1},{102,3,13,0,9,2},{102,3,13,0,9,3},{102,3,13,0,9,4},{102,3,13,0,9,5},{102,3,13,0,9,6},{102,3,13,0,9,7},{102,3,13,0,9,8},{102,3,13,0,9,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1}}, + {{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{63,3,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1}}, + {{63,3,14,0,3,-1},{63,3,14,0,3,-1},{63,3,14,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{63,3,21,0,6,-1},{63,3,21,0,6,-1},{63,3,21,0,6,-1},{63,3,21,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1}}, + {{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{80,3,7,0,3,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1}}, + {{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{79,3,7,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1}}, + {{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{99,3,7,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{99,3,7,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1}}, + {{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{99,3,10,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{99,3,12,17,9,-1},{99,3,12,17,9,-1},{99,3,12,17,9,-1},{99,3,12,17,9,-1},{99,3,6,0,9,-1},{99,3,6,0,9,-1},{99,3,6,0,9,-1},{99,3,6,0,9,-1},{99,3,6,0,9,-1},{99,3,6,0,9,-1},{99,3,6,0,9,-1},{99,3,6,0,9,-1},{99,3,6,0,9,-1},{99,3,6,0,9,-1},{99,3,6,0,9,-1},{99,3,6,0,9,-1},{99,3,6,0,9,-1}}, + {{22,5,7,0,9,-1},{20,5,7,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1}}, + {{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,5,-1},{0,3,26,0,5,-1}}, + {{0,3,26,0,5,-1},{0,3,26,0,5,-1},{0,3,26,0,5,-1},{0,3,26,0,5,-1},{0,3,26,0,5,-1},{0,3,10,0,3,-1},{0,3,10,0,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,10,0,3,-1},{0,3,10,0,3,-1},{0,3,10,0,3,-1},{0,3,10,0,3,-1},{0,3,10,0,3,-1},{0,3,10,0,3,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1}}, + {{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1}}, + {{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{1,3,12,17,3,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,5,-1},{0,3,26,0,5,-1},{0,3,26,0,5,-1},{0,3,26,0,5,-1},{0,3,26,0,5,-1}}, + {{0,3,26,0,5,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{0,3,26,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,26,10,6,-1}}, + {{14,3,26,10,6,-1},{14,3,26,10,6,-1},{14,3,12,17,3,-1},{14,3,12,17,3,-1},{14,3,12,17,3,-1},{14,3,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{0,3,15,0,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1}}, + {{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{61,0,2,0,9,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1}}, + {{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{61,0,2,0,9,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,9,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{61,0,2,0,9,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{61,0,2,0,9,-1},{0,3,5,0,5,-1},{61,0,2,0,9,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{61,0,2,0,9,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1}}, + {{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{61,0,2,0,9,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{61,0,2,0,9,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{61,0,2,0,9,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{61,0,2,0,9,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{61,0,2,0,9,-1}}, + {{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{61,0,2,0,9,-1},{0,3,9,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{61,0,2,0,9,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1}}, + {{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1}}, + {{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1}}, + {{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1}}, + {{0,3,9,0,5,-1},{0,3,25,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,25,10,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,25,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,25,10,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1}}, + {{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,25,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,25,10,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1}}, + {{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,25,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,25,10,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1}}, + {{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,9,0,5,-1},{0,3,25,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1}}, + {{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,25,10,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,5,0,5,-1},{0,3,9,0,5,-1},{0,3,5,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,13,2,5,0},{0,3,13,2,5,1},{0,3,13,2,5,2},{0,3,13,2,5,3},{0,3,13,2,5,4},{0,3,13,2,5,5},{0,3,13,2,5,6},{0,3,13,2,5,7},{0,3,13,2,5,8},{0,3,13,2,5,9},{0,3,13,2,5,0},{0,3,13,2,5,1},{0,3,13,2,5,2},{0,3,13,2,5,3},{0,3,13,2,5,4},{0,3,13,2,5,5},{0,3,13,2,5,6},{0,3,13,2,5,7}}, + {{0,3,13,2,5,8},{0,3,13,2,5,9},{0,3,13,2,5,0},{0,3,13,2,5,1},{0,3,13,2,5,2},{0,3,13,2,5,3},{0,3,13,2,5,4},{0,3,13,2,5,5},{0,3,13,2,5,6},{0,3,13,2,5,7},{0,3,13,2,5,8},{0,3,13,2,5,9},{0,3,13,2,5,0},{0,3,13,2,5,1},{0,3,13,2,5,2},{0,3,13,2,5,3},{0,3,13,2,5,4},{0,3,13,2,5,5},{0,3,13,2,5,6},{0,3,13,2,5,7},{0,3,13,2,5,8},{0,3,13,2,5,9},{0,3,13,2,5,0},{0,3,13,2,5,1},{0,3,13,2,5,2},{0,3,13,2,5,3},{0,3,13,2,5,4},{0,3,13,2,5,5},{0,3,13,2,5,6},{0,3,13,2,5,7},{0,3,13,2,5,8},{0,3,13,2,5,9}}, + {{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1}}, + {{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1}}, + {{61,0,2,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1}}, + {{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1}}, + {{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1}}, + {{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{2,3,7,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1}}, + {{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{2,3,25,10,9,-1},{2,3,25,10,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1},{61,0,2,13,9,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1}}, + {{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{0,3,26,10,6,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1}}, + {{0,0,15,2,5,0},{0,0,15,2,5,0},{0,0,15,2,5,1},{0,0,15,2,5,2},{0,0,15,2,5,3},{0,0,15,2,5,4},{0,0,15,2,5,5},{0,0,15,2,5,6},{0,0,15,2,5,7},{0,0,15,2,5,8},{0,0,15,2,5,9},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1}}, + {{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,3,26,0,5,-1},{61,0,2,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,5,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,5,-1},{0,0,26,0,9,-1},{0,0,26,0,5,-1}}, + {{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,5,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,5,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,5,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,6,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,6,-1}}, + {{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,6,-1},{0,0,26,0,9,-1},{0,0,26,0,6,-1},{0,0,26,0,6,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,6,-1}}, + {{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,6,-1},{0,0,26,0,6,-1},{0,0,26,0,6,-1},{0,0,26,0,6,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,5,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{0,0,26,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1},{0,3,26,0,9,-1}}, + {{20,5,26,0,5,-1},{0,5,26,0,9,-1},{0,5,26,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1}}, + {{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,9,-1},{0,5,26,0,9,-1},{0,5,26,0,9,-1},{0,5,26,0,9,-1},{0,5,26,0,9,-1},{0,5,26,0,9,-1},{0,5,26,0,9,-1},{0,5,26,0,9,-1},{0,5,26,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{0,5,26,0,5,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,5,26,0,9,-1},{0,5,26,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1}}, + {{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1}}, + {{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,9,-1},{61,0,2,0,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1}}, + {{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1}}, + {{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1}}, + {{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{0,3,26,10,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1}}, + {{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{17,5,7,0,1,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1}}, + {{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1}}, + {{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{17,5,7,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1}}, + {{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{17,5,7,0,5,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1}}, + {{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,5,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,2,0,9,-1},{0,3,1,18,2,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1},{0,3,1,18,2,-1}}, + {{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1}}, + {{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{1,0,12,17,2,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}}, + {{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,3,0,9,-1},{61,0,2,0,9,-1},{61,0,2,0,9,-1}} }; -#define kMirrorMaxPlane 0 -#define kMirrorIndexBits 9 -#define kMirrorCharBits 7 -static const PRUint8 sMirrorPages[1][512] = { - {0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,6,2,2,7,8,9,2,2,2,2,2,2,2,10,11,2,2,2,12,13,14,2,2,2,2,2,2,15,2,2,2,16,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,18,2} +#define kHanVariantMaxPlane 2 +#define kHanVariantIndexBits 9 +#define kHanVariantCharBits 7 +static const PRUint8 sHanVariantPlanes[2] = {1,2}; + +static const PRUint16 sHanVariantPages[3][512] = { + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,16,18,19,16,20,16,21,16,22,23,24,25,26,27,28,29,16,16,30,31,32,33,16,34,35,16,36,37,38,16,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,210,211,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {16,16,16,213,214,16,215,216,16,16,16,16,16,217,16,218,219,16,16,16,16,16,16,220,16,221,222,16,16,16,16,16,16,16,223,16,16,224,16,16,225,226,16,16,16,16,227,228,229,230,16,16,16,16,231,232,16,16,16,233,16,16,16,234,16,16,16,16,16,235,16,16,16,16,16,16,236,237,16,16,16,238,16,16,16,239,240,16,16,16,16,241,242,16,243,16,16,16,16,244,16,16,245,246,247,16,16,248,249,16,250,251,252,16,16,16,16,16,253,254,16,16,16,255,256,257,258,259,260,16,16,261,262,263,16,16,16,219,16,16,16,16,16,264,265,16,16,266,16,267,16,16,16,268,16,269,270,16,237,266,16,16,271,272,16,16,230,16,273,16,274,275,16,16,16,16,16,276,16,277,278,16,279,280,281,16,282,16,283,284,285,286,16,287,16,16,288,16,16,16,16,16,16,16,16,289,290,291,16,292,16,16,293,294,16,16,233,16,16,16,16,16,16,16,16,16,16,16,295,16,16,16,16,296,215,16,16,16,297,16,16,16,16,16,298,16,16,299,16,300,31,301,302,16,16,235,303,304,305,306,307,308,16,309,310,16,16,16,16,16,16,16,16,16,311,312,16,313,16,314,315,316,317,318,319,16,320,16,16,16,16,16,16,16,16,321,266,260,16,322,323,324,325,326,327,328,329,330,331,16,332,333,334,335,336,337,338,16,339,340,341,342,343,31,344,242,16,345,16,16,346,16,347,348,16,349,350,351,16,16,352,16,16,16,16,16,16,16,16,353,16,354,355,356,357,16,16,16,358,248,359,360,361,362,363,364,365,16,366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,366,0,0,0,0,0,0,0,0,0,0,0} }; -static const PRInt8 sMirrorValues[19][128] = { - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,2,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,2,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,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,-1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,-1,0,0,0,0,0,0,0,0,0,0,1,-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,1,-1,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,3,-3,-3,-3,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,-1,0,0,0,0,0,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,1,-1,1,-1,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1}, - {1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,1,-1,1,-1,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0,1,-1,0,0,67,0,68,69,0,70,0,0,0,0,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,71,0,0,1,-1,0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,1,-1,8,8,8,0,7,7,0,0,-8,-8,-8,-7,-7,0}, - {0,0,0,0,0,0,0,0,1,-1,1,-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,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,0,1,-1,0,2,0,-2,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,1,-1,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,3,1,-1,-3,1,-1,1,-1,1,-1,1,-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,72,0,0,0,0,0,0,0,1,-1,0,0,1,-1,0,0,0,0,0,0,0,0,0,1,-1,1,-1,0,1,-1,0,0,1,-1,1,-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,73,0,0,1,-1,0,0,1,-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,1,-1,1,-1,0,0,0,0,0,1,-1,0,0,0,0,0,0,1,-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,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,1,-1,1}, - {-1,1,-1,1,-1,0,0,0,0,0,0,1,-1,0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,0,1,-1,0,0,0,1,-1,1,-1,1,-1,1,-1,0,1,-1,0,0,1,-1,0,0,0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,0,74,0,0,0,0,75,76,77,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,1,-1,1,-1,0,0,0,0,0}, - {0,0,1,-1,1,-1,0,0,0,1,-1,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,-1,1,-1,1,-1,0,0,0,0,0,1,-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,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,2,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,2,0,-2,0,1,-1,0,1,-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} -}; - -#define kCatEAWMaxPlane 16 -#define kCatEAWIndexBits 9 -#define kCatEAWCharBits 7 -static const PRUint8 sCatEAWPlanes[16] = {1,2,3,4,4,4,4,4,4,4,4,4,4,5,6,6}; - -static const PRUint8 sCatEAWPages[7][512] = { - {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,41,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,78,79,80,79,79,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,89,89,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,98,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,99,100,97,97,97,97,97,97,97,97,101,41,41,102,103,104,105,106,107,108,109,110,111,112,113,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,114,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,97,97,117,118,119,120,41,41,121,122,123,124,125,126}, - {127,128,129,130,82,131,132,133,134,135,82,82,82,82,82,82,136,82,137,138,139,82,140,82,141,82,82,82,142,82,82,82,143,144,145,146,82,82,82,82,82,82,82,82,82,147,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,41,41,41,41,41,41,148,82,149,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,41,41,41,41,41,41,41,41,150,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,41,41,41,41,151,82,82,82,82,82,82,82,82,82,152,153,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,154,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,78,155,156,157,158,82,159,82,160,161,162,163,164,165,166,167,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,168,169,82,82,170,171,172,173,174,82,175,176,177,178,179,180,181,182,183,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82}, - {97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,184,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,185,97,186,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,97,97,97,97,186,187,187,187,187,187,187,187,187,187,187,188}, - {187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,188}, - {82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82}, - {189,82,190,191,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82}, - {116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,192} -}; - -static const struct { - unsigned char mEAW:3; - unsigned char mCategory:5; -} sCatEAWValues[193][128] = { - {{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{4,29},{4,21},{4,21},{4,21},{4,23},{4,21},{4,21},{4,21},{4,22},{4,18},{4,21},{4,25},{4,21},{4,17},{4,21},{4,21},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,21},{4,21},{4,25},{4,25},{4,25},{4,21},{4,21},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,22},{4,21},{4,18},{4,24},{4,16},{4,24},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,22},{4,25},{4,18},{4,25},{3,0}}, - {{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,29},{0,21},{4,23},{4,23},{0,23},{4,23},{4,26},{0,21},{0,24},{3,26},{0,7},{3,20},{4,25},{0,1},{0,26},{4,24},{0,26},{0,25},{0,15},{0,15},{0,24},{3,5},{0,21},{0,21},{0,24},{0,15},{0,7},{3,19},{0,15},{0,15},{0,15},{0,21},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,25},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{0,5},{0,5},{0,5},{3,5},{3,5},{3,5},{3,5},{0,5},{3,5},{0,5},{0,5},{0,5},{3,5},{0,5},{0,5},{3,5},{3,5},{0,5},{3,5},{0,5},{0,5},{3,5},{3,5},{3,5},{0,25},{0,5},{0,5},{0,5},{3,5},{0,5},{3,5},{0,5},{3,5}}, - {{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{0,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,9},{0,5},{3,9},{3,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{0,5},{0,9},{0,5},{3,9},{3,5},{3,9},{3,5},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,9},{0,5},{0,9},{0,5},{3,9},{0,5},{3,9},{3,5},{3,9},{0,5},{0,5},{0,9},{0,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{0,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,9},{0,5},{3,9},{3,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5}}, - {{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,5},{3,7},{3,9},{3,5},{3,5},{3,5},{3,7},{3,7},{3,7},{3,7},{3,9},{3,8},{3,5},{3,9},{3,8},{3,5},{3,9},{3,8},{3,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,9},{3,8},{3,5},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5}}, - {{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,5},{3,5},{3,9},{3,5},{3,9},{3,9},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{0,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5}}, - {{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,7},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,24},{3,24},{0,24},{3,24},{3,6},{0,6},{3,6},{0,6},{0,6},{0,6},{3,6},{0,6},{3,6},{3,6},{0,6},{3,6},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{0,24},{0,24},{0,24},{0,24},{3,24},{0,24},{3,24},{0,24},{3,6},{3,6},{3,6},{3,6},{3,6},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,6},{3,24},{3,6},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24}}, - {{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{3,9},{3,5},{3,9},{3,5},{3,6},{3,24},{3,9},{3,5},{0,2},{0,2},{3,6},{3,5},{3,5},{3,5},{3,21},{0,2}}, - {{0,2},{0,2},{0,2},{0,2},{3,24},{3,24},{3,9},{3,21},{3,9},{3,9},{3,9},{0,2},{3,9},{0,2},{3,9},{3,9},{3,5},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,2},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{3,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,5},{3,5},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,5},{3,25},{3,9},{3,5},{3,9},{3,9},{3,5},{3,5},{3,9},{3,9},{3,9}}, - {{3,9},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{3,5},{0,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5}}, - {{3,9},{3,5},{3,26},{3,12},{3,12},{3,12},{3,12},{3,12},{3,11},{3,11},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5}}, - {{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{0,2},{3,6},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5}}, - {{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{3,21},{3,17},{0,2},{0,2},{0,2},{0,2},{3,23},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,17},{3,12},{3,21},{3,12},{3,12},{3,21},{3,12},{3,12},{3,21},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,1},{3,1},{3,1},{3,1},{3,1},{0,2},{3,25},{3,25},{3,25},{3,21},{3,21},{3,23},{3,21},{3,21},{3,26},{3,26},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{0,2},{0,2},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,21},{3,21},{3,21},{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,1},{3,26},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,6},{3,6},{3,12},{3,12},{3,26},{3,12},{3,12},{3,12},{3,12},{3,7},{3,7},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,7},{3,26},{3,26},{3,7}}, - {{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{3,1},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,6},{3,6},{3,26},{3,21},{3,21},{3,21},{3,6},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,6},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,6},{3,12},{3,12},{3,12},{3,6},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{0,2},{0,2},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2}}, - {{3,12},{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,10},{3,12},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{3,12},{3,10},{3,10},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,21},{3,21},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,6},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{0,2},{3,12},{3,10},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,12},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{3,10},{3,10},{0,2},{0,2},{3,10},{3,10},{3,12},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,10},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,23},{3,23},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,26},{3,23},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{3,12},{3,12},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{0,2},{3,12},{0,2},{3,10},{3,10},{3,10},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{0,2},{0,2},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,12},{3,12},{3,7},{3,7},{3,7},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{3,12},{3,12},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,12},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,12},{3,12},{3,10},{0,2},{3,10},{3,10},{3,12},{0,2},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,23},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{3,12},{3,10},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,12},{3,7},{3,10},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{3,10},{3,10},{0,2},{0,2},{3,10},{3,10},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,10},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,26},{3,7},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{0,2},{3,12},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{3,10},{3,10},{3,12},{3,10},{3,10},{0,2},{0,2},{0,2},{3,10},{3,10},{3,10},{0,2},{3,10},{3,10},{3,10},{3,12},{0,2},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,15},{3,15},{3,15},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,23},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{3,10},{3,10},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,12},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{0,2},{3,12},{3,12},{3,12},{0,2},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{0,2},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,26}}, - {{0,2},{0,2},{3,10},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,12},{3,7},{3,10},{3,12},{3,10},{3,10},{3,10},{3,10},{3,10},{0,2},{3,12},{3,10},{3,10},{0,2},{3,10},{3,10},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,10},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{0,2},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{0,2},{3,10},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{0,2},{3,10},{3,10},{3,10},{0,2},{3,10},{3,10},{3,10},{3,12},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{3,26},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{0,2},{0,2},{3,10},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,12},{0,2},{0,2},{0,2},{0,2},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{0,2},{3,12},{0,2},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,10},{3,10},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{3,23},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,12},{3,12},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,6},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,26},{3,26},{3,26},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,26},{3,21},{3,26},{3,26},{3,26},{3,12},{3,12},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,26},{3,12},{3,26},{3,12},{3,26},{3,12},{3,22},{3,18},{3,22},{3,18},{3,10},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10}}, - {{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,12},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{3,26},{3,21},{3,21},{3,21},{3,21},{3,21},{3,26},{3,26},{3,26},{3,26},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{3,7},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,7},{3,10},{3,10},{3,10},{3,7},{3,7},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,12},{3,10},{3,10},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,7},{3,10},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,10},{3,10},{3,10},{3,12},{3,26},{3,26},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{3,9},{0,2},{0,2},{0,2},{0,2},{0,2},{3,9},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,6},{3,7},{3,7},{3,7}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{5,7},{5,7},{5,7},{5,7},{5,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,12},{3,12},{3,12},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,17},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,29},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,22},{3,18},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,21},{3,21},{3,14},{3,14},{3,14},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{3,21},{3,21},{3,6},{3,21},{3,21},{3,21},{3,23},{3,7},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,17},{3,21},{3,21},{3,21},{3,21},{3,12},{3,12},{3,12},{3,29},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{3,12},{3,12},{3,10},{3,10},{3,10},{0,2},{0,2},{0,2},{0,2},{3,10},{3,10},{3,12},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{3,26},{0,2},{0,2},{0,2},{3,21},{3,21},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,15},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,10},{3,10},{3,10},{0,2},{0,2},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,12},{3,10},{3,12},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{3,12}}, - {{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,6},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,12},{3,12},{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,12},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,10},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2}}, - {{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{3,10},{3,12},{3,10},{3,10},{3,7},{3,7},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,10},{3,12},{3,12},{3,10},{3,10},{3,10},{3,12},{3,10},{3,12},{3,12},{3,12},{3,10},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,21},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,21},{3,21}}, - {{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,21},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,12},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,6},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5}}, - {{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12}}, - {{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5}}, - {{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5}}, - {{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{0,2},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{0,2},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{3,9},{0,2},{3,9},{0,2},{3,9},{0,2},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{0,2}}, - {{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,8},{3,8},{3,8},{3,8},{3,8},{3,8},{3,8},{3,8},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,8},{3,8},{3,8},{3,8},{3,8},{3,8},{3,8},{3,8},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,8},{3,8},{3,8},{3,8},{3,8},{3,8},{3,8},{3,8},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,8},{3,24},{3,5},{3,24},{3,24},{3,24},{3,5},{3,5},{3,5},{0,2},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,8},{3,24},{3,24},{3,24},{3,5},{3,5},{3,5},{3,5},{0,2},{0,2},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{0,2},{3,24},{3,24},{3,24},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,24},{3,24},{3,24},{0,2},{0,2},{3,5},{3,5},{3,5},{0,2},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,8},{3,24},{3,24},{0,2}}, - {{3,29},{3,29},{3,29},{3,29},{3,29},{3,29},{3,29},{3,29},{3,29},{3,29},{3,29},{3,1},{3,1},{3,1},{3,1},{3,1},{0,17},{3,17},{3,17},{0,17},{0,17},{0,17},{0,21},{3,21},{0,20},{0,19},{3,22},{3,20},{0,20},{0,19},{3,22},{3,20},{0,21},{0,21},{0,21},{3,21},{0,21},{0,21},{0,21},{0,21},{3,27},{3,28},{3,1},{3,1},{3,1},{3,1},{3,1},{3,29},{0,21},{3,21},{0,21},{0,21},{3,21},{0,21},{3,21},{3,21},{3,21},{3,20},{3,19},{0,21},{3,21},{3,21},{0,21},{3,16},{3,16},{3,21},{3,21},{3,21},{3,25},{3,22},{3,18},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,25},{3,21},{3,16},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,29},{3,1},{3,1},{3,1},{3,1},{3,1},{0,2},{0,2},{0,2},{0,2},{0,2},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,15},{3,6},{0,2},{0,2},{0,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,25},{3,25},{3,25},{3,22},{3,18},{0,6}}, - {{3,15},{0,15},{0,15},{0,15},{0,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,25},{3,25},{3,25},{3,22},{3,18},{0,2},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{0,2},{0,2},{0,2},{3,23},{3,23},{3,23},{3,23},{3,23},{3,23},{3,23},{3,23},{3,23},{2,23},{3,23},{3,23},{0,23},{3,23},{3,23},{3,23},{3,23},{3,23},{3,23},{3,23},{3,23},{3,23},{3,23},{3,23},{3,23},{3,23},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,11},{3,11},{3,11},{3,11},{3,12},{3,11},{3,11},{3,11},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,26},{3,26},{3,9},{0,26},{3,26},{0,26},{3,26},{3,9},{3,26},{0,26},{3,5},{3,9},{3,9},{3,9},{3,5},{3,5},{3,9},{3,9},{3,9},{0,5},{3,26},{3,9},{0,26},{3,26},{3,25},{3,9},{3,9},{3,9},{3,9},{3,9},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,9},{3,26},{0,9},{3,26},{3,9},{3,26},{3,9},{0,9},{3,9},{3,9},{3,26},{3,5},{3,9},{3,9},{3,9},{3,9},{3,5},{3,7},{3,7},{3,7},{3,7},{3,5},{3,26},{3,26},{3,5},{3,5},{3,9},{3,9},{3,25},{3,25},{3,25},{3,25},{3,25},{3,9},{3,5},{3,5},{3,5},{3,5},{3,26},{3,25},{3,26},{3,26},{3,5},{3,26},{3,15},{3,15},{3,15},{0,15},{0,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,15},{0,15},{0,15},{0,15},{3,15},{0,14},{0,14},{0,14},{0,14},{0,14},{0,14},{0,14},{0,14},{0,14},{0,14},{0,14},{0,14},{3,14},{3,14},{3,14},{3,14},{0,14},{0,14},{0,14},{0,14},{0,14},{0,14},{0,14},{0,14},{0,14},{0,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14}}, - {{3,14},{3,14},{3,14},{3,9},{3,5},{3,14},{3,14},{3,14},{3,14},{0,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,25},{0,25},{0,25},{0,25},{0,25},{0,26},{0,26},{0,26},{0,26},{0,26},{3,25},{3,25},{3,26},{3,26},{3,26},{3,26},{3,25},{3,26},{3,26},{3,25},{3,26},{3,26},{3,25},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,25},{3,26},{3,26},{0,25},{3,26},{0,25},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25}}, - {{0,25},{3,25},{0,25},{0,25},{3,25},{3,25},{3,25},{0,25},{0,25},{3,25},{3,25},{0,25},{3,25},{3,25},{3,25},{0,25},{3,25},{0,25},{3,25},{3,25},{3,25},{0,25},{3,25},{3,25},{3,25},{3,25},{0,25},{3,25},{3,25},{0,25},{0,25},{0,25},{0,25},{3,25},{3,25},{0,25},{3,25},{0,25},{3,25},{0,25},{0,25},{0,25},{0,25},{0,25},{0,25},{3,25},{0,25},{3,25},{3,25},{3,25},{3,25},{3,25},{0,25},{0,25},{0,25},{0,25},{3,25},{3,25},{3,25},{3,25},{0,25},{0,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{0,25},{3,25},{3,25},{3,25},{0,25},{3,25},{3,25},{3,25},{3,25},{3,25},{0,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{0,25},{0,25},{3,25},{3,25},{0,25},{0,25},{0,25},{0,25},{3,25},{3,25},{0,25},{0,25},{3,25},{3,25},{0,25},{0,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25}}, - {{3,25},{3,25},{0,25},{0,25},{3,25},{3,25},{0,25},{0,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{0,25},{3,25},{3,25},{3,25},{0,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{0,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{0,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,25},{3,25},{3,25},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,25},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{5,22},{5,18},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,26},{3,26},{3,26}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15}}, - {{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15}}, - {{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}}, - {{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,26},{3,26},{0,26},{0,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,26},{0,26},{0,25},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,26},{0,26},{0,25},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{0,26},{3,26},{3,26},{0,26},{3,26},{3,26},{0,26},{0,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{0,26},{0,26},{0,26},{3,26},{0,26},{0,26},{0,26},{0,26},{3,26},{0,26},{0,26},{3,26},{0,25},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26}}, - {{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15}}, - {{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,25},{3,25},{3,25},{3,25},{3,22},{3,18},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{4,22},{4,18},{4,22},{4,18},{4,22},{4,18},{4,22},{4,18},{3,22},{3,18},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}}, - {{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25}}, - {{3,25},{3,25},{3,25},{3,22},{3,18},{4,22},{4,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,22},{3,18},{3,22},{3,18},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,22},{3,18},{3,25},{3,25}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,26},{3,26},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,9},{3,9},{3,5},{3,9},{3,5},{3,5},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,6},{3,6},{3,9},{3,9}}, - {{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,9},{3,5},{3,9},{3,5},{3,12},{3,12},{3,12},{3,9},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,15},{3,21},{3,21}}, - {{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{3,5},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,6},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12}}, - {{3,21},{3,21},{3,20},{3,19},{3,20},{3,19},{3,21},{3,21},{3,21},{3,20},{3,19},{3,21},{3,20},{3,19},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,17},{3,21},{3,21},{3,17},{3,21},{3,20},{3,19},{3,21},{3,21},{3,20},{3,19},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,21},{3,21},{3,21},{3,21},{3,21},{3,6},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,17},{3,17},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26}}, - {{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2}}, - {{1,29},{5,21},{5,21},{5,21},{5,26},{5,6},{5,7},{5,14},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,26},{5,26},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,17},{5,22},{5,18},{5,18},{5,26},{5,14},{5,14},{5,14},{5,14},{5,14},{5,14},{5,14},{5,14},{5,14},{5,12},{5,12},{5,12},{5,12},{5,10},{5,10},{5,17},{5,6},{5,6},{5,6},{5,6},{5,6},{5,26},{5,26},{5,14},{5,14},{5,14},{5,6},{5,7},{5,21},{5,26},{3,26},{0,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{5,12},{5,12},{5,24},{5,24},{5,6},{5,6},{5,7},{5,17},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,21},{5,6},{5,6},{5,6},{5,7}}, - {{0,2},{0,2},{0,2},{0,2},{0,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{5,26},{5,26},{5,15},{5,15},{5,15},{5,15},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2},{0,2},{0,2},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}}, - {{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{5,26},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26}}, - {{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,6},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,21},{3,21}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,21},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,7},{3,12},{3,11},{3,11},{3,11},{3,21},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{3,6}}, - {{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,12},{3,12},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,24},{3,24},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,6},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5}}, - {{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,6},{3,24},{3,24},{3,9},{3,5},{3,9},{3,5},{0,2},{3,9},{3,5},{3,9},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,6},{3,6},{3,5},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,12},{3,12},{3,10},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,26},{3,26},{3,23},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,10},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,21},{3,21},{3,7},{0,2},{0,2},{0,2},{0,2}}, - {{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2}}, - {{3,12},{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,12},{3,10},{3,10},{3,10},{3,10},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{3,6},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,10},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,26},{3,26},{3,26},{3,7},{3,10},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{3,12},{3,12},{3,12},{3,7},{3,7},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,7},{3,12},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,6},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,12},{3,12},{3,10},{3,10},{3,21},{3,21},{3,7},{3,6},{3,6},{3,10},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,12},{3,10},{3,10},{3,12},{3,10},{3,10},{3,21},{3,10},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2},{0,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2},{0,2}}, - {{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4}}, - {{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2}}, - {{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,25},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,22},{3,18},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,23},{3,26},{0,2},{0,2}}, - {{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{5,21},{5,21},{5,21},{5,21},{5,21},{5,21},{5,21},{5,22},{5,18},{5,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{5,21},{5,17},{5,17},{5,16},{5,16},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,21},{5,21},{5,22},{5,18},{5,21},{5,21},{5,21},{5,21},{5,16},{5,16},{5,16},{5,21},{5,21},{5,21},{0,2},{5,21},{5,21},{5,21},{5,21},{5,17},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,21},{5,21},{5,21},{5,25},{5,17},{5,25},{5,25},{5,25},{0,2},{5,21},{5,23},{5,21},{5,21},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,1}}, - {{0,2},{1,21},{1,21},{1,21},{1,23},{1,21},{1,21},{1,21},{1,22},{1,18},{1,21},{1,25},{1,21},{1,17},{1,21},{1,21},{1,13},{1,13},{1,13},{1,13},{1,13},{1,13},{1,13},{1,13},{1,13},{1,13},{1,21},{1,21},{1,25},{1,25},{1,25},{1,21},{1,21},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,9},{1,22},{1,21},{1,18},{1,24},{1,16},{1,24},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,5},{1,22},{1,25},{1,18},{1,25},{1,22},{1,18},{2,21},{2,22},{2,18},{2,21},{2,21},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,6},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7}}, - {{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,6},{2,6},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{0,2},{0,2},{0,2},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{0,2},{0,2},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{0,2},{0,2},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{0,2},{0,2},{2,7},{2,7},{2,7},{0,2},{0,2},{0,2},{1,23},{1,23},{1,25},{1,24},{1,26},{1,23},{1,23},{0,2},{2,26},{2,25},{2,25},{2,25},{2,25},{2,26},{2,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,1},{3,1},{3,1},{3,26},{0,26},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,15},{3,15},{3,15},{3,15},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,12},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,14},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,14},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,14},{3,14},{3,14},{3,14},{3,14},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,21},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,12},{3,12},{3,12},{0,2},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{3,12},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,15},{3,15},{3,21}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2}}, - {{3,10},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{3,21},{3,21},{3,1},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,12},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,7},{3,7},{3,7},{3,7},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,10},{3,12},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{0,2}}, - {{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{5,7},{5,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,10},{3,10},{3,12},{3,12},{3,12},{3,26},{3,26},{3,26},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,12},{3,12},{3,12},{3,12},{3,12}}, - {{3,12},{3,12},{3,12},{3,26},{3,26},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,12},{3,12},{3,12},{3,12},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,12},{3,12},{3,12},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9}}, - {{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{0,2},{3,9},{3,9},{0,2},{0,2},{3,9},{0,2},{0,2},{3,9},{3,9},{0,2},{0,2},{3,9},{3,9},{3,9},{3,9},{0,2},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{0,2},{3,5},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5}}, - {{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{0,2},{3,9},{3,9},{3,9},{3,9},{0,2},{0,2},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{0,2},{3,9},{3,9},{3,9},{3,9},{0,2},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{3,9},{0,2},{0,2},{0,2},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9}}, - {{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5}}, - {{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9}}, - {{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{0,2},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,25},{3,5},{3,5},{3,5},{3,5}}, - {{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5}}, - {{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,5},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13}}, - {{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{3,7},{0,2},{3,7},{0,2},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{0,2},{3,7},{0,2},{3,7},{0,2},{3,7},{0,2},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2}}, - {{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,25},{3,25},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,26},{0,2},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26}}, - {{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}}, - {{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}}, - {{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2}}, - {{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2}}, - {{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{0,2},{0,2}}, - {{0,2},{3,1},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1}}, - {{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12}}, - {{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}}, - {{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,2},{0,2}} -}; - -#define kHangulMaxPlane 0 -#define kHangulIndexBits 10 -#define kHangulCharBits 6 -static const PRUint8 sHangulPages[1][1024] = { - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,12,6,7,8,9,10,11,13,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} -}; - -static const PRUint8 sHangulValues[15][64] = { - {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, - {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, - {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}, - {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,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,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0}, - {3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7}, - {7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7}, - {7,7,7,7,7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7}, - {7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,3,7,7,7}, - {7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7}, - {7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7}, - {7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7}, - {7,7,7,7,7,7,7,7,3,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, - {2,2,2,2,2,2,2,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0} +static const PRUint8 sHanVariantValues[367][32] = { + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xcf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0x7f,0xfd,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xf7,0xbf,0xbf,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xfe,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xdf,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x7d,0xfd,0xff,0xff,0xff,0xff,0xff,0x7f}, + {0xff,0xfe,0xff,0xbf,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf5,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0xff,0xff,0xff,0xff,0x7f,0xfd,0xff,0xff,0xff,0xfd,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xdf,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xf5,0xff,0xff,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xf7}, + {0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf}, + {0xff,0xff,0xff,0xb7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0x7f,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xbf,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xfd,0xff,0xfe,0xef,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xbf}, + {0xff,0xff,0xbe,0xff,0xff,0xef,0xff,0xbb,0xff,0xfb,0xff,0xff,0xfe,0x5f,0x55,0xd5,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf}, + {0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xfd,0x7f,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x77,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xfe}, + {0xff,0xff,0xfe,0xd5,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xfb,0xff,0xdf,0x57}, + {0x55,0xf7,0xff,0xff,0xff,0xff,0xbe,0xbf,0xff,0xff,0xff,0xff,0xbf,0x5f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xbf,0xff,0xbf,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xbf}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xeb,0xfe,0xff,0xbf,0xff,0xbf,0xff,0xff,0xef,0x7e,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xfe,0xfe,0xbf,0xff,0xfb}, + {0xfb,0xff,0xff,0xff,0xff,0xef,0xff,0x57,0x55,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xfb,0xff,0x7f,0x55,0xf5,0xff,0xff,0xff,0xff,0xfe,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0xff,0x7f,0xff,0xdf,0x77,0xff,0x5f,0xb5,0xdf,0x65,0xdf,0xff,0xfd,0xfd,0xdf,0xd7,0xff,0xff,0xf5,0xfd,0xfd,0xfd,0xff,0xff,0xf5,0xdf,0xff,0xff,0xf5,0xff,0xff,0xef}, + {0xef,0xff,0xf7,0x5f,0xf7,0xff,0xdf,0xef,0xff,0x7f,0xf7,0xff,0xdf,0xf7,0xfd,0x7f,0xff,0xd7,0xff,0xdf,0x77,0xff,0xff,0xff,0xff,0xff,0xdf,0xfd,0xff,0x7f,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0x7f,0x5d,0x5f,0x75,0x55,0x5f,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0x7f,0xff,0xff,0xff,0x7f,0xf7,0xff,0xff,0xff,0xfb,0xff,0xff}, + {0xff,0xef,0xff,0xff,0xff,0xef,0xff,0xff,0x7d,0x57,0xd5,0xfd,0xff,0xef,0xff,0xff,0xeb,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0x7e,0xdb,0x55,0xf7,0xff,0xff,0xff,0xff}, + {0xfe,0xef,0xba,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xef,0xff,0xdf,0xdf,0xff,0xff,0xfb,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xfa,0x7f,0x5b}, + {0xff,0xff,0xff,0xff,0xfb,0xef,0xfa,0xff,0xff,0x77,0xf5,0xbb,0xbf,0xba,0xff,0xef,0xef,0xfb,0xfb,0xff,0xfb,0xfb,0xff,0xff,0xff,0xfb,0xfe,0xff,0xff,0xff,0xfb,0xff}, + {0xee,0xfe,0xfa,0xff,0xfe,0xfa,0xfe,0xbf,0xbf,0xff,0xef,0xff,0xef,0xbf,0xae,0x7e,0xff,0xff,0x7f,0xfe,0xe7,0x9f,0xdf,0xff,0xff,0xbf,0xfb,0xff,0x7d,0xfd,0x77,0xf7}, + {0xf7,0xf7,0xed,0xfd,0xff,0xff,0x77,0xfd,0xff,0xff,0xef,0x7f,0x5f,0xf7,0x7f,0xff,0xfd,0xdf,0xf6,0x7b,0xf7,0xff,0x7b,0xfe,0xfd,0xfd,0x7f,0x77,0xfb,0xff,0x7f,0x7f}, + {0xff,0xff,0xff,0xf7,0xdf,0xff,0x55,0xff,0xfd,0xfb,0x6f,0xd5,0xff,0xdf,0xf7,0x57,0xdd,0xbe,0xbf,0xef,0xf5,0xbf,0xbf,0xfb,0xff,0x77,0xff,0xef,0xff,0xfa,0xff,0xef}, + {0xbf,0xbf,0xeb,0xba,0xfb,0xff,0xef,0xd7,0xd7,0xff,0xfd,0xff,0x57,0xff,0xff,0x7f,0xfb,0xff,0x7f,0xff,0xff,0xfb,0x9b,0xeb,0xef,0xff,0xfb,0xff,0xfb,0xfb,0xbe,0xff}, + {0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0x9b,0xfb,0xff,0x5f,0xff,0xfe,0xff,0xff,0x5f,0xff,0xd6,0xff,0xff,0xdf,0xfd,0x7f,0xff,0xff,0xfd,0xbf,0xff}, + {0xdf,0xd7,0x77,0xf5,0xfd,0xf7,0xf9,0xff,0x5f,0xdf,0xf5,0xdb,0xef,0xfe,0xff,0x7f,0x97,0xfe,0xff,0xfd,0xf7,0xff,0xf5,0xff,0xed,0xff,0xdf,0xff,0xff,0x5f,0xf7,0xf7}, + {0xff,0xff,0xff,0xfd,0x67,0x77,0xff,0xff,0x7f,0xff,0xfd,0x7d,0xbf,0xed,0xff,0xff,0xef,0xff,0xff,0xff,0x5d,0x57,0x75,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0x7f,0xff,0xff,0x77,0xf7,0xff,0xfd,0xff,0xff,0xff,0xff,0xfd,0xfe,0xff,0xff,0xff,0xf7,0x57,0x75,0xf7,0x75,0xfb,0xff,0xff,0xbf,0xff,0xff,0xff,0xff}, + {0xff,0xfe,0xff,0xff,0xff,0xff,0x6f,0xf7,0xd5,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xaf,0xef,0x7f,0xff,0x55,0xfd,0xfd,0xfd,0xff}, + {0xff,0xff,0xff,0xef,0xff,0xff,0xef,0xff,0xff,0xff,0xef,0xee,0xef,0x7f,0xff,0xd7,0xff,0xaf,0xef,0xef,0xff,0xff,0xef,0xff,0xff,0xff,0x7b,0xff,0x7f,0xef,0xfb,0xff}, + {0xff,0xef,0xff,0xfb,0xbf,0xae,0xfd,0xfe,0xff,0xfd,0xfb,0xaf,0xf6,0xfb,0xfe,0xfb,0xff,0xfb,0xff,0xff,0xbf,0xff,0xef,0xf9,0xfe,0xeb,0xff,0xbf,0xef,0xfe,0xfa,0xff}, + {0xfe,0xbf,0xff,0xfe,0xff,0xfb,0xfb,0xff,0x7f,0xef,0xfe,0xff,0xaf,0xee,0xff,0xff,0xea,0xfb,0xfa,0xff,0xfb,0xff,0xff,0xff,0xdf,0xff,0xef,0xf7,0xf5,0xf5,0xff,0xd7}, + {0xff,0x9f,0xbf,0xfb,0xaf,0xef,0xfe,0xef,0x7f,0xff,0xff,0xff,0xff,0xff,0xd7,0xff,0xdf,0xff,0xff,0x7f,0xff,0x7f,0x5f,0x55,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xd5,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xdf,0x77,0xf7,0xd7,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0xff,0xfb,0xff,0xff,0x7f,0xfe,0xbf,0xff,0xff}, + {0xff,0xfb,0xef,0xff,0xf7,0xe7,0xff,0xfb,0xff,0xff,0xff,0xbf,0xfb,0xfe,0xff,0xff,0xff,0xff,0xaf,0xbf,0xef,0xbf,0xff,0xff,0xef,0xfe,0xff,0xff,0xff,0xfb,0xfb,0xff}, + {0xff,0xff,0xef,0xff,0xff,0xff,0xf7,0xfe,0xff,0xff,0xff,0xef,0xbf,0xff,0xff,0xef,0xff,0xbf,0xbe,0xff,0xbf,0xff,0xea,0xaf,0xee,0xff,0xfb,0x9f,0x7d,0xdf,0xed,0xfa}, + {0xff,0x7d,0xff,0xf7,0xff,0xff,0xff,0x7f,0xee,0xff,0xff,0xff,0xff,0xfd,0xd5,0xef,0xd7,0xff,0x7f,0xff,0xfe,0xdf,0xff,0xff,0xff,0xb7,0xeb,0xef,0xff,0xff,0xfd,0xfe}, + {0xff,0x5f,0xfd,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0x57,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0x7f,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xf7,0xff}, + {0xff,0x55,0xfd,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xd7,0xfd,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xfb,0x7f,0xd5,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xdf,0xbf,0xfe,0xff,0xff,0xfa,0xff,0xff,0xff,0xff,0xdf,0xbd,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xfb,0xbf,0xbf}, + {0xff,0xff,0xbe,0xfe,0xff,0xff,0xfb,0xff,0xfb,0xfe,0xef,0xff,0xfe,0x7f,0xfe,0xff,0xff,0xff,0xbf,0xfe,0xff,0xff,0xf7,0xff,0xff,0xdf,0x9f,0xff,0xff,0xff,0xfe,0xbf}, + {0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xd7,0xf5,0xff,0x5f,0xef,0xff,0xff,0xff,0xd7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xef,0xaf,0xbb,0xfe,0xff,0xeb,0x77,0x7d}, + {0xff,0x9f,0xbe,0xeb,0xff,0xfd,0xfd,0xf7,0xff,0x7f,0xff,0xff,0xff,0xbd,0xfd,0xf7,0x5f,0xef,0xd7,0xfb,0xbf,0xff,0xff,0xde,0xe7,0xde,0xfa,0xfe,0xff,0xff,0xff,0x7f}, + {0xd7,0xff,0xff,0xff,0xff,0x5f,0x55,0xff,0xfb,0xff,0xff,0xf7,0xff,0xff,0xff,0x77,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0xd5,0xff,0xff,0xff,0xee,0xff,0xfb}, + {0x5f,0xfd,0xff,0xfb,0xff,0xbf,0xff,0xff,0xef,0xff,0xff,0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xdd,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe}, + {0xfb,0xbe,0xff,0xff,0xff,0xbe,0xff,0xff,0xee,0xbf,0xff,0xef,0xff,0xfe,0xee,0xfe,0xff,0xf7,0xbf,0xff,0xef,0xfe,0xff,0xff,0xff,0xff,0xf7,0x7f,0xfe,0xff,0xff,0xff}, + {0xf7,0xf7,0xfd,0x7f,0xfd,0xff,0xfd,0xfd,0xff,0x5b,0xbf,0xdf,0xb7,0xef,0x7f,0xfd,0x9e,0xff,0xff,0xff,0xff,0xbf,0xfe,0xbf,0xbf,0xff,0xbf,0xfe,0xdf,0xdf,0xeb,0x6f}, + {0xff,0xdd,0xff,0xff,0x75,0xfd,0xf7,0x5f,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xeb,0xfe,0xfe,0xff,0xff,0xff,0xef,0xbb,0xaa,0xff,0xdb,0xfe,0xbf,0xff,0xff,0xff}, + {0x5d,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xfd,0xf7,0xdf,0x7f,0xbf,0xbb,0xd7,0xff,0xff,0xff,0xfe,0xee,0x5f,0xf7,0xfb,0xe7,0xff,0xdb,0xfd,0xff,0xef,0xff,0x7f,0xff}, + {0xf7,0xfd,0xff,0xfe,0xfb,0xf7,0xff,0xef,0xf6,0xff,0xfb,0xff,0xff,0xfb,0xfb,0xff,0xff,0xdf,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xdf}, + {0x55,0xd5,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x7d,0xff,0xef,0x7f,0xff,0xdf,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0x7f,0xdf,0x55,0xf5}, + {0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xdf,0x7f,0x55,0xff,0xeb,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xfb,0x7f,0x75,0x55,0xeb,0xff,0xbf,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xfe,0xfd,0xdd,0xfe,0xff,0xff,0xbe,0xff,0x6f,0xff,0xfe,0xbf,0xfb,0xf7,0xff,0xee,0xbf,0xbf,0xff,0xaf,0xef,0xbf,0xef,0xff,0xff}, + {0xef,0xff,0xef,0xff,0xea,0xff,0xef,0xff,0xff,0xfe,0xbf,0xef,0xef,0xef,0xff,0xff,0xfe,0xbf,0xfb,0xfa,0xd7,0xfd,0xff,0xbf,0xbf,0xff,0xfe,0xff,0xef,0xaf,0xee,0xee}, + {0xfe,0x9f,0x7f,0x7f,0xff,0x7e,0xfd,0xff,0xff,0xbf,0xfb,0x7d,0xea,0x6f,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0x7f,0x57,0xfd,0xfd,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x7f,0xd5,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xbf,0xff,0xff,0xff,0xff,0x7f,0x5f,0x57,0xf5,0xff,0xff,0xff,0xff,0xff}, + {0xdf,0xff,0xff,0xff,0xff,0xff,0x5f,0x55,0x55,0xd5,0xfb,0xff,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x57,0xff,0xbe,0xdf,0xff,0xff,0xff,0xff}, + {0xbf,0xee,0xff,0xff,0xff,0xbf,0xbb,0xff,0xfb,0xff,0xff,0xff,0x7f,0x7d,0xdd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xaf,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0x57}, + {0xd5,0xf7,0xff,0xfb,0xff,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xeb,0xdf,0xff,0xff,0x55,0x9d,0xff,0xfb,0xff,0xff,0xbe,0xff,0xff,0xff,0xbf,0xbf,0xef,0xbf,0xff}, + {0xff,0xfd,0xfe,0xbf,0xb6,0xff,0xff,0xbb,0xbf,0xfb,0xbf,0xff,0xaf,0x77,0x9d,0xaf,0xfb,0xbe,0xaf,0xff,0xbf,0xfe,0xef,0xdf,0xbe,0xff,0xff,0xbe,0xea,0xbe,0xaf,0xea}, + {0xff,0xee,0xff,0xbf,0xdf,0xee,0xbb,0xfa,0xaf,0xfe,0xef,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xbf,0x7e,0xff,0xff,0xff,0xf7,0xff,0xfd,0xfb,0xfe,0xff}, + {0xaf,0xeb,0x7f,0xff,0x7f,0x7b,0xff,0xff,0xff,0xff,0xf7,0xf6,0xff,0xbf,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0x7f,0xff,0xff,0xff,0x5f,0xfd,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0xef,0xff,0x7b,0xff,0x5f,0xd5,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xdf,0xff,0xfa,0xff,0xff,0xff,0xfe,0xff,0xef,0x7f,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xae,0xfb,0xbf,0xff,0xef,0xff,0xff,0xfe,0xfb,0xfe,0xfe,0xff,0xff,0xfe,0xff}, + {0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xff,0x7f,0xff,0xfd,0xdf,0xff,0x5d,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf5,0xff,0xf9,0xfe,0xff,0x5f}, + {0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xdf,0x5f,0x77,0x5d,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xff,0xff,0xff,0xff,0xfb,0xff,0xf7}, + {0xfd,0x77,0x55,0x5d,0xf7,0x5f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0x55,0xf5,0xff,0xff,0xff,0xff,0xbf}, + {0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xbb,0xff,0xdf,0xff,0xff,0xef,0xff,0xff,0x5d,0xd5,0xfe,0xff,0xff,0xff,0xaf,0xff,0xbf,0xfb,0xbf,0xff,0xff,0xef,0xef,0xff,0xff}, + {0xf7,0xff,0xff,0xbf,0xff,0xff,0xff,0x7f,0xdd,0xfd,0x7f,0xf7,0xef,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xfe,0xfb,0xff,0xfb,0xff,0xfd}, + {0xff,0x75,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xff,0xff,0xbf,0xff,0xff,0xbf,0xfb,0xff,0xff,0x5f,0x7f,0xfd,0xbe,0xfe,0xff,0xbf,0xef,0xff,0xff}, + {0xeb,0xfb,0xff,0xff,0xbf,0xff,0xfb,0xef,0xaf,0xff,0x9f,0x7f,0xf7,0xff,0xea,0xbf,0xff,0xff,0xbe,0xff,0xff,0xff,0xff,0xbf,0xef,0xf7,0xbf,0xff,0xf7,0xff,0xf7,0xfd}, + {0xfb,0xff,0xfb,0xff,0xff,0xfe,0xff,0xbe,0xaf,0xff,0xf7,0xab,0xbf,0xff,0xbe,0xff,0xbf,0xff,0xff,0xff,0xbf,0xff,0xaf,0xab,0xff,0xbb,0xae,0xfe,0xbb,0xff,0xbe,0xff}, + {0xff,0xfe,0xef,0xbb,0xaf,0xef,0xff,0xef,0xdf,0x7d,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xbf,0xfb,0xff,0xff,0xff,0xef,0xbf,0xfe,0xbd}, + {0xf7,0x7f,0x7f,0xff,0x5f,0xff,0xde,0xef,0xf7,0xfe,0xbe,0xaf,0xee,0xfd,0xef,0xfe,0xd6,0xef,0xff,0xff,0xff,0xf7,0xf7,0xff,0xf7,0xff,0xff,0xff,0xff,0xf7,0xff,0xbf}, + {0xef,0x7f,0xfe,0xfe,0xff,0xfd,0xff,0xff,0x9f,0xff,0xb7,0xfe,0x9f,0xff,0xff,0xff,0xff,0x7f,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xe7,0xff}, + {0xff,0xff,0xfd,0xff,0xef,0xef,0xff,0x7f,0x77,0x55,0xd5,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xdd,0xff,0xff,0x5f,0x5d,0xd5}, + {0xf7,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xfd,0x7f,0x57,0x5d,0x57,0x55,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff}, + {0xdf,0xbf,0xff,0xff,0xff,0xff,0x7f,0x57,0x55,0x5d,0xf5,0xff,0xff,0xff,0xff,0xfe,0xfd,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xfb,0xef,0xff,0xff,0xeb,0xef,0xff}, + {0xff,0xff,0xdf,0xd5,0xf5,0x7d,0xbb,0xff,0xef,0xef,0xf7,0xfe,0xff,0xff,0xff,0xef,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0x5f}, + {0x7f,0x57,0xfe,0xff,0xff,0xef,0xff,0xfb,0xff,0xff,0xbf,0xff,0xbf,0xff,0xff,0xff,0xff,0xfa,0xff,0xee,0xff,0x7f,0xdf,0x5f,0xd5,0xd5,0xd5,0xbe,0xef,0xff,0xbe,0xaf}, + {0xfb,0xff,0xef,0xff,0x7f,0xff,0xef,0xff,0xaf,0xfd,0xff,0xfe,0xef,0xfb,0xfe,0xbf,0xfb,0x5f,0x7f,0xf7,0xfb,0xfe,0xbf,0xfd,0xff,0xfe,0xff,0xbf,0xfe,0xbd,0xff,0xbf}, + {0xfe,0xab,0xff,0xff,0xff,0xbf,0x7f,0xfd,0xfe,0xee,0xfb,0xef,0xfb,0xff,0xff,0xef,0xbb,0xee,0xff,0xff,0xd7,0xfb,0xfe,0xbe,0xff,0xbe,0xbf,0xff,0xfa,0xff,0xef,0xee}, + {0xaf,0xab,0xbb,0xbf,0xff,0xfb,0xfe,0xbb,0xfe,0xaf,0xfe,0xff,0xee,0xff,0xff,0xef,0xbf,0xfe,0xff,0x7f,0xfb,0xfb,0xfa,0xfb,0xba,0xbe,0xff,0x77,0xff,0xf7,0xff,0x5b}, + {0xfd,0xff,0xf7,0xff,0xff,0xff,0xff,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xf5,0x57,0xff,0xff,0xbf,0xff,0xff,0x7f,0x7f,0xff,0x5f,0x75,0xf5,0xff,0xfe,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xd7,0xfd,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xef,0xff,0xfb,0xff,0xef,0xfb,0xfb,0xfe,0xfb,0xfd,0xff,0xff}, + {0xff,0xfb,0xfb,0xfe,0xaf,0xbf,0xff,0xff,0xfb,0xff,0xff,0xff,0xeb,0xff,0xff,0xef,0xfb,0xff,0xfe,0xff,0xef,0xff,0xfb,0xbe,0xff,0xef,0xff,0xfb,0xff,0xee,0xff,0xee}, + {0xff,0xfe,0xff,0xfb,0xfe,0xff,0xbf,0xff,0xff,0xff,0xff,0xfb,0xf7,0x7f,0xef,0xef,0xff,0xef,0xff,0xf7,0xff,0xff,0xfe,0xff,0xff,0xdf,0xff,0xff,0xff,0xf7,0xdf,0xfb}, + {0xff,0xff,0xdf,0xff,0xff,0xef,0xff,0xff,0xef,0xbf,0xff,0xff,0xff,0x5f,0xf5,0xff,0xfe,0xff,0xfd,0xff,0xff,0xff,0xff,0xd7,0xff,0xff,0xff,0x55,0xd5,0xff,0xfb,0xfb}, + {0x7f,0xff,0xff,0xdf,0xff,0xf7,0xfb,0xff,0xf7,0xff,0x5f,0xdd,0xff,0xef,0xbf,0xff,0xfb,0xfa,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xae,0xe7,0xea,0xbb,0xae,0xfe}, + {0xfa,0xff,0xff,0xff,0xf7,0xff,0x5f,0xff,0xff,0xff,0xff,0x5f,0xf5,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xff,0xff,0xef}, + {0xff,0xff,0xff,0x7f,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xbd,0xff,0xff,0xbf,0xff,0xef,0xff,0xff,0xff,0xbf,0xfe,0xeb,0xff,0xef,0x5f,0xff,0xfb}, + {0xff,0xff,0xfb,0xdf,0xff,0xff,0xff,0xff,0xbf,0xef,0xbf,0xbf,0xfe,0xff,0xff,0xfb,0xff,0xff,0xef,0xbf,0xdf,0xfa,0xef,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xf7,0x7f,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xfb,0xef,0xff,0xbf,0xff,0xfe,0xed,0xff,0xff}, + {0xff,0xbf,0xef,0xff,0xff,0x5f,0xff,0x7f,0xf5,0xff,0xff,0x55,0xf7,0xfd,0xff,0xff,0xff,0x7f,0xf5,0xff,0xdf,0xdf,0xfb,0xff,0xff,0xff,0x5d,0xff,0xff,0xff,0xff,0xef}, + {0xef,0xd7,0xbf,0xfb,0xbf,0x7f,0xfd,0xef,0xfb,0xbf,0x5f,0xef,0xef,0xff,0xef,0x5f,0xef,0xaf,0xfb,0xff,0xff,0xff,0xfe,0x9f,0x6f,0xba,0x7b,0xea,0xea,0xff,0xff,0xfe}, + {0xff,0xff,0xff,0xff,0xf7,0xff,0xef,0xbf,0xff,0xff,0xff,0xff,0xd6,0xff,0xee,0xff,0xff,0xff,0xff,0x7f,0xf5,0x5f,0xfd,0xee,0xbb,0xbe,0xef,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xdb,0xff,0xfd,0xff,0xff,0xff,0xef,0xf5,0xff,0xff,0xbb,0xf5,0xff,0xff,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xdf,0xff,0xff,0xdf,0xff,0xfe,0xee,0xff,0xfe,0xf7,0xff,0xff,0xef,0xff,0xfe,0xff,0xff,0xff,0xff,0xbf,0xff,0xef,0xff,0xff,0xff,0x7f,0xbf,0xff,0xdf,0xff,0x5f}, + {0xf5,0xff,0xff,0xff,0xff,0x5f,0xdf,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0xdf,0xf5,0xff,0xff,0xff,0xff,0x57,0xd7,0xfe,0xff,0xfe,0xfe,0x9f,0xff,0x77,0xff,0xff}, + {0xff,0xff,0xff,0xf7,0xff,0xff,0x7b,0xfd,0xff,0xff,0xfb,0xfb,0xf7,0xff,0xee,0xfa,0xff,0xff,0xff,0xff,0xfb,0xff,0xef,0xff,0xbe,0xbf,0xff,0xbf,0xff,0xff,0xff,0xfb}, + {0xff,0xee,0xff,0xef,0xef,0xff,0xfb,0xff,0xff,0xef,0xaf,0xfe,0xfb,0xff,0xff,0xfd,0x7f,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0x7f,0xff,0x7f,0xfd,0xbf}, + {0xfd,0xf5,0xff,0xeb,0xff,0xfb,0xff,0xff,0xfb,0xef,0xef,0xef,0xfa,0xff,0x7f,0xbf,0x7f,0xdf,0xfe,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfd,0xff,0xff,0xd7}, + {0xff,0xdb,0xfe,0x9f,0xff,0xff,0xff,0xbf,0x7f,0xff,0xff,0xef,0x7b,0xff,0xff,0xff,0xfe,0xff,0xff,0xea,0xf7,0xff,0xff,0xff,0xea,0xff,0xbb,0xfb,0xff,0x7f,0xff,0xff}, + {0x7f,0xff,0xff,0xd7,0xf7,0xff,0xff,0xf5,0xff,0xd7,0xeb,0xa7,0xff,0xeb,0xef,0xff,0xff,0xba,0xef,0xff,0xff,0xdf,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff}, + {0x7f,0xff,0x7f,0xff,0xff,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xdd,0xff,0xef,0xff,0xfb,0xf7,0xff,0x5f,0xf5,0xff,0xbf,0xff,0xff,0xff,0xfe,0xf7,0xdd}, + {0xfd,0xff,0xbf,0xbf,0x7f,0xff,0xff,0xff,0xff,0x5f,0x55,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xbb,0xff,0x77,0xfe,0xfe,0xff,0xff,0xfe,0xfb,0x5f,0xb7,0xff,0xff,0xff}, + {0xfe,0xff,0xff,0xfb,0xff,0xdf,0xff,0xef,0xbb,0xff,0xbf,0xff,0xff,0xff,0xfb,0xeb,0xb7,0xff,0xbf,0xfe,0xff,0xfe,0xbb,0xbe,0xfe,0xff,0xeb,0xee,0xff,0xfd,0x7f,0xfd}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0xff,0xfd,0xdf,0xdf,0xff,0xfb,0xff,0xff,0xf7,0x7f,0xff,0xff,0xff,0xff,0xff,0xeb,0xff,0xbf,0xff,0xff,0xef,0xee,0x7b,0xef}, + {0xee,0xaa,0xba,0xfb,0xbe,0xaa,0xaa,0xfa,0xfb,0x7f,0xff,0x7e,0xaa,0xfb,0xeb,0xbe,0xee,0xea,0xff,0xef,0xfe,0xfb,0xbf,0xeb,0xeb,0xef,0xfe,0xff,0xaa,0x7f,0xeb,0xff}, + {0xba,0xaf,0xfe,0xbe,0xbe,0xff,0xff,0xee,0xae,0xff,0xff,0xba,0xea,0xfa,0xaa,0xab,0xff,0xbe,0xaf,0xfb,0xaf,0xbf,0xea,0xeb,0xba,0xef,0xfa,0xbe,0xea,0xae,0xba,0xff}, + {0xff,0xff,0xaa,0xef,0xfa,0xbb,0xbf,0xab,0xbf,0xff,0xbf,0xea,0xab,0xab,0xeb,0xeb,0xbf,0xeb,0xff,0xbf,0xaf,0xfa,0xef,0xaf,0xeb,0xff,0xab,0xbb,0xbe,0xff,0xba,0xaa}, + {0xfb,0xbf,0xee,0xba,0xbf,0xef,0xfe,0x7e,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55}, + {0x55,0x55,0x55,0x55,0x57,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0xff,0xfb,0xdf,0xff,0xfe,0xfe,0xf7,0x7f,0xdf,0xff,0xdf,0xff,0xff,0xff,0xfe,0xb9,0xff,0xff}, + {0xf7,0xeb,0xbe,0xff,0xff,0xff,0xff,0x7f,0xff,0xfb,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xd5,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xfb,0xfb}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x7f,0xff,0xee,0xff,0xff,0x7d,0xff,0xdf,0xff,0x7f,0xf5,0xff,0xed,0xff,0xef,0xff,0xff,0xd7,0xbf,0xae,0xab,0xfb,0xeb}, + {0x7f,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xff,0xdf,0xff,0xfd,0xff,0x5f,0xf5,0xdf,0xff,0xff,0xff,0xff,0xff,0xfd,0xf7,0x7f,0x5d,0xff,0xff,0xdf,0xff,0xff}, + {0xff,0xfb,0xf6,0x77,0x75,0xfd,0x9f,0xff,0xff,0xfb,0xbf,0xff,0xf7,0xdf,0xf9,0xff,0xff,0xff,0xdf,0xef,0xff,0xef,0xfd,0xff,0xfb,0xef,0xaf,0xf7,0xbf,0xff,0x7e,0xd5}, + {0xbf,0xff,0xff,0xff,0xf7,0xfb,0xef,0xff,0xee,0xff,0xfb,0xff,0xff,0xff,0xff,0xab,0xff,0xff,0xfb,0xbb,0xff,0xbf,0xee,0xbd,0xee,0xff,0xfe,0xff,0xff,0xfd,0xef,0xff}, + {0xff,0x9f,0xea,0xf7,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xf5,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xee,0xbf,0xff,0x79,0xbf,0xdf,0xff}, + {0xdf,0xff,0xfd,0xff,0xff,0x7f,0xff,0xfd,0xff,0xdf,0xff,0xff,0xff,0xff,0xbd,0xff,0xf7,0x7f,0x7d,0x55,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff}, + {0x7f,0xff,0xff,0x5f,0xf7,0xf5,0xff,0xff,0xff,0x7f,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xdf,0xef,0xff,0xfd,0xff,0x57,0x55,0x75,0x55,0x55,0x55,0xff,0xff,0xff,0xff}, + {0xff,0xf7,0xef,0xff,0xff,0xef,0xff,0xff,0xef,0xbf,0xff,0xff,0x57,0x5d,0xd5,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff}, + {0xff,0xbf,0xef,0xff,0xff,0xff,0xff,0xf7,0xff,0x55,0xfd,0xfe,0xff,0xfa,0xff,0xff,0xff,0xff,0xfb,0xff,0xef,0xbf,0xff,0xff,0xff,0xee,0xff,0xff,0xf7,0xbf,0xff,0xff}, + {0xff,0x7f,0x77,0xfd,0xff,0xfe,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xff,0xbf,0xff,0xff,0xff,0xff,0x77,0x7d,0xd7,0xff,0xaf,0xff,0xfe,0xff,0xfb}, + {0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xbf,0xeb,0xff,0xfb,0xff,0x7f,0xd7,0xfd,0xfb,0xef,0xff,0xef,0xaf,0xfb,0xfe,0xff,0xef,0xff,0xeb,0xfb,0xdd,0xbd,0xff,0xff}, + {0xfe,0xff,0xee,0xfe,0xff,0xfe,0xfe,0xbf,0xff,0xef,0xfb,0xdf,0xbf,0xfe,0xef,0xff,0xff,0xff,0xff,0xeb,0x7f,0xff,0xff,0xfb,0xff,0xfb,0xef,0xff,0xff,0xef,0xeb,0xff}, + {0xff,0xae,0xaf,0xff,0xff,0xdf,0xef,0xef,0xef,0xff,0xff,0xfb,0xff,0xff,0xef,0xbf,0xff,0xef,0xff,0x7f,0xf7,0xfb,0x9f,0xbe,0xff,0xbf,0x7f,0x9d,0xff,0xff,0xff,0x57}, + {0x55,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x5f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x55,0xfd,0xaf,0xff}, + {0xff,0xef,0xff,0xff,0xff,0x77,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf5,0xff,0xff,0xfb,0xff,0xbf,0xff,0xef,0xff,0xff,0xff,0xff,0xfe,0xdd}, + {0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xef,0xef,0xff,0xfd,0xef,0xff,0xff,0xbf,0xbf,0xff,0xfe,0xfe,0x6f,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xbe,0xef,0xef,0xbf,0xff}, + {0xfb,0xeb,0xff,0xff,0xfa,0xff,0xff,0xbf,0xbf,0xff,0xfe,0xff,0xfb,0xef,0xbf,0xff,0xff,0xf7,0xff,0xff,0xbf,0xf9,0xaf,0xfb,0xff,0xf7,0xfd,0xdd,0xff,0xff,0xff,0xff}, + {0xff,0xd5,0xff,0xff,0xff,0xff,0xff,0xed,0xff,0xff,0xff,0x77,0xff,0xff,0xff,0xff,0xff,0xd7,0xed,0xff,0xff,0xff,0xff,0xfa,0x5b,0xf5,0xff,0xff,0xff,0xff,0xff,0xfb}, + {0xff,0xbf,0xff,0xfe,0xff,0xff,0x7e,0xff,0xff,0xff,0xff,0xff,0xaf,0xfd,0xbe,0xff,0xfe,0xff,0xfb,0xbf,0xff,0xe7,0xff,0xfb,0xfe,0xfe,0xef,0xbe,0xef,0xfe,0xff,0xff}, + {0xff,0xef,0xbf,0xaf,0xbf,0xef,0xfe,0xff,0xfb,0xeb,0xef,0xbe,0xef,0xbf,0xef,0xba,0x56,0x55,0x55,0x55,0xf5,0xff,0xff,0xdf,0xff,0xdf,0xff,0x7f,0xff,0xee,0xfe,0xff}, + {0xab,0xff,0xee,0xee,0xaa,0xab,0x9e,0xbb,0xaf,0xfb,0xeb,0xfb,0xfb,0xee,0xaf,0xff,0xfa,0xef,0xff,0xef,0xea,0xaa,0xbe,0x6f,0xaa,0xef,0xbb,0xea,0xaa,0xfb,0xff,0xbe}, + {0xff,0xaa,0xd7,0xfa,0xeb,0xfb,0xee,0xef,0xba,0xea,0xee,0xff,0xee,0xef,0xfb,0xae,0xef,0xbe,0xbb,0xbb,0xeb,0xaf,0xbf,0xea,0xef,0xae,0xbf,0xeb,0xba,0xaf,0xee,0xee}, + {0xea,0xfa,0xef,0xaf,0xfe,0xae,0xab,0xfb,0xfe,0xff,0xbe,0xfe,0xbf,0xff,0xfb,0xef,0xff,0xff,0xeb,0xaf,0xff,0xef,0xea,0xfe,0xff,0xff,0xbf,0xbf,0xfe,0xbe,0xfe,0xeb}, + {0xfe,0xff,0xaf,0xee,0xaf,0xeb,0xff,0xee,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55}, + {0x55,0x55,0x5d,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xff,0xff,0xff,0xff,0xfe,0xef,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xde,0xff,0xef,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xbf,0xff,0xfb,0xab,0xea,0xbf,0xaa,0xbe,0xae,0xae,0xae,0xba,0xaa,0xba,0xee,0xff,0xab,0xfb,0xeb,0xae,0xaa,0xae,0xef,0xfa,0xfe,0xfa,0xaf,0xea}, + {0xbf,0xba,0xee,0xbb,0xbe,0xae,0xbf,0x57,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xff,0xdf,0xfe,0xff,0xd7,0xff,0xff}, + {0xff,0xff,0x7f,0xff,0xff,0xfb,0xfb,0xff,0xff,0xff,0xfe,0xff,0xe7,0xff,0xfd,0xff,0x7f,0xfd,0xff,0xff,0xff,0xff,0xff,0xdf,0xfb,0xff,0xff,0xff,0xff,0x57,0x75,0xff}, + {0xff,0xff,0xdf,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xdf,0x7d,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xfe,0xd7,0xfb,0xff,0xff,0xbf,0xfe,0xff,0xff,0xfd,0xff,0xaf,0x7f}, + {0xef,0xff,0xab,0x6b,0xab,0xfb,0xef,0xf9,0xfb,0xeb,0xef,0x7f,0xff,0xff,0xff,0xff,0xfe,0xff,0xab,0xba,0xeb,0xbe,0xbf,0xbf,0xff,0xfe,0xbe,0xff,0xef,0xff,0xaa,0xee}, + {0xbf,0xba,0xea,0xff,0xaf,0xba,0xbf,0xaa,0xff,0xeb,0xeb,0xae,0xbf,0xff,0xbe,0xaf,0xee,0xea,0xfb,0xeb,0xff,0xfe,0xff,0xbf,0xab,0x5e,0x55,0x55,0x55,0x55,0x55,0x55}, + {0x55,0x55,0x55,0x55,0x55,0x55,0xd5,0xdf,0xff,0xef,0x77,0xab,0xef,0xff,0xf7,0xd7,0xf7,0x7f,0xfd,0xff,0xfd,0xff,0x75,0x55,0xff,0xff,0xf7,0xff,0x7f,0xff,0xf7,0xff}, + {0xdf,0xff,0xd7,0xff,0xdf,0xfb,0xfb,0xff,0xbf,0xdf,0xff,0xff,0xef,0xff,0x7f,0xff,0xff,0xff,0xbf,0xef,0xff,0x7a,0xfb,0xee,0xfe,0xf7,0xfb,0xff,0xef,0xbf,0xee,0xfe}, + {0xfb,0xbe,0xef,0xbf,0x7e,0xff,0xff,0xf7,0xff,0xff,0xff,0xdd,0xff,0xff,0x57,0xff,0xf7,0xff,0xff,0x7f,0x75,0xff,0xff,0xbf,0xff,0x5f,0xff,0xff,0xff,0xfb,0xfd,0xff}, + {0xff,0xef,0xfb,0xff,0xef,0xee,0xff,0xff,0xff,0xbf,0xff,0xfb,0xee,0xee,0xef,0xff,0xdf,0xbf,0xfe,0xff,0xff,0xff,0xff,0xf7,0xff,0xdf,0xff,0xff,0xf7,0xff,0xff,0x57}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xff,0xff,0xbf,0xfe,0xfb,0xff,0xff,0xff,0xba,0x7b,0x9f,0xfd,0xae,0xba,0xfa,0xfb,0xbf,0xbe,0xfb,0xff,0xbf,0xbb,0xeb,0xef}, + {0xba,0xbe,0xba,0xfb,0xea,0xfa,0xff,0xef,0xbe,0xab,0xff,0xaf,0xae,0xbe,0xea,0xab,0xfa,0xfb,0xba,0xfb,0xfb,0xbb,0xaf,0xef,0xff,0xee,0xff,0xfa,0xff,0xed,0xae,0xbf}, + {0xbe,0xfb,0xff,0xfb,0xbb,0xef,0xae,0xfe,0xbe,0xeb,0xaa,0xde,0xbb,0xaf,0xbf,0xfe,0xbb,0xbb,0xfb,0xbe,0xef,0xff,0xfb,0xbb,0xbf,0xea,0xea,0xaf,0xfa,0xef,0xfe,0xfe}, + {0xeb,0xae,0xfe,0xbf,0xee,0xfb,0xaa,0xbf,0xea,0xef,0xba,0xaf,0xbf,0xef,0xfe,0xdf,0xbe,0xae,0xbe,0xfb,0xff,0xfe,0xae,0xff,0xfe,0xfa,0xfb,0xee,0xfe,0xeb,0xef,0xef}, + {0xef,0xbe,0xef,0xff,0xff,0xee,0xbe,0xfb,0xab,0xaf,0xeb,0xae,0xae,0xbb,0xff,0xbf,0xbf,0xaf,0xfa,0xfa,0xfa,0xbf,0xfe,0xaa,0xeb,0xee,0xfe,0xff,0xfe,0xbb,0xeb,0xfb}, + {0xbf,0xfe,0xbf,0xab,0xae,0xfe,0xfa,0xff,0xfe,0xab,0xbe,0xaf,0xaf,0xeb,0xee,0xbf,0xff,0xfe,0xef,0xfe,0xef,0xfa,0xff,0xef,0xbe,0xfb,0xff,0xfb,0xea,0xbf,0xfb,0xaa}, + {0xfb,0x57,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55}, + {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x95,0xff,0x7f}, + {0xae,0xef,0xba,0xaa,0xba,0xfe,0xfe,0xff,0xbb,0xfb,0xba,0xfa,0xfb,0xef,0xbb,0xaa,0xbf,0xef,0xae,0xfa,0xae,0xea,0xff,0xee,0xfa,0xfa,0x55,0x55,0x55,0x55,0x55,0x55}, + {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7f,0xff,0xff,0xef,0xff,0x7f,0xd5,0xff,0xff,0xff,0x57,0xf5,0xff,0xff,0xf7,0xfe,0xfb,0xbf,0x7f,0xf5,0xff,0xbe,0xff,0xfe,0xfb}, + {0xff,0xff,0xeb,0x6f,0xfd,0xfb,0xbf,0xff,0xff,0xff,0xee,0xff,0xfb,0xde,0xbe,0xd7,0xff,0xff,0xbf,0x7f,0xff,0xef,0xbb,0xee,0xad,0xff,0xff,0xff,0x6f,0xff,0xbf,0xdf}, + {0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xbf,0xff,0xf7,0xff,0xff,0xff,0xfb,0xef,0xfe,0xfe,0xff,0x7f,0xff,0xe7,0xfe,0xdf,0xe7,0xfe,0xff,0xff,0xff,0xff,0xff}, + {0xfe,0xff,0xff,0xbf,0xd7,0xff,0xff,0xfb,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xfb,0xbb,0xff,0xbb,0xfa,0xbf,0xff,0xfb,0xee,0xff,0x5f,0x55,0xfd,0xff,0xf7,0xbf,0xbf}, + {0xab,0xab,0xee,0xae,0xaa,0xbf,0xfe,0xfe,0xfb,0xee,0xff,0xeb,0xee,0xbe,0xba,0xff,0xbf,0xef,0xff,0xaa,0xaf,0xff,0xba,0xef,0xef,0xbb,0xbf,0xbe,0xba,0x56,0x55,0x55}, + {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xfe,0xab,0xba,0xaf,0xae,0xee,0xfe,0xee,0xfe,0x5f,0x55,0x55,0x95,0xdf,0xae,0xfb,0xa9,0xbb,0xef,0xfe,0xff,0xaa}, + {0xbf,0xfa,0xeb,0xa6,0xab,0xaa,0xae,0xee,0xfb,0xef,0xfe,0xfb,0xbb,0xaf,0xee,0xae,0xbb,0xfb,0xaa,0xfe,0xef,0xbf,0xfe,0xee,0x6f,0x55,0x55,0x55,0x55,0x55,0x55,0x55}, + {0x55,0x55,0x55,0x55,0x55,0xf5,0xff,0xff,0xff,0xff,0xff,0xea,0xbb,0xfe,0xfb,0xff,0xbb,0xff,0xff,0xef,0xea,0xfa,0xaa,0xbb,0xef,0xbf,0xfb,0xfb,0xfa,0xef,0xbe,0xbf}, + {0xab,0xfb,0xff,0xaa,0xff,0xee,0xeb,0xbb,0xfe,0xbe,0xaf,0xeb,0xfe,0xaf,0xfe,0xef,0xaa,0xfa,0xaf,0xba,0xff,0xbb,0xaf,0xbf,0xef,0xea,0xaf,0x55,0x55,0x55,0x55,0x55}, + {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xf7,0x7f,0xbd,0xef,0xea,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff}, + {0xff,0xef,0xff,0xfb,0x7f,0xff,0xef,0xff,0xef,0xbb,0xfb,0xef,0xfb,0xff,0xff,0xff,0xff,0x7f,0xf7,0xef,0xff,0xff,0xae,0xbf,0xef,0xfb,0xfe,0xbf,0xff,0xbe,0xef,0xff}, + {0xbb,0xfe,0xaf,0xfb,0xaa,0xff,0xef,0xae,0xbf,0xef,0xaf,0xeb,0xbe,0xef,0xee,0xff,0xfa,0xae,0xeb,0xff,0xef,0xaa,0xbf,0xfb,0xeb,0xbe,0xae,0xff,0xfb,0xae,0xff,0xbb}, + {0xab,0xef,0xfa,0xba,0xaf,0xff,0xff,0xbe,0xbe,0xba,0xfa,0xeb,0xab,0xbb,0xab,0xee,0xef,0xbb,0xfa,0xff,0xef,0xae,0xfe,0xbb,0xbe,0xbe,0xfe,0xab,0xff,0xbf,0xee,0x55}, + {0x55,0xd5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x75,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xbb,0xfb,0xff,0xaf,0xae,0xff,0xee}, + {0xbf,0xaf,0xfb,0xff,0xef,0xbb,0xbf,0xaa,0xbf,0xef,0xfe,0xbf,0xee,0xbe,0xbf,0xbf,0xab,0xff,0xff,0xff,0xaa,0xff,0xef,0xfa,0xfa,0xff,0xef,0xae,0xef,0xbf,0xff,0xef}, + {0xff,0xbe,0xeb,0xff,0xaf,0xaf,0xee,0xff,0xfb,0xfb,0xeb,0xbe,0xef,0xfe,0xab,0xbe,0xeb,0xff,0xee,0xff,0xbf,0xae,0xeb,0xff,0xff,0xeb,0xbe,0xbf,0xaf,0xff,0xea,0xbb}, + {0xef,0xbf,0xbf,0xbe,0xff,0xfb,0xae,0x6b,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf9,0xeb,0xda}, + {0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xdb,0xfa,0xff,0xef,0xfb,0xfd,0xfa,0xbf,0xfd,0xf7,0xfe,0xff,0xff,0xff,0xef,0xf7,0xff,0xd6,0xff,0xef,0xaf,0xff,0x9b}, + {0xff,0xff,0x7b,0xf7,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xf7,0xff,0xff,0xff,0xaf,0xaf,0xe5,0xba,0xfb,0xbe,0xfa,0xef,0xef,0xfe,0xef,0xaf,0xff,0x7f}, + {0x55,0x55,0x55,0xe9,0xfa,0xfa,0x57,0x7e,0xff,0xff,0xff,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xd7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xdf}, + {0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff}, + {0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf}, + {0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0x7f,0xfd,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7d,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0x7f,0xfd,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0x77,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0x75,0x5d,0x55,0x55,0x55,0x55,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x57,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfd,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xef,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xbe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfb,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0x57,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x55,0x55,0x55,0x55,0x55,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xfe,0xff}, + {0xfe,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0x7f}, + {0x55,0x55,0x57,0xdd,0xff,0xff,0xfd,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0x55}, + {0xff,0xff,0xff,0xff,0xff,0x57,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xeb,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x55,0x55,0xfd,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xfb,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f}, + {0x55,0x57,0x55,0x5d,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xfe,0xfe,0xef,0xff,0xff,0xff,0xbf,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff}, + {0xff,0xff,0xef,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xfe,0xff,0xff,0xbe,0xfb,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x55,0x55,0x55,0xd5,0xdf,0x7d}, + {0x75,0x55,0x55,0x55,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff}, + {0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xfb,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff}, + {0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x55}, + {0x57,0x55,0x5d,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xfe,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xef,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0xd5,0x55,0x55,0xd5,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0x55,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0x7f,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xdf,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x7f,0xdf,0xff,0xff,0xff,0xdd,0xff,0xff,0xff}, + {0xff,0xdd,0xf7,0xff,0x7d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf7,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0x5f,0xff,0xdf,0xff,0xfd,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x7f,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xf5,0xff,0xdf,0xf5,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xdf,0xdf,0xff,0xff,0xff,0xff,0xdf,0xfd,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}, + {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} }; #define kCaseMapMaxPlane 1 diff --git a/intl/unicharutil/util/nsUnicodeScriptCodes.h b/intl/unicharutil/util/nsUnicodeScriptCodes.h index 169aefc1a4f..673f90c4dbe 100644 --- a/intl/unicharutil/util/nsUnicodeScriptCodes.h +++ b/intl/unicharutil/util/nsUnicodeScriptCodes.h @@ -41,7 +41,7 @@ * ***** END LICENSE BLOCK ***** */ /* - * Created on Mon Apr 23 14:51:01 2012 from UCD data files with version info: + * Created on Mon Apr 23 20:03:29 2012 from UCD data files with version info: * # Date: 2012-01-26, 22:03:00 GMT [KW] @@ -70,12 +70,36 @@ for the Unicode Character Database (UCD) for Unicode 6.1.0. # HangulSyllableType-6.1.0.txt # Date: 2011-08-25, 00:02:18 GMT [MD] +# File: xidmodifications.txt +# Version: 2.1 +# Generated: 2010-04-13, 01:33:09 GMT + +# +# Unihan_Variants.txt +# Date: 2011-08-08 22:10:53 GMT [JHJ] + * * * * * * This file contains MACHINE-GENERATED DATA, do not edit! * * * * * */ #ifndef NS_UNICODE_SCRIPT_CODES #define NS_UNICODE_SCRIPT_CODES +struct nsCharProps1 { + unsigned char mMirrorOffsetIndex:5; + unsigned char mHangulType:3; + unsigned char mCombiningClass:8; +}; + +struct nsCharProps2 { + unsigned char mScriptCode:8; + unsigned char mEAW:3; + unsigned char mCategory:5; + unsigned char mBidiCategory:5; + unsigned char mXidmod:4; + signed char mNumericValue:5; + unsigned char mHanVariant:2; +}; + enum { MOZ_SCRIPT_COMMON = 0, MOZ_SCRIPT_INHERITED = 1, From 5f367810bdbc54290994fdfbc9264bba7a13def4 Mon Sep 17 00:00:00 2001 From: Simon Montagu Date: Wed, 18 Apr 2012 21:54:54 -0700 Subject: [PATCH 015/182] bug 738101 - Use the new mozilla::unicode::GetBidiCat instead of the old GetBidiCat. r=jfkthame --- intl/unicharutil/util/bidicattable.h | 4137 ---------------------- intl/unicharutil/util/genbidicattable.pl | 417 --- intl/unicharutil/util/nsBidiUtils.cpp | 56 +- intl/unicharutil/util/nsBidiUtils.h | 34 +- layout/base/nsBidi.cpp | 12 +- 5 files changed, 15 insertions(+), 4641 deletions(-) delete mode 100644 intl/unicharutil/util/bidicattable.h delete mode 100644 intl/unicharutil/util/genbidicattable.pl diff --git a/intl/unicharutil/util/bidicattable.h b/intl/unicharutil/util/bidicattable.h deleted file mode 100644 index e5efd5b9bc8..00000000000 --- a/intl/unicharutil/util/bidicattable.h +++ /dev/null @@ -1,4137 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org Code. - * - * The Initial Developer of the Original Code is - * IBM Corporation. - * Portions created by the Initial Developer are Copyright (C) 2000 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either of the GNU General Public License Version 2 or later (the "GPL"), - * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ -/* - DO NOT EDIT THIS DOCUMENT !!! THIS DOCUMENT IS GENERATED BY - mozilla/intl/unicharutil/util/genbidicattable.pl - */ - - -#include "nscore.h" - -static PRUint8 gBidiCatIdx1[1664] = { - 11, /* U+0000 - U+0007 : 0xBBBBBBBB */ - 16, /* U+0008 - U+000F : 0xBBCEDCDB */ - 11, /* U+0010 - U+0017 : 0xBBBBBBBB */ - 17, /* U+0018 - U+001F : 0xDCCCBBBB */ - 18, /* U+0020 - U+0027 : 0x9977799E */ - 19, /* U+0028 - U+002F : 0x88686999 */ - 5, /* U+0030 - U+0037 : 0x55555555 */ - 20, /* U+0038 - U+003F : 0x99999855 */ - 21, /* U+0040 - U+0047 : 0x11111119 */ - 1, /* U+0048 - U+004F : 0x11111111 */ - 1, /* U+0050 - U+0057 : 0x11111111 */ - 22, /* U+0058 - U+005F : 0x99999111 */ - 21, /* U+0060 - U+0067 : 0x11111119 */ - 1, /* U+0068 - U+006F : 0x11111111 */ - 1, /* U+0070 - U+0077 : 0x11111111 */ - 23, /* U+0078 - U+007F : 0xB9999111 */ - 24, /* U+0080 - U+0087 : 0xBBCBBBBB */ - 11, /* U+0088 - U+008F : 0xBBBBBBBB */ - 11, /* U+0090 - U+0097 : 0xBBBBBBBB */ - 11, /* U+0098 - U+009F : 0xBBBBBBBB */ - 25, /* U+00A0 - U+00A7 : 0x99777798 */ - 26, /* U+00A8 - U+00AF : 0x99B99199 */ - 27, /* U+00B0 - U+00B7 : 0x99195577 */ - 28, /* U+00B8 - U+00BF : 0x99999159 */ - 1, /* U+00C0 - U+00C7 : 0x11111111 */ - 1, /* U+00C8 - U+00CF : 0x11111111 */ - 29, /* U+00D0 - U+00D7 : 0x91111111 */ - 1, /* U+00D8 - U+00DF : 0x11111111 */ - 1, /* U+00E0 - U+00E7 : 0x11111111 */ - 1, /* U+00E8 - U+00EF : 0x11111111 */ - 29, /* U+00F0 - U+00F7 : 0x91111111 */ - 1, /* U+00F8 - U+00FF : 0x11111111 */ - 1, /* U+0100 - U+0107 : 0x11111111 */ - 1, /* U+0108 - U+010F : 0x11111111 */ - 1, /* U+0110 - U+0117 : 0x11111111 */ - 1, /* U+0118 - U+011F : 0x11111111 */ - 1, /* U+0120 - U+0127 : 0x11111111 */ - 1, /* U+0128 - U+012F : 0x11111111 */ - 1, /* U+0130 - U+0137 : 0x11111111 */ - 1, /* U+0138 - U+013F : 0x11111111 */ - 1, /* U+0140 - U+0147 : 0x11111111 */ - 1, /* U+0148 - U+014F : 0x11111111 */ - 1, /* U+0150 - U+0157 : 0x11111111 */ - 1, /* U+0158 - U+015F : 0x11111111 */ - 1, /* U+0160 - U+0167 : 0x11111111 */ - 1, /* U+0168 - U+016F : 0x11111111 */ - 1, /* U+0170 - U+0177 : 0x11111111 */ - 1, /* U+0178 - U+017F : 0x11111111 */ - 1, /* U+0180 - U+0187 : 0x11111111 */ - 1, /* U+0188 - U+018F : 0x11111111 */ - 1, /* U+0190 - U+0197 : 0x11111111 */ - 1, /* U+0198 - U+019F : 0x11111111 */ - 1, /* U+01A0 - U+01A7 : 0x11111111 */ - 1, /* U+01A8 - U+01AF : 0x11111111 */ - 1, /* U+01B0 - U+01B7 : 0x11111111 */ - 1, /* U+01B8 - U+01BF : 0x11111111 */ - 1, /* U+01C0 - U+01C7 : 0x11111111 */ - 1, /* U+01C8 - U+01CF : 0x11111111 */ - 1, /* U+01D0 - U+01D7 : 0x11111111 */ - 1, /* U+01D8 - U+01DF : 0x11111111 */ - 1, /* U+01E0 - U+01E7 : 0x11111111 */ - 1, /* U+01E8 - U+01EF : 0x11111111 */ - 1, /* U+01F0 - U+01F7 : 0x11111111 */ - 1, /* U+01F8 - U+01FF : 0x11111111 */ - 1, /* U+0200 - U+0207 : 0x11111111 */ - 1, /* U+0208 - U+020F : 0x11111111 */ - 1, /* U+0210 - U+0217 : 0x11111111 */ - 1, /* U+0218 - U+021F : 0x11111111 */ - 1, /* U+0220 - U+0227 : 0x11111111 */ - 1, /* U+0228 - U+022F : 0x11111111 */ - 1, /* U+0230 - U+0237 : 0x11111111 */ - 1, /* U+0238 - U+023F : 0x11111111 */ - 1, /* U+0240 - U+0247 : 0x11111111 */ - 1, /* U+0248 - U+024F : 0x11111111 */ - 1, /* U+0250 - U+0257 : 0x11111111 */ - 1, /* U+0258 - U+025F : 0x11111111 */ - 1, /* U+0260 - U+0267 : 0x11111111 */ - 1, /* U+0268 - U+026F : 0x11111111 */ - 1, /* U+0270 - U+0277 : 0x11111111 */ - 1, /* U+0278 - U+027F : 0x11111111 */ - 1, /* U+0280 - U+0287 : 0x11111111 */ - 1, /* U+0288 - U+028F : 0x11111111 */ - 1, /* U+0290 - U+0297 : 0x11111111 */ - 1, /* U+0298 - U+029F : 0x11111111 */ - 1, /* U+02A0 - U+02A7 : 0x11111111 */ - 1, /* U+02A8 - U+02AF : 0x11111111 */ - 1, /* U+02B0 - U+02B7 : 0x11111111 */ - 30, /* U+02B8 - U+02BF : 0x11111991 */ - 31, /* U+02C0 - U+02C7 : 0x99999911 */ - 9, /* U+02C8 - U+02CF : 0x99999999 */ - 31, /* U+02D0 - U+02D7 : 0x99999911 */ - 9, /* U+02D8 - U+02DF : 0x99999999 */ - 32, /* U+02E0 - U+02E7 : 0x99911111 */ - 33, /* U+02E8 - U+02EF : 0x91999999 */ - 9, /* U+02F0 - U+02F7 : 0x99999999 */ - 9, /* U+02F8 - U+02FF : 0x99999999 */ - 10, /* U+0300 - U+0307 : 0xAAAAAAAA */ - 10, /* U+0308 - U+030F : 0xAAAAAAAA */ - 10, /* U+0310 - U+0317 : 0xAAAAAAAA */ - 10, /* U+0318 - U+031F : 0xAAAAAAAA */ - 10, /* U+0320 - U+0327 : 0xAAAAAAAA */ - 10, /* U+0328 - U+032F : 0xAAAAAAAA */ - 10, /* U+0330 - U+0337 : 0xAAAAAAAA */ - 10, /* U+0338 - U+033F : 0xAAAAAAAA */ - 10, /* U+0340 - U+0347 : 0xAAAAAAAA */ - 10, /* U+0348 - U+034F : 0xAAAAAAAA */ - 10, /* U+0350 - U+0357 : 0xAAAAAAAA */ - 10, /* U+0358 - U+035F : 0xAAAAAAAA */ - 10, /* U+0360 - U+0367 : 0xAAAAAAAA */ - 10, /* U+0368 - U+036F : 0xAAAAAAAA */ - 34, /* U+0370 - U+0377 : 0x11991111 */ - 35, /* U+0378 - U+037F : 0x19111111 */ - 36, /* U+0380 - U+0387 : 0x91991111 */ - 1, /* U+0388 - U+038F : 0x11111111 */ - 1, /* U+0390 - U+0397 : 0x11111111 */ - 1, /* U+0398 - U+039F : 0x11111111 */ - 1, /* U+03A0 - U+03A7 : 0x11111111 */ - 1, /* U+03A8 - U+03AF : 0x11111111 */ - 1, /* U+03B0 - U+03B7 : 0x11111111 */ - 1, /* U+03B8 - U+03BF : 0x11111111 */ - 1, /* U+03C0 - U+03C7 : 0x11111111 */ - 1, /* U+03C8 - U+03CF : 0x11111111 */ - 1, /* U+03D0 - U+03D7 : 0x11111111 */ - 1, /* U+03D8 - U+03DF : 0x11111111 */ - 1, /* U+03E0 - U+03E7 : 0x11111111 */ - 1, /* U+03E8 - U+03EF : 0x11111111 */ - 35, /* U+03F0 - U+03F7 : 0x19111111 */ - 1, /* U+03F8 - U+03FF : 0x11111111 */ - 1, /* U+0400 - U+0407 : 0x11111111 */ - 1, /* U+0408 - U+040F : 0x11111111 */ - 1, /* U+0410 - U+0417 : 0x11111111 */ - 1, /* U+0418 - U+041F : 0x11111111 */ - 1, /* U+0420 - U+0427 : 0x11111111 */ - 1, /* U+0428 - U+042F : 0x11111111 */ - 1, /* U+0430 - U+0437 : 0x11111111 */ - 1, /* U+0438 - U+043F : 0x11111111 */ - 1, /* U+0440 - U+0447 : 0x11111111 */ - 1, /* U+0448 - U+044F : 0x11111111 */ - 1, /* U+0450 - U+0457 : 0x11111111 */ - 1, /* U+0458 - U+045F : 0x11111111 */ - 1, /* U+0460 - U+0467 : 0x11111111 */ - 1, /* U+0468 - U+046F : 0x11111111 */ - 1, /* U+0470 - U+0477 : 0x11111111 */ - 1, /* U+0478 - U+047F : 0x11111111 */ - 37, /* U+0480 - U+0487 : 0xAAAAA111 */ - 38, /* U+0488 - U+048F : 0x111111AA */ - 1, /* U+0490 - U+0497 : 0x11111111 */ - 1, /* U+0498 - U+049F : 0x11111111 */ - 1, /* U+04A0 - U+04A7 : 0x11111111 */ - 1, /* U+04A8 - U+04AF : 0x11111111 */ - 1, /* U+04B0 - U+04B7 : 0x11111111 */ - 1, /* U+04B8 - U+04BF : 0x11111111 */ - 1, /* U+04C0 - U+04C7 : 0x11111111 */ - 1, /* U+04C8 - U+04CF : 0x11111111 */ - 1, /* U+04D0 - U+04D7 : 0x11111111 */ - 1, /* U+04D8 - U+04DF : 0x11111111 */ - 1, /* U+04E0 - U+04E7 : 0x11111111 */ - 1, /* U+04E8 - U+04EF : 0x11111111 */ - 1, /* U+04F0 - U+04F7 : 0x11111111 */ - 1, /* U+04F8 - U+04FF : 0x11111111 */ - 1, /* U+0500 - U+0507 : 0x11111111 */ - 1, /* U+0508 - U+050F : 0x11111111 */ - 1, /* U+0510 - U+0517 : 0x11111111 */ - 1, /* U+0518 - U+051F : 0x11111111 */ - 1, /* U+0520 - U+0527 : 0x11111111 */ - 1, /* U+0528 - U+052F : 0x11111111 */ - 1, /* U+0530 - U+0537 : 0x11111111 */ - 1, /* U+0538 - U+053F : 0x11111111 */ - 1, /* U+0540 - U+0547 : 0x11111111 */ - 1, /* U+0548 - U+054F : 0x11111111 */ - 1, /* U+0550 - U+0557 : 0x11111111 */ - 1, /* U+0558 - U+055F : 0x11111111 */ - 1, /* U+0560 - U+0567 : 0x11111111 */ - 1, /* U+0568 - U+056F : 0x11111111 */ - 1, /* U+0570 - U+0577 : 0x11111111 */ - 1, /* U+0578 - U+057F : 0x11111111 */ - 1, /* U+0580 - U+0587 : 0x11111111 */ - 39, /* U+0588 - U+058F : 0x71111911 */ - 40, /* U+0590 - U+0597 : 0xAAAAAAA2 */ - 10, /* U+0598 - U+059F : 0xAAAAAAAA */ - 10, /* U+05A0 - U+05A7 : 0xAAAAAAAA */ - 10, /* U+05A8 - U+05AF : 0xAAAAAAAA */ - 10, /* U+05B0 - U+05B7 : 0xAAAAAAAA */ - 41, /* U+05B8 - U+05BF : 0xA2AAAAAA */ - 42, /* U+05C0 - U+05C7 : 0xA2AA2AA2 */ - 2, /* U+05C8 - U+05CF : 0x22222222 */ - 2, /* U+05D0 - U+05D7 : 0x22222222 */ - 2, /* U+05D8 - U+05DF : 0x22222222 */ - 2, /* U+05E0 - U+05E7 : 0x22222222 */ - 2, /* U+05E8 - U+05EF : 0x22222222 */ - 2, /* U+05F0 - U+05F7 : 0x22222222 */ - 2, /* U+05F8 - U+05FF : 0x22222222 */ - 43, /* U+0600 - U+0607 : 0x99344444 */ - 44, /* U+0608 - U+060F : 0x99383773 */ - 10, /* U+0610 - U+0617 : 0xAAAAAAAA */ - 45, /* U+0618 - U+061F : 0x33333AAA */ - 3, /* U+0620 - U+0627 : 0x33333333 */ - 3, /* U+0628 - U+062F : 0x33333333 */ - 3, /* U+0630 - U+0637 : 0x33333333 */ - 3, /* U+0638 - U+063F : 0x33333333 */ - 3, /* U+0640 - U+0647 : 0x33333333 */ - 46, /* U+0648 - U+064F : 0xAAAAA333 */ - 10, /* U+0650 - U+0657 : 0xAAAAAAAA */ - 10, /* U+0658 - U+065F : 0xAAAAAAAA */ - 4, /* U+0660 - U+0667 : 0x44444444 */ - 47, /* U+0668 - U+066F : 0x33344744 */ - 48, /* U+0670 - U+0677 : 0x3333333A */ - 3, /* U+0678 - U+067F : 0x33333333 */ - 3, /* U+0680 - U+0687 : 0x33333333 */ - 3, /* U+0688 - U+068F : 0x33333333 */ - 3, /* U+0690 - U+0697 : 0x33333333 */ - 3, /* U+0698 - U+069F : 0x33333333 */ - 3, /* U+06A0 - U+06A7 : 0x33333333 */ - 3, /* U+06A8 - U+06AF : 0x33333333 */ - 3, /* U+06B0 - U+06B7 : 0x33333333 */ - 3, /* U+06B8 - U+06BF : 0x33333333 */ - 3, /* U+06C0 - U+06C7 : 0x33333333 */ - 3, /* U+06C8 - U+06CF : 0x33333333 */ - 49, /* U+06D0 - U+06D7 : 0xAA333333 */ - 50, /* U+06D8 - U+06DF : 0xA94AAAAA */ - 51, /* U+06E0 - U+06E7 : 0xA33AAAAA */ - 52, /* U+06E8 - U+06EF : 0x33AAAA9A */ - 5, /* U+06F0 - U+06F7 : 0x55555555 */ - 53, /* U+06F8 - U+06FF : 0x33333355 */ - 3, /* U+0700 - U+0707 : 0x33333333 */ - 3, /* U+0708 - U+070F : 0x33333333 */ - 54, /* U+0710 - U+0717 : 0x333333A3 */ - 3, /* U+0718 - U+071F : 0x33333333 */ - 3, /* U+0720 - U+0727 : 0x33333333 */ - 3, /* U+0728 - U+072F : 0x33333333 */ - 10, /* U+0730 - U+0737 : 0xAAAAAAAA */ - 10, /* U+0738 - U+073F : 0xAAAAAAAA */ - 10, /* U+0740 - U+0747 : 0xAAAAAAAA */ - 45, /* U+0748 - U+074F : 0x33333AAA */ - 3, /* U+0750 - U+0757 : 0x33333333 */ - 3, /* U+0758 - U+075F : 0x33333333 */ - 3, /* U+0760 - U+0767 : 0x33333333 */ - 3, /* U+0768 - U+076F : 0x33333333 */ - 3, /* U+0770 - U+0777 : 0x33333333 */ - 3, /* U+0778 - U+077F : 0x33333333 */ - 3, /* U+0780 - U+0787 : 0x33333333 */ - 3, /* U+0788 - U+078F : 0x33333333 */ - 3, /* U+0790 - U+0797 : 0x33333333 */ - 3, /* U+0798 - U+079F : 0x33333333 */ - 49, /* U+07A0 - U+07A7 : 0xAA333333 */ - 10, /* U+07A8 - U+07AF : 0xAAAAAAAA */ - 48, /* U+07B0 - U+07B7 : 0x3333333A */ - 3, /* U+07B8 - U+07BF : 0x33333333 */ - 2, /* U+07C0 - U+07C7 : 0x22222222 */ - 2, /* U+07C8 - U+07CF : 0x22222222 */ - 2, /* U+07D0 - U+07D7 : 0x22222222 */ - 2, /* U+07D8 - U+07DF : 0x22222222 */ - 2, /* U+07E0 - U+07E7 : 0x22222222 */ - 55, /* U+07E8 - U+07EF : 0xAAAAA222 */ - 56, /* U+07F0 - U+07F7 : 0x9922AAAA */ - 57, /* U+07F8 - U+07FF : 0x22222299 */ - 2, /* U+0800 - U+0807 : 0x22222222 */ - 2, /* U+0808 - U+080F : 0x22222222 */ - 58, /* U+0810 - U+0817 : 0xAA222222 */ - 59, /* U+0818 - U+081F : 0xAAAAA2AA */ - 60, /* U+0820 - U+0827 : 0xAAA2AAAA */ - 61, /* U+0828 - U+082F : 0x22AAAAA2 */ - 2, /* U+0830 - U+0837 : 0x22222222 */ - 2, /* U+0838 - U+083F : 0x22222222 */ - 2, /* U+0840 - U+0847 : 0x22222222 */ - 2, /* U+0848 - U+084F : 0x22222222 */ - 2, /* U+0850 - U+0857 : 0x22222222 */ - 62, /* U+0858 - U+085F : 0x2222AAA2 */ - 2, /* U+0860 - U+0867 : 0x22222222 */ - 2, /* U+0868 - U+086F : 0x22222222 */ - 2, /* U+0870 - U+0877 : 0x22222222 */ - 2, /* U+0878 - U+087F : 0x22222222 */ - 2, /* U+0880 - U+0887 : 0x22222222 */ - 2, /* U+0888 - U+088F : 0x22222222 */ - 2, /* U+0890 - U+0897 : 0x22222222 */ - 2, /* U+0898 - U+089F : 0x22222222 */ - 63, /* U+08A0 - U+08A7 : 0x33333323 */ - 64, /* U+08A8 - U+08AF : 0x22233333 */ - 2, /* U+08B0 - U+08B7 : 0x22222222 */ - 2, /* U+08B8 - U+08BF : 0x22222222 */ - 2, /* U+08C0 - U+08C7 : 0x22222222 */ - 2, /* U+08C8 - U+08CF : 0x22222222 */ - 2, /* U+08D0 - U+08D7 : 0x22222222 */ - 2, /* U+08D8 - U+08DF : 0x22222222 */ - 65, /* U+08E0 - U+08E7 : 0xAAAA2222 */ - 10, /* U+08E8 - U+08EF : 0xAAAAAAAA */ - 10, /* U+08F0 - U+08F7 : 0xAAAAAAAA */ - 66, /* U+08F8 - U+08FF : 0x2AAAAAAA */ - 67, /* U+0900 - U+0907 : 0x11111AAA */ - 1, /* U+0908 - U+090F : 0x11111111 */ - 1, /* U+0910 - U+0917 : 0x11111111 */ - 1, /* U+0918 - U+091F : 0x11111111 */ - 1, /* U+0920 - U+0927 : 0x11111111 */ - 1, /* U+0928 - U+092F : 0x11111111 */ - 1, /* U+0930 - U+0937 : 0x11111111 */ - 68, /* U+0938 - U+093F : 0x111A1A11 */ - 69, /* U+0940 - U+0947 : 0xAAAAAAA1 */ - 70, /* U+0948 - U+094F : 0x11A1111A */ - 69, /* U+0950 - U+0957 : 0xAAAAAAA1 */ - 1, /* U+0958 - U+095F : 0x11111111 */ - 71, /* U+0960 - U+0967 : 0x1111AA11 */ - 1, /* U+0968 - U+096F : 0x11111111 */ - 1, /* U+0970 - U+0977 : 0x11111111 */ - 1, /* U+0978 - U+097F : 0x11111111 */ - 72, /* U+0980 - U+0987 : 0x111111A1 */ - 1, /* U+0988 - U+098F : 0x11111111 */ - 1, /* U+0990 - U+0997 : 0x11111111 */ - 1, /* U+0998 - U+099F : 0x11111111 */ - 1, /* U+09A0 - U+09A7 : 0x11111111 */ - 1, /* U+09A8 - U+09AF : 0x11111111 */ - 1, /* U+09B0 - U+09B7 : 0x11111111 */ - 73, /* U+09B8 - U+09BF : 0x111A1111 */ - 74, /* U+09C0 - U+09C7 : 0x111AAAA1 */ - 75, /* U+09C8 - U+09CF : 0x11A11111 */ - 1, /* U+09D0 - U+09D7 : 0x11111111 */ - 1, /* U+09D8 - U+09DF : 0x11111111 */ - 71, /* U+09E0 - U+09E7 : 0x1111AA11 */ - 1, /* U+09E8 - U+09EF : 0x11111111 */ - 76, /* U+09F0 - U+09F7 : 0x11117711 */ - 77, /* U+09F8 - U+09FF : 0x11117111 */ - 78, /* U+0A00 - U+0A07 : 0x11111AA1 */ - 1, /* U+0A08 - U+0A0F : 0x11111111 */ - 1, /* U+0A10 - U+0A17 : 0x11111111 */ - 1, /* U+0A18 - U+0A1F : 0x11111111 */ - 1, /* U+0A20 - U+0A27 : 0x11111111 */ - 1, /* U+0A28 - U+0A2F : 0x11111111 */ - 1, /* U+0A30 - U+0A37 : 0x11111111 */ - 73, /* U+0A38 - U+0A3F : 0x111A1111 */ - 79, /* U+0A40 - U+0A47 : 0xA1111AA1 */ - 80, /* U+0A48 - U+0A4F : 0x11AAA11A */ - 72, /* U+0A50 - U+0A57 : 0x111111A1 */ - 1, /* U+0A58 - U+0A5F : 0x11111111 */ - 1, /* U+0A60 - U+0A67 : 0x11111111 */ - 1, /* U+0A68 - U+0A6F : 0x11111111 */ - 81, /* U+0A70 - U+0A77 : 0x11A111AA */ - 1, /* U+0A78 - U+0A7F : 0x11111111 */ - 78, /* U+0A80 - U+0A87 : 0x11111AA1 */ - 1, /* U+0A88 - U+0A8F : 0x11111111 */ - 1, /* U+0A90 - U+0A97 : 0x11111111 */ - 1, /* U+0A98 - U+0A9F : 0x11111111 */ - 1, /* U+0AA0 - U+0AA7 : 0x11111111 */ - 1, /* U+0AA8 - U+0AAF : 0x11111111 */ - 1, /* U+0AB0 - U+0AB7 : 0x11111111 */ - 73, /* U+0AB8 - U+0ABF : 0x111A1111 */ - 82, /* U+0AC0 - U+0AC7 : 0xA1AAAAA1 */ - 70, /* U+0AC8 - U+0ACF : 0x11A1111A */ - 1, /* U+0AD0 - U+0AD7 : 0x11111111 */ - 1, /* U+0AD8 - U+0ADF : 0x11111111 */ - 71, /* U+0AE0 - U+0AE7 : 0x1111AA11 */ - 1, /* U+0AE8 - U+0AEF : 0x11111111 */ - 83, /* U+0AF0 - U+0AF7 : 0x11111171 */ - 1, /* U+0AF8 - U+0AFF : 0x11111111 */ - 72, /* U+0B00 - U+0B07 : 0x111111A1 */ - 1, /* U+0B08 - U+0B0F : 0x11111111 */ - 1, /* U+0B10 - U+0B17 : 0x11111111 */ - 1, /* U+0B18 - U+0B1F : 0x11111111 */ - 1, /* U+0B20 - U+0B27 : 0x11111111 */ - 1, /* U+0B28 - U+0B2F : 0x11111111 */ - 1, /* U+0B30 - U+0B37 : 0x11111111 */ - 84, /* U+0B38 - U+0B3F : 0xA11A1111 */ - 74, /* U+0B40 - U+0B47 : 0x111AAAA1 */ - 75, /* U+0B48 - U+0B4F : 0x11A11111 */ - 85, /* U+0B50 - U+0B57 : 0x1A111111 */ - 1, /* U+0B58 - U+0B5F : 0x11111111 */ - 71, /* U+0B60 - U+0B67 : 0x1111AA11 */ - 1, /* U+0B68 - U+0B6F : 0x11111111 */ - 1, /* U+0B70 - U+0B77 : 0x11111111 */ - 1, /* U+0B78 - U+0B7F : 0x11111111 */ - 86, /* U+0B80 - U+0B87 : 0x11111A11 */ - 1, /* U+0B88 - U+0B8F : 0x11111111 */ - 1, /* U+0B90 - U+0B97 : 0x11111111 */ - 1, /* U+0B98 - U+0B9F : 0x11111111 */ - 1, /* U+0BA0 - U+0BA7 : 0x11111111 */ - 1, /* U+0BA8 - U+0BAF : 0x11111111 */ - 1, /* U+0BB0 - U+0BB7 : 0x11111111 */ - 1, /* U+0BB8 - U+0BBF : 0x11111111 */ - 87, /* U+0BC0 - U+0BC7 : 0x1111111A */ - 75, /* U+0BC8 - U+0BCF : 0x11A11111 */ - 1, /* U+0BD0 - U+0BD7 : 0x11111111 */ - 1, /* U+0BD8 - U+0BDF : 0x11111111 */ - 1, /* U+0BE0 - U+0BE7 : 0x11111111 */ - 1, /* U+0BE8 - U+0BEF : 0x11111111 */ - 22, /* U+0BF0 - U+0BF7 : 0x99999111 */ - 88, /* U+0BF8 - U+0BFF : 0x11111979 */ - 1, /* U+0C00 - U+0C07 : 0x11111111 */ - 1, /* U+0C08 - U+0C0F : 0x11111111 */ - 1, /* U+0C10 - U+0C17 : 0x11111111 */ - 1, /* U+0C18 - U+0C1F : 0x11111111 */ - 1, /* U+0C20 - U+0C27 : 0x11111111 */ - 1, /* U+0C28 - U+0C2F : 0x11111111 */ - 1, /* U+0C30 - U+0C37 : 0x11111111 */ - 89, /* U+0C38 - U+0C3F : 0xAA111111 */ - 90, /* U+0C40 - U+0C47 : 0xAA11111A */ - 91, /* U+0C48 - U+0C4F : 0x11AAAA1A */ - 92, /* U+0C50 - U+0C57 : 0x1AA11111 */ - 1, /* U+0C58 - U+0C5F : 0x11111111 */ - 71, /* U+0C60 - U+0C67 : 0x1111AA11 */ - 1, /* U+0C68 - U+0C6F : 0x11111111 */ - 1, /* U+0C70 - U+0C77 : 0x11111111 */ - 93, /* U+0C78 - U+0C7F : 0x19999999 */ - 1, /* U+0C80 - U+0C87 : 0x11111111 */ - 1, /* U+0C88 - U+0C8F : 0x11111111 */ - 1, /* U+0C90 - U+0C97 : 0x11111111 */ - 1, /* U+0C98 - U+0C9F : 0x11111111 */ - 1, /* U+0CA0 - U+0CA7 : 0x11111111 */ - 1, /* U+0CA8 - U+0CAF : 0x11111111 */ - 1, /* U+0CB0 - U+0CB7 : 0x11111111 */ - 73, /* U+0CB8 - U+0CBF : 0x111A1111 */ - 1, /* U+0CC0 - U+0CC7 : 0x11111111 */ - 94, /* U+0CC8 - U+0CCF : 0x11AA1111 */ - 1, /* U+0CD0 - U+0CD7 : 0x11111111 */ - 1, /* U+0CD8 - U+0CDF : 0x11111111 */ - 71, /* U+0CE0 - U+0CE7 : 0x1111AA11 */ - 1, /* U+0CE8 - U+0CEF : 0x11111111 */ - 1, /* U+0CF0 - U+0CF7 : 0x11111111 */ - 1, /* U+0CF8 - U+0CFF : 0x11111111 */ - 1, /* U+0D00 - U+0D07 : 0x11111111 */ - 1, /* U+0D08 - U+0D0F : 0x11111111 */ - 1, /* U+0D10 - U+0D17 : 0x11111111 */ - 1, /* U+0D18 - U+0D1F : 0x11111111 */ - 1, /* U+0D20 - U+0D27 : 0x11111111 */ - 1, /* U+0D28 - U+0D2F : 0x11111111 */ - 1, /* U+0D30 - U+0D37 : 0x11111111 */ - 1, /* U+0D38 - U+0D3F : 0x11111111 */ - 74, /* U+0D40 - U+0D47 : 0x111AAAA1 */ - 75, /* U+0D48 - U+0D4F : 0x11A11111 */ - 1, /* U+0D50 - U+0D57 : 0x11111111 */ - 1, /* U+0D58 - U+0D5F : 0x11111111 */ - 71, /* U+0D60 - U+0D67 : 0x1111AA11 */ - 1, /* U+0D68 - U+0D6F : 0x11111111 */ - 1, /* U+0D70 - U+0D77 : 0x11111111 */ - 1, /* U+0D78 - U+0D7F : 0x11111111 */ - 1, /* U+0D80 - U+0D87 : 0x11111111 */ - 1, /* U+0D88 - U+0D8F : 0x11111111 */ - 1, /* U+0D90 - U+0D97 : 0x11111111 */ - 1, /* U+0D98 - U+0D9F : 0x11111111 */ - 1, /* U+0DA0 - U+0DA7 : 0x11111111 */ - 1, /* U+0DA8 - U+0DAF : 0x11111111 */ - 1, /* U+0DB0 - U+0DB7 : 0x11111111 */ - 1, /* U+0DB8 - U+0DBF : 0x11111111 */ - 1, /* U+0DC0 - U+0DC7 : 0x11111111 */ - 86, /* U+0DC8 - U+0DCF : 0x11111A11 */ - 95, /* U+0DD0 - U+0DD7 : 0x1A1AAA11 */ - 1, /* U+0DD8 - U+0DDF : 0x11111111 */ - 1, /* U+0DE0 - U+0DE7 : 0x11111111 */ - 1, /* U+0DE8 - U+0DEF : 0x11111111 */ - 1, /* U+0DF0 - U+0DF7 : 0x11111111 */ - 1, /* U+0DF8 - U+0DFF : 0x11111111 */ - 1, /* U+0E00 - U+0E07 : 0x11111111 */ - 1, /* U+0E08 - U+0E0F : 0x11111111 */ - 1, /* U+0E10 - U+0E17 : 0x11111111 */ - 1, /* U+0E18 - U+0E1F : 0x11111111 */ - 1, /* U+0E20 - U+0E27 : 0x11111111 */ - 1, /* U+0E28 - U+0E2F : 0x11111111 */ - 96, /* U+0E30 - U+0E37 : 0xAAAA11A1 */ - 97, /* U+0E38 - U+0E3F : 0x71111AAA */ - 98, /* U+0E40 - U+0E47 : 0xA1111111 */ - 99, /* U+0E48 - U+0E4F : 0x1AAAAAAA */ - 1, /* U+0E50 - U+0E57 : 0x11111111 */ - 1, /* U+0E58 - U+0E5F : 0x11111111 */ - 1, /* U+0E60 - U+0E67 : 0x11111111 */ - 1, /* U+0E68 - U+0E6F : 0x11111111 */ - 1, /* U+0E70 - U+0E77 : 0x11111111 */ - 1, /* U+0E78 - U+0E7F : 0x11111111 */ - 1, /* U+0E80 - U+0E87 : 0x11111111 */ - 1, /* U+0E88 - U+0E8F : 0x11111111 */ - 1, /* U+0E90 - U+0E97 : 0x11111111 */ - 1, /* U+0E98 - U+0E9F : 0x11111111 */ - 1, /* U+0EA0 - U+0EA7 : 0x11111111 */ - 1, /* U+0EA8 - U+0EAF : 0x11111111 */ - 96, /* U+0EB0 - U+0EB7 : 0xAAAA11A1 */ - 100, /* U+0EB8 - U+0EBF : 0x111AA1AA */ - 1, /* U+0EC0 - U+0EC7 : 0x11111111 */ - 101, /* U+0EC8 - U+0ECF : 0x11AAAAAA */ - 1, /* U+0ED0 - U+0ED7 : 0x11111111 */ - 1, /* U+0ED8 - U+0EDF : 0x11111111 */ - 1, /* U+0EE0 - U+0EE7 : 0x11111111 */ - 1, /* U+0EE8 - U+0EEF : 0x11111111 */ - 1, /* U+0EF0 - U+0EF7 : 0x11111111 */ - 1, /* U+0EF8 - U+0EFF : 0x11111111 */ - 1, /* U+0F00 - U+0F07 : 0x11111111 */ - 1, /* U+0F08 - U+0F0F : 0x11111111 */ - 1, /* U+0F10 - U+0F17 : 0x11111111 */ - 38, /* U+0F18 - U+0F1F : 0x111111AA */ - 1, /* U+0F20 - U+0F27 : 0x11111111 */ - 1, /* U+0F28 - U+0F2F : 0x11111111 */ - 102, /* U+0F30 - U+0F37 : 0xA1A11111 */ - 103, /* U+0F38 - U+0F3F : 0x119999A1 */ - 1, /* U+0F40 - U+0F47 : 0x11111111 */ - 1, /* U+0F48 - U+0F4F : 0x11111111 */ - 1, /* U+0F50 - U+0F57 : 0x11111111 */ - 1, /* U+0F58 - U+0F5F : 0x11111111 */ - 1, /* U+0F60 - U+0F67 : 0x11111111 */ - 1, /* U+0F68 - U+0F6F : 0x11111111 */ - 69, /* U+0F70 - U+0F77 : 0xAAAAAAA1 */ - 99, /* U+0F78 - U+0F7F : 0x1AAAAAAA */ - 104, /* U+0F80 - U+0F87 : 0xAA1AAAAA */ - 105, /* U+0F88 - U+0F8F : 0xAAA11111 */ - 10, /* U+0F90 - U+0F97 : 0xAAAAAAAA */ - 69, /* U+0F98 - U+0F9F : 0xAAAAAAA1 */ - 10, /* U+0FA0 - U+0FA7 : 0xAAAAAAAA */ - 10, /* U+0FA8 - U+0FAF : 0xAAAAAAAA */ - 10, /* U+0FB0 - U+0FB7 : 0xAAAAAAAA */ - 106, /* U+0FB8 - U+0FBF : 0x111AAAAA */ - 85, /* U+0FC0 - U+0FC7 : 0x1A111111 */ - 1, /* U+0FC8 - U+0FCF : 0x11111111 */ - 1, /* U+0FD0 - U+0FD7 : 0x11111111 */ - 1, /* U+0FD8 - U+0FDF : 0x11111111 */ - 1, /* U+0FE0 - U+0FE7 : 0x11111111 */ - 1, /* U+0FE8 - U+0FEF : 0x11111111 */ - 1, /* U+0FF0 - U+0FF7 : 0x11111111 */ - 1, /* U+0FF8 - U+0FFF : 0x11111111 */ - 1, /* U+1000 - U+1007 : 0x11111111 */ - 1, /* U+1008 - U+100F : 0x11111111 */ - 1, /* U+1010 - U+1017 : 0x11111111 */ - 1, /* U+1018 - U+101F : 0x11111111 */ - 1, /* U+1020 - U+1027 : 0x11111111 */ - 105, /* U+1028 - U+102F : 0xAAA11111 */ - 107, /* U+1030 - U+1037 : 0xAAAAAA1A */ - 108, /* U+1038 - U+103F : 0x1AA11AA1 */ - 1, /* U+1040 - U+1047 : 0x11111111 */ - 1, /* U+1048 - U+104F : 0x11111111 */ - 1, /* U+1050 - U+1057 : 0x11111111 */ - 109, /* U+1058 - U+105F : 0xAA1111AA */ - 87, /* U+1060 - U+1067 : 0x1111111A */ - 1, /* U+1068 - U+106F : 0x11111111 */ - 74, /* U+1070 - U+1077 : 0x111AAAA1 */ - 1, /* U+1078 - U+107F : 0x11111111 */ - 110, /* U+1080 - U+1087 : 0x1AA11A11 */ - 75, /* U+1088 - U+108F : 0x11A11111 */ - 1, /* U+1090 - U+1097 : 0x11111111 */ - 75, /* U+1098 - U+109F : 0x11A11111 */ - 1, /* U+10A0 - U+10A7 : 0x11111111 */ - 1, /* U+10A8 - U+10AF : 0x11111111 */ - 1, /* U+10B0 - U+10B7 : 0x11111111 */ - 1, /* U+10B8 - U+10BF : 0x11111111 */ - 1, /* U+10C0 - U+10C7 : 0x11111111 */ - 1, /* U+10C8 - U+10CF : 0x11111111 */ - 1, /* U+10D0 - U+10D7 : 0x11111111 */ - 1, /* U+10D8 - U+10DF : 0x11111111 */ - 1, /* U+10E0 - U+10E7 : 0x11111111 */ - 1, /* U+10E8 - U+10EF : 0x11111111 */ - 1, /* U+10F0 - U+10F7 : 0x11111111 */ - 1, /* U+10F8 - U+10FF : 0x11111111 */ - 1, /* U+1100 - U+1107 : 0x11111111 */ - 1, /* U+1108 - U+110F : 0x11111111 */ - 1, /* U+1110 - U+1117 : 0x11111111 */ - 1, /* U+1118 - U+111F : 0x11111111 */ - 1, /* U+1120 - U+1127 : 0x11111111 */ - 1, /* U+1128 - U+112F : 0x11111111 */ - 1, /* U+1130 - U+1137 : 0x11111111 */ - 1, /* U+1138 - U+113F : 0x11111111 */ - 1, /* U+1140 - U+1147 : 0x11111111 */ - 1, /* U+1148 - U+114F : 0x11111111 */ - 1, /* U+1150 - U+1157 : 0x11111111 */ - 1, /* U+1158 - U+115F : 0x11111111 */ - 1, /* U+1160 - U+1167 : 0x11111111 */ - 1, /* U+1168 - U+116F : 0x11111111 */ - 1, /* U+1170 - U+1177 : 0x11111111 */ - 1, /* U+1178 - U+117F : 0x11111111 */ - 1, /* U+1180 - U+1187 : 0x11111111 */ - 1, /* U+1188 - U+118F : 0x11111111 */ - 1, /* U+1190 - U+1197 : 0x11111111 */ - 1, /* U+1198 - U+119F : 0x11111111 */ - 1, /* U+11A0 - U+11A7 : 0x11111111 */ - 1, /* U+11A8 - U+11AF : 0x11111111 */ - 1, /* U+11B0 - U+11B7 : 0x11111111 */ - 1, /* U+11B8 - U+11BF : 0x11111111 */ - 1, /* U+11C0 - U+11C7 : 0x11111111 */ - 1, /* U+11C8 - U+11CF : 0x11111111 */ - 1, /* U+11D0 - U+11D7 : 0x11111111 */ - 1, /* U+11D8 - U+11DF : 0x11111111 */ - 1, /* U+11E0 - U+11E7 : 0x11111111 */ - 1, /* U+11E8 - U+11EF : 0x11111111 */ - 1, /* U+11F0 - U+11F7 : 0x11111111 */ - 1, /* U+11F8 - U+11FF : 0x11111111 */ - 1, /* U+1200 - U+1207 : 0x11111111 */ - 1, /* U+1208 - U+120F : 0x11111111 */ - 1, /* U+1210 - U+1217 : 0x11111111 */ - 1, /* U+1218 - U+121F : 0x11111111 */ - 1, /* U+1220 - U+1227 : 0x11111111 */ - 1, /* U+1228 - U+122F : 0x11111111 */ - 1, /* U+1230 - U+1237 : 0x11111111 */ - 1, /* U+1238 - U+123F : 0x11111111 */ - 1, /* U+1240 - U+1247 : 0x11111111 */ - 1, /* U+1248 - U+124F : 0x11111111 */ - 1, /* U+1250 - U+1257 : 0x11111111 */ - 1, /* U+1258 - U+125F : 0x11111111 */ - 1, /* U+1260 - U+1267 : 0x11111111 */ - 1, /* U+1268 - U+126F : 0x11111111 */ - 1, /* U+1270 - U+1277 : 0x11111111 */ - 1, /* U+1278 - U+127F : 0x11111111 */ - 1, /* U+1280 - U+1287 : 0x11111111 */ - 1, /* U+1288 - U+128F : 0x11111111 */ - 1, /* U+1290 - U+1297 : 0x11111111 */ - 1, /* U+1298 - U+129F : 0x11111111 */ - 1, /* U+12A0 - U+12A7 : 0x11111111 */ - 1, /* U+12A8 - U+12AF : 0x11111111 */ - 1, /* U+12B0 - U+12B7 : 0x11111111 */ - 1, /* U+12B8 - U+12BF : 0x11111111 */ - 1, /* U+12C0 - U+12C7 : 0x11111111 */ - 1, /* U+12C8 - U+12CF : 0x11111111 */ - 1, /* U+12D0 - U+12D7 : 0x11111111 */ - 1, /* U+12D8 - U+12DF : 0x11111111 */ - 1, /* U+12E0 - U+12E7 : 0x11111111 */ - 1, /* U+12E8 - U+12EF : 0x11111111 */ - 1, /* U+12F0 - U+12F7 : 0x11111111 */ - 1, /* U+12F8 - U+12FF : 0x11111111 */ - 1, /* U+1300 - U+1307 : 0x11111111 */ - 1, /* U+1308 - U+130F : 0x11111111 */ - 1, /* U+1310 - U+1317 : 0x11111111 */ - 1, /* U+1318 - U+131F : 0x11111111 */ - 1, /* U+1320 - U+1327 : 0x11111111 */ - 1, /* U+1328 - U+132F : 0x11111111 */ - 1, /* U+1330 - U+1337 : 0x11111111 */ - 1, /* U+1338 - U+133F : 0x11111111 */ - 1, /* U+1340 - U+1347 : 0x11111111 */ - 1, /* U+1348 - U+134F : 0x11111111 */ - 1, /* U+1350 - U+1357 : 0x11111111 */ - 105, /* U+1358 - U+135F : 0xAAA11111 */ - 1, /* U+1360 - U+1367 : 0x11111111 */ - 1, /* U+1368 - U+136F : 0x11111111 */ - 1, /* U+1370 - U+1377 : 0x11111111 */ - 1, /* U+1378 - U+137F : 0x11111111 */ - 1, /* U+1380 - U+1387 : 0x11111111 */ - 1, /* U+1388 - U+138F : 0x11111111 */ - 9, /* U+1390 - U+1397 : 0x99999999 */ - 111, /* U+1398 - U+139F : 0x11111199 */ - 1, /* U+13A0 - U+13A7 : 0x11111111 */ - 1, /* U+13A8 - U+13AF : 0x11111111 */ - 1, /* U+13B0 - U+13B7 : 0x11111111 */ - 1, /* U+13B8 - U+13BF : 0x11111111 */ - 1, /* U+13C0 - U+13C7 : 0x11111111 */ - 1, /* U+13C8 - U+13CF : 0x11111111 */ - 1, /* U+13D0 - U+13D7 : 0x11111111 */ - 1, /* U+13D8 - U+13DF : 0x11111111 */ - 1, /* U+13E0 - U+13E7 : 0x11111111 */ - 1, /* U+13E8 - U+13EF : 0x11111111 */ - 1, /* U+13F0 - U+13F7 : 0x11111111 */ - 1, /* U+13F8 - U+13FF : 0x11111111 */ - 21, /* U+1400 - U+1407 : 0x11111119 */ - 1, /* U+1408 - U+140F : 0x11111111 */ - 1, /* U+1410 - U+1417 : 0x11111111 */ - 1, /* U+1418 - U+141F : 0x11111111 */ - 1, /* U+1420 - U+1427 : 0x11111111 */ - 1, /* U+1428 - U+142F : 0x11111111 */ - 1, /* U+1430 - U+1437 : 0x11111111 */ - 1, /* U+1438 - U+143F : 0x11111111 */ - 1, /* U+1440 - U+1447 : 0x11111111 */ - 1, /* U+1448 - U+144F : 0x11111111 */ - 1, /* U+1450 - U+1457 : 0x11111111 */ - 1, /* U+1458 - U+145F : 0x11111111 */ - 1, /* U+1460 - U+1467 : 0x11111111 */ - 1, /* U+1468 - U+146F : 0x11111111 */ - 1, /* U+1470 - U+1477 : 0x11111111 */ - 1, /* U+1478 - U+147F : 0x11111111 */ - 1, /* U+1480 - U+1487 : 0x11111111 */ - 1, /* U+1488 - U+148F : 0x11111111 */ - 1, /* U+1490 - U+1497 : 0x11111111 */ - 1, /* U+1498 - U+149F : 0x11111111 */ - 1, /* U+14A0 - U+14A7 : 0x11111111 */ - 1, /* U+14A8 - U+14AF : 0x11111111 */ - 1, /* U+14B0 - U+14B7 : 0x11111111 */ - 1, /* U+14B8 - U+14BF : 0x11111111 */ - 1, /* U+14C0 - U+14C7 : 0x11111111 */ - 1, /* U+14C8 - U+14CF : 0x11111111 */ - 1, /* U+14D0 - U+14D7 : 0x11111111 */ - 1, /* U+14D8 - U+14DF : 0x11111111 */ - 1, /* U+14E0 - U+14E7 : 0x11111111 */ - 1, /* U+14E8 - U+14EF : 0x11111111 */ - 1, /* U+14F0 - U+14F7 : 0x11111111 */ - 1, /* U+14F8 - U+14FF : 0x11111111 */ - 1, /* U+1500 - U+1507 : 0x11111111 */ - 1, /* U+1508 - U+150F : 0x11111111 */ - 1, /* U+1510 - U+1517 : 0x11111111 */ - 1, /* U+1518 - U+151F : 0x11111111 */ - 1, /* U+1520 - U+1527 : 0x11111111 */ - 1, /* U+1528 - U+152F : 0x11111111 */ - 1, /* U+1530 - U+1537 : 0x11111111 */ - 1, /* U+1538 - U+153F : 0x11111111 */ - 1, /* U+1540 - U+1547 : 0x11111111 */ - 1, /* U+1548 - U+154F : 0x11111111 */ - 1, /* U+1550 - U+1557 : 0x11111111 */ - 1, /* U+1558 - U+155F : 0x11111111 */ - 1, /* U+1560 - U+1567 : 0x11111111 */ - 1, /* U+1568 - U+156F : 0x11111111 */ - 1, /* U+1570 - U+1577 : 0x11111111 */ - 1, /* U+1578 - U+157F : 0x11111111 */ - 1, /* U+1580 - U+1587 : 0x11111111 */ - 1, /* U+1588 - U+158F : 0x11111111 */ - 1, /* U+1590 - U+1597 : 0x11111111 */ - 1, /* U+1598 - U+159F : 0x11111111 */ - 1, /* U+15A0 - U+15A7 : 0x11111111 */ - 1, /* U+15A8 - U+15AF : 0x11111111 */ - 1, /* U+15B0 - U+15B7 : 0x11111111 */ - 1, /* U+15B8 - U+15BF : 0x11111111 */ - 1, /* U+15C0 - U+15C7 : 0x11111111 */ - 1, /* U+15C8 - U+15CF : 0x11111111 */ - 1, /* U+15D0 - U+15D7 : 0x11111111 */ - 1, /* U+15D8 - U+15DF : 0x11111111 */ - 1, /* U+15E0 - U+15E7 : 0x11111111 */ - 1, /* U+15E8 - U+15EF : 0x11111111 */ - 1, /* U+15F0 - U+15F7 : 0x11111111 */ - 1, /* U+15F8 - U+15FF : 0x11111111 */ - 1, /* U+1600 - U+1607 : 0x11111111 */ - 1, /* U+1608 - U+160F : 0x11111111 */ - 1, /* U+1610 - U+1617 : 0x11111111 */ - 1, /* U+1618 - U+161F : 0x11111111 */ - 1, /* U+1620 - U+1627 : 0x11111111 */ - 1, /* U+1628 - U+162F : 0x11111111 */ - 1, /* U+1630 - U+1637 : 0x11111111 */ - 1, /* U+1638 - U+163F : 0x11111111 */ - 1, /* U+1640 - U+1647 : 0x11111111 */ - 1, /* U+1648 - U+164F : 0x11111111 */ - 1, /* U+1650 - U+1657 : 0x11111111 */ - 1, /* U+1658 - U+165F : 0x11111111 */ - 1, /* U+1660 - U+1667 : 0x11111111 */ - 1, /* U+1668 - U+166F : 0x11111111 */ - 1, /* U+1670 - U+1677 : 0x11111111 */ - 1, /* U+1678 - U+167F : 0x11111111 */ - 112, /* U+1680 - U+1687 : 0x1111111E */ - 1, /* U+1688 - U+168F : 0x11111111 */ - 1, /* U+1690 - U+1697 : 0x11111111 */ - 113, /* U+1698 - U+169F : 0x11199111 */ - 1, /* U+16A0 - U+16A7 : 0x11111111 */ - 1, /* U+16A8 - U+16AF : 0x11111111 */ - 1, /* U+16B0 - U+16B7 : 0x11111111 */ - 1, /* U+16B8 - U+16BF : 0x11111111 */ - 1, /* U+16C0 - U+16C7 : 0x11111111 */ - 1, /* U+16C8 - U+16CF : 0x11111111 */ - 1, /* U+16D0 - U+16D7 : 0x11111111 */ - 1, /* U+16D8 - U+16DF : 0x11111111 */ - 1, /* U+16E0 - U+16E7 : 0x11111111 */ - 1, /* U+16E8 - U+16EF : 0x11111111 */ - 1, /* U+16F0 - U+16F7 : 0x11111111 */ - 1, /* U+16F8 - U+16FF : 0x11111111 */ - 1, /* U+1700 - U+1707 : 0x11111111 */ - 1, /* U+1708 - U+170F : 0x11111111 */ - 114, /* U+1710 - U+1717 : 0x111AAA11 */ - 1, /* U+1718 - U+171F : 0x11111111 */ - 1, /* U+1720 - U+1727 : 0x11111111 */ - 1, /* U+1728 - U+172F : 0x11111111 */ - 114, /* U+1730 - U+1737 : 0x111AAA11 */ - 1, /* U+1738 - U+173F : 0x11111111 */ - 1, /* U+1740 - U+1747 : 0x11111111 */ - 1, /* U+1748 - U+174F : 0x11111111 */ - 71, /* U+1750 - U+1757 : 0x1111AA11 */ - 1, /* U+1758 - U+175F : 0x11111111 */ - 1, /* U+1760 - U+1767 : 0x11111111 */ - 1, /* U+1768 - U+176F : 0x11111111 */ - 71, /* U+1770 - U+1777 : 0x1111AA11 */ - 1, /* U+1778 - U+177F : 0x11111111 */ - 1, /* U+1780 - U+1787 : 0x11111111 */ - 1, /* U+1788 - U+178F : 0x11111111 */ - 1, /* U+1790 - U+1797 : 0x11111111 */ - 1, /* U+1798 - U+179F : 0x11111111 */ - 1, /* U+17A0 - U+17A7 : 0x11111111 */ - 1, /* U+17A8 - U+17AF : 0x11111111 */ - 115, /* U+17B0 - U+17B7 : 0xA1AA1111 */ - 101, /* U+17B8 - U+17BF : 0x11AAAAAA */ - 85, /* U+17C0 - U+17C7 : 0x1A111111 */ - 69, /* U+17C8 - U+17CF : 0xAAAAAAA1 */ - 116, /* U+17D0 - U+17D7 : 0x1111AAAA */ - 117, /* U+17D8 - U+17DF : 0x11A17111 */ - 1, /* U+17E0 - U+17E7 : 0x11111111 */ - 1, /* U+17E8 - U+17EF : 0x11111111 */ - 9, /* U+17F0 - U+17F7 : 0x99999999 */ - 111, /* U+17F8 - U+17FF : 0x11111199 */ - 9, /* U+1800 - U+1807 : 0x99999999 */ - 118, /* U+1808 - U+180F : 0x1EAAA999 */ - 1, /* U+1810 - U+1817 : 0x11111111 */ - 1, /* U+1818 - U+181F : 0x11111111 */ - 1, /* U+1820 - U+1827 : 0x11111111 */ - 1, /* U+1828 - U+182F : 0x11111111 */ - 1, /* U+1830 - U+1837 : 0x11111111 */ - 1, /* U+1838 - U+183F : 0x11111111 */ - 1, /* U+1840 - U+1847 : 0x11111111 */ - 1, /* U+1848 - U+184F : 0x11111111 */ - 1, /* U+1850 - U+1857 : 0x11111111 */ - 1, /* U+1858 - U+185F : 0x11111111 */ - 1, /* U+1860 - U+1867 : 0x11111111 */ - 1, /* U+1868 - U+186F : 0x11111111 */ - 1, /* U+1870 - U+1877 : 0x11111111 */ - 1, /* U+1878 - U+187F : 0x11111111 */ - 1, /* U+1880 - U+1887 : 0x11111111 */ - 1, /* U+1888 - U+188F : 0x11111111 */ - 1, /* U+1890 - U+1897 : 0x11111111 */ - 1, /* U+1898 - U+189F : 0x11111111 */ - 1, /* U+18A0 - U+18A7 : 0x11111111 */ - 72, /* U+18A8 - U+18AF : 0x111111A1 */ - 1, /* U+18B0 - U+18B7 : 0x11111111 */ - 1, /* U+18B8 - U+18BF : 0x11111111 */ - 1, /* U+18C0 - U+18C7 : 0x11111111 */ - 1, /* U+18C8 - U+18CF : 0x11111111 */ - 1, /* U+18D0 - U+18D7 : 0x11111111 */ - 1, /* U+18D8 - U+18DF : 0x11111111 */ - 1, /* U+18E0 - U+18E7 : 0x11111111 */ - 1, /* U+18E8 - U+18EF : 0x11111111 */ - 1, /* U+18F0 - U+18F7 : 0x11111111 */ - 1, /* U+18F8 - U+18FF : 0x11111111 */ - 1, /* U+1900 - U+1907 : 0x11111111 */ - 1, /* U+1908 - U+190F : 0x11111111 */ - 1, /* U+1910 - U+1917 : 0x11111111 */ - 1, /* U+1918 - U+191F : 0x11111111 */ - 119, /* U+1920 - U+1927 : 0xA1111AAA */ - 87, /* U+1928 - U+192F : 0x1111111A */ - 86, /* U+1930 - U+1937 : 0x11111A11 */ - 120, /* U+1938 - U+193F : 0x1111AAA1 */ - 121, /* U+1940 - U+1947 : 0x11991119 */ - 1, /* U+1948 - U+194F : 0x11111111 */ - 1, /* U+1950 - U+1957 : 0x11111111 */ - 1, /* U+1958 - U+195F : 0x11111111 */ - 1, /* U+1960 - U+1967 : 0x11111111 */ - 1, /* U+1968 - U+196F : 0x11111111 */ - 1, /* U+1970 - U+1977 : 0x11111111 */ - 1, /* U+1978 - U+197F : 0x11111111 */ - 1, /* U+1980 - U+1987 : 0x11111111 */ - 1, /* U+1988 - U+198F : 0x11111111 */ - 1, /* U+1990 - U+1997 : 0x11111111 */ - 1, /* U+1998 - U+199F : 0x11111111 */ - 1, /* U+19A0 - U+19A7 : 0x11111111 */ - 1, /* U+19A8 - U+19AF : 0x11111111 */ - 1, /* U+19B0 - U+19B7 : 0x11111111 */ - 1, /* U+19B8 - U+19BF : 0x11111111 */ - 1, /* U+19C0 - U+19C7 : 0x11111111 */ - 1, /* U+19C8 - U+19CF : 0x11111111 */ - 1, /* U+19D0 - U+19D7 : 0x11111111 */ - 122, /* U+19D8 - U+19DF : 0x99111111 */ - 9, /* U+19E0 - U+19E7 : 0x99999999 */ - 9, /* U+19E8 - U+19EF : 0x99999999 */ - 9, /* U+19F0 - U+19F7 : 0x99999999 */ - 9, /* U+19F8 - U+19FF : 0x99999999 */ - 1, /* U+1A00 - U+1A07 : 0x11111111 */ - 1, /* U+1A08 - U+1A0F : 0x11111111 */ - 98, /* U+1A10 - U+1A17 : 0xA1111111 */ - 87, /* U+1A18 - U+1A1F : 0x1111111A */ - 1, /* U+1A20 - U+1A27 : 0x11111111 */ - 1, /* U+1A28 - U+1A2F : 0x11111111 */ - 1, /* U+1A30 - U+1A37 : 0x11111111 */ - 1, /* U+1A38 - U+1A3F : 0x11111111 */ - 1, /* U+1A40 - U+1A47 : 0x11111111 */ - 1, /* U+1A48 - U+1A4F : 0x11111111 */ - 85, /* U+1A50 - U+1A57 : 0x1A111111 */ - 99, /* U+1A58 - U+1A5F : 0x1AAAAAAA */ - 123, /* U+1A60 - U+1A67 : 0xAAA11A1A */ - 106, /* U+1A68 - U+1A6F : 0x111AAAAA */ - 37, /* U+1A70 - U+1A77 : 0xAAAAA111 */ - 124, /* U+1A78 - U+1A7F : 0xA11AAAAA */ - 1, /* U+1A80 - U+1A87 : 0x11111111 */ - 1, /* U+1A88 - U+1A8F : 0x11111111 */ - 1, /* U+1A90 - U+1A97 : 0x11111111 */ - 1, /* U+1A98 - U+1A9F : 0x11111111 */ - 1, /* U+1AA0 - U+1AA7 : 0x11111111 */ - 1, /* U+1AA8 - U+1AAF : 0x11111111 */ - 1, /* U+1AB0 - U+1AB7 : 0x11111111 */ - 1, /* U+1AB8 - U+1ABF : 0x11111111 */ - 1, /* U+1AC0 - U+1AC7 : 0x11111111 */ - 1, /* U+1AC8 - U+1ACF : 0x11111111 */ - 1, /* U+1AD0 - U+1AD7 : 0x11111111 */ - 1, /* U+1AD8 - U+1ADF : 0x11111111 */ - 1, /* U+1AE0 - U+1AE7 : 0x11111111 */ - 1, /* U+1AE8 - U+1AEF : 0x11111111 */ - 1, /* U+1AF0 - U+1AF7 : 0x11111111 */ - 1, /* U+1AF8 - U+1AFF : 0x11111111 */ - 116, /* U+1B00 - U+1B07 : 0x1111AAAA */ - 1, /* U+1B08 - U+1B0F : 0x11111111 */ - 1, /* U+1B10 - U+1B17 : 0x11111111 */ - 1, /* U+1B18 - U+1B1F : 0x11111111 */ - 1, /* U+1B20 - U+1B27 : 0x11111111 */ - 1, /* U+1B28 - U+1B2F : 0x11111111 */ - 125, /* U+1B30 - U+1B37 : 0xAA1A1111 */ - 126, /* U+1B38 - U+1B3F : 0x111A1AAA */ - 86, /* U+1B40 - U+1B47 : 0x11111A11 */ - 1, /* U+1B48 - U+1B4F : 0x11111111 */ - 1, /* U+1B50 - U+1B57 : 0x11111111 */ - 1, /* U+1B58 - U+1B5F : 0x11111111 */ - 1, /* U+1B60 - U+1B67 : 0x11111111 */ - 37, /* U+1B68 - U+1B6F : 0xAAAAA111 */ - 116, /* U+1B70 - U+1B77 : 0x1111AAAA */ - 1, /* U+1B78 - U+1B7F : 0x11111111 */ - 38, /* U+1B80 - U+1B87 : 0x111111AA */ - 1, /* U+1B88 - U+1B8F : 0x11111111 */ - 1, /* U+1B90 - U+1B97 : 0x11111111 */ - 1, /* U+1B98 - U+1B9F : 0x11111111 */ - 127, /* U+1BA0 - U+1BA7 : 0x11AAAA11 */ - 128, /* U+1BA8 - U+1BAF : 0x1111A1AA */ - 1, /* U+1BB0 - U+1BB7 : 0x11111111 */ - 1, /* U+1BB8 - U+1BBF : 0x11111111 */ - 1, /* U+1BC0 - U+1BC7 : 0x11111111 */ - 1, /* U+1BC8 - U+1BCF : 0x11111111 */ - 1, /* U+1BD0 - U+1BD7 : 0x11111111 */ - 1, /* U+1BD8 - U+1BDF : 0x11111111 */ - 85, /* U+1BE0 - U+1BE7 : 0x1A111111 */ - 129, /* U+1BE8 - U+1BEF : 0xA1A111AA */ - 38, /* U+1BF0 - U+1BF7 : 0x111111AA */ - 1, /* U+1BF8 - U+1BFF : 0x11111111 */ - 1, /* U+1C00 - U+1C07 : 0x11111111 */ - 1, /* U+1C08 - U+1C0F : 0x11111111 */ - 1, /* U+1C10 - U+1C17 : 0x11111111 */ - 1, /* U+1C18 - U+1C1F : 0x11111111 */ - 1, /* U+1C20 - U+1C27 : 0x11111111 */ - 130, /* U+1C28 - U+1C2F : 0xAAAA1111 */ - 131, /* U+1C30 - U+1C37 : 0xAA11AAAA */ - 1, /* U+1C38 - U+1C3F : 0x11111111 */ - 1, /* U+1C40 - U+1C47 : 0x11111111 */ - 1, /* U+1C48 - U+1C4F : 0x11111111 */ - 1, /* U+1C50 - U+1C57 : 0x11111111 */ - 1, /* U+1C58 - U+1C5F : 0x11111111 */ - 1, /* U+1C60 - U+1C67 : 0x11111111 */ - 1, /* U+1C68 - U+1C6F : 0x11111111 */ - 1, /* U+1C70 - U+1C77 : 0x11111111 */ - 1, /* U+1C78 - U+1C7F : 0x11111111 */ - 1, /* U+1C80 - U+1C87 : 0x11111111 */ - 1, /* U+1C88 - U+1C8F : 0x11111111 */ - 1, /* U+1C90 - U+1C97 : 0x11111111 */ - 1, /* U+1C98 - U+1C9F : 0x11111111 */ - 1, /* U+1CA0 - U+1CA7 : 0x11111111 */ - 1, /* U+1CA8 - U+1CAF : 0x11111111 */ - 1, /* U+1CB0 - U+1CB7 : 0x11111111 */ - 1, /* U+1CB8 - U+1CBF : 0x11111111 */ - 1, /* U+1CC0 - U+1CC7 : 0x11111111 */ - 1, /* U+1CC8 - U+1CCF : 0x11111111 */ - 132, /* U+1CD0 - U+1CD7 : 0xAAAA1AAA */ - 10, /* U+1CD8 - U+1CDF : 0xAAAAAAAA */ - 107, /* U+1CE0 - U+1CE7 : 0xAAAAAA1A */ - 70, /* U+1CE8 - U+1CEF : 0x11A1111A */ - 73, /* U+1CF0 - U+1CF7 : 0x111A1111 */ - 1, /* U+1CF8 - U+1CFF : 0x11111111 */ - 1, /* U+1D00 - U+1D07 : 0x11111111 */ - 1, /* U+1D08 - U+1D0F : 0x11111111 */ - 1, /* U+1D10 - U+1D17 : 0x11111111 */ - 1, /* U+1D18 - U+1D1F : 0x11111111 */ - 1, /* U+1D20 - U+1D27 : 0x11111111 */ - 1, /* U+1D28 - U+1D2F : 0x11111111 */ - 1, /* U+1D30 - U+1D37 : 0x11111111 */ - 1, /* U+1D38 - U+1D3F : 0x11111111 */ - 1, /* U+1D40 - U+1D47 : 0x11111111 */ - 1, /* U+1D48 - U+1D4F : 0x11111111 */ - 1, /* U+1D50 - U+1D57 : 0x11111111 */ - 1, /* U+1D58 - U+1D5F : 0x11111111 */ - 1, /* U+1D60 - U+1D67 : 0x11111111 */ - 1, /* U+1D68 - U+1D6F : 0x11111111 */ - 1, /* U+1D70 - U+1D77 : 0x11111111 */ - 1, /* U+1D78 - U+1D7F : 0x11111111 */ - 1, /* U+1D80 - U+1D87 : 0x11111111 */ - 1, /* U+1D88 - U+1D8F : 0x11111111 */ - 1, /* U+1D90 - U+1D97 : 0x11111111 */ - 1, /* U+1D98 - U+1D9F : 0x11111111 */ - 1, /* U+1DA0 - U+1DA7 : 0x11111111 */ - 1, /* U+1DA8 - U+1DAF : 0x11111111 */ - 1, /* U+1DB0 - U+1DB7 : 0x11111111 */ - 1, /* U+1DB8 - U+1DBF : 0x11111111 */ - 10, /* U+1DC0 - U+1DC7 : 0xAAAAAAAA */ - 10, /* U+1DC8 - U+1DCF : 0xAAAAAAAA */ - 10, /* U+1DD0 - U+1DD7 : 0xAAAAAAAA */ - 10, /* U+1DD8 - U+1DDF : 0xAAAAAAAA */ - 99, /* U+1DE0 - U+1DE7 : 0x1AAAAAAA */ - 1, /* U+1DE8 - U+1DEF : 0x11111111 */ - 1, /* U+1DF0 - U+1DF7 : 0x11111111 */ - 130, /* U+1DF8 - U+1DFF : 0xAAAA1111 */ - 1, /* U+1E00 - U+1E07 : 0x11111111 */ - 1, /* U+1E08 - U+1E0F : 0x11111111 */ - 1, /* U+1E10 - U+1E17 : 0x11111111 */ - 1, /* U+1E18 - U+1E1F : 0x11111111 */ - 1, /* U+1E20 - U+1E27 : 0x11111111 */ - 1, /* U+1E28 - U+1E2F : 0x11111111 */ - 1, /* U+1E30 - U+1E37 : 0x11111111 */ - 1, /* U+1E38 - U+1E3F : 0x11111111 */ - 1, /* U+1E40 - U+1E47 : 0x11111111 */ - 1, /* U+1E48 - U+1E4F : 0x11111111 */ - 1, /* U+1E50 - U+1E57 : 0x11111111 */ - 1, /* U+1E58 - U+1E5F : 0x11111111 */ - 1, /* U+1E60 - U+1E67 : 0x11111111 */ - 1, /* U+1E68 - U+1E6F : 0x11111111 */ - 1, /* U+1E70 - U+1E77 : 0x11111111 */ - 1, /* U+1E78 - U+1E7F : 0x11111111 */ - 1, /* U+1E80 - U+1E87 : 0x11111111 */ - 1, /* U+1E88 - U+1E8F : 0x11111111 */ - 1, /* U+1E90 - U+1E97 : 0x11111111 */ - 1, /* U+1E98 - U+1E9F : 0x11111111 */ - 1, /* U+1EA0 - U+1EA7 : 0x11111111 */ - 1, /* U+1EA8 - U+1EAF : 0x11111111 */ - 1, /* U+1EB0 - U+1EB7 : 0x11111111 */ - 1, /* U+1EB8 - U+1EBF : 0x11111111 */ - 1, /* U+1EC0 - U+1EC7 : 0x11111111 */ - 1, /* U+1EC8 - U+1ECF : 0x11111111 */ - 1, /* U+1ED0 - U+1ED7 : 0x11111111 */ - 1, /* U+1ED8 - U+1EDF : 0x11111111 */ - 1, /* U+1EE0 - U+1EE7 : 0x11111111 */ - 1, /* U+1EE8 - U+1EEF : 0x11111111 */ - 1, /* U+1EF0 - U+1EF7 : 0x11111111 */ - 1, /* U+1EF8 - U+1EFF : 0x11111111 */ - 1, /* U+1F00 - U+1F07 : 0x11111111 */ - 1, /* U+1F08 - U+1F0F : 0x11111111 */ - 1, /* U+1F10 - U+1F17 : 0x11111111 */ - 1, /* U+1F18 - U+1F1F : 0x11111111 */ - 1, /* U+1F20 - U+1F27 : 0x11111111 */ - 1, /* U+1F28 - U+1F2F : 0x11111111 */ - 1, /* U+1F30 - U+1F37 : 0x11111111 */ - 1, /* U+1F38 - U+1F3F : 0x11111111 */ - 1, /* U+1F40 - U+1F47 : 0x11111111 */ - 1, /* U+1F48 - U+1F4F : 0x11111111 */ - 1, /* U+1F50 - U+1F57 : 0x11111111 */ - 1, /* U+1F58 - U+1F5F : 0x11111111 */ - 1, /* U+1F60 - U+1F67 : 0x11111111 */ - 1, /* U+1F68 - U+1F6F : 0x11111111 */ - 1, /* U+1F70 - U+1F77 : 0x11111111 */ - 1, /* U+1F78 - U+1F7F : 0x11111111 */ - 1, /* U+1F80 - U+1F87 : 0x11111111 */ - 1, /* U+1F88 - U+1F8F : 0x11111111 */ - 1, /* U+1F90 - U+1F97 : 0x11111111 */ - 1, /* U+1F98 - U+1F9F : 0x11111111 */ - 1, /* U+1FA0 - U+1FA7 : 0x11111111 */ - 1, /* U+1FA8 - U+1FAF : 0x11111111 */ - 1, /* U+1FB0 - U+1FB7 : 0x11111111 */ - 133, /* U+1FB8 - U+1FBF : 0x91911111 */ - 111, /* U+1FC0 - U+1FC7 : 0x11111199 */ - 32, /* U+1FC8 - U+1FCF : 0x99911111 */ - 1, /* U+1FD0 - U+1FD7 : 0x11111111 */ - 32, /* U+1FD8 - U+1FDF : 0x99911111 */ - 1, /* U+1FE0 - U+1FE7 : 0x11111111 */ - 32, /* U+1FE8 - U+1FEF : 0x99911111 */ - 1, /* U+1FF0 - U+1FF7 : 0x11111111 */ - 134, /* U+1FF8 - U+1FFF : 0x19911111 */ - 14, /* U+2000 - U+2007 : 0xEEEEEEEE */ - 135, /* U+2008 - U+200F : 0x21BBBEEE */ - 9, /* U+2010 - U+2017 : 0x99999999 */ - 9, /* U+2018 - U+201F : 0x99999999 */ - 9, /* U+2020 - U+2027 : 0x99999999 */ - 136, /* U+2028 - U+202F : 0x8FFFFFCE */ - 137, /* U+2030 - U+2037 : 0x99977777 */ - 9, /* U+2038 - U+203F : 0x99999999 */ - 138, /* U+2040 - U+2047 : 0x99989999 */ - 9, /* U+2048 - U+204F : 0x99999999 */ - 9, /* U+2050 - U+2057 : 0x99999999 */ - 139, /* U+2058 - U+205F : 0xE9999999 */ - 140, /* U+2060 - U+2067 : 0x111BBBBB */ - 141, /* U+2068 - U+206F : 0xBBBBBB11 */ - 142, /* U+2070 - U+2077 : 0x55551115 */ - 143, /* U+2078 - U+207F : 0x19996655 */ - 5, /* U+2080 - U+2087 : 0x55555555 */ - 143, /* U+2088 - U+208F : 0x19996655 */ - 1, /* U+2090 - U+2097 : 0x11111111 */ - 1, /* U+2098 - U+209F : 0x11111111 */ - 7, /* U+20A0 - U+20A7 : 0x77777777 */ - 7, /* U+20A8 - U+20AF : 0x77777777 */ - 7, /* U+20B0 - U+20B7 : 0x77777777 */ - 144, /* U+20B8 - U+20BF : 0x11111177 */ - 1, /* U+20C0 - U+20C7 : 0x11111111 */ - 1, /* U+20C8 - U+20CF : 0x11111111 */ - 10, /* U+20D0 - U+20D7 : 0xAAAAAAAA */ - 10, /* U+20D8 - U+20DF : 0xAAAAAAAA */ - 10, /* U+20E0 - U+20E7 : 0xAAAAAAAA */ - 10, /* U+20E8 - U+20EF : 0xAAAAAAAA */ - 87, /* U+20F0 - U+20F7 : 0x1111111A */ - 1, /* U+20F8 - U+20FF : 0x11111111 */ - 145, /* U+2100 - U+2107 : 0x19999199 */ - 111, /* U+2108 - U+210F : 0x11111199 */ - 146, /* U+2110 - U+2117 : 0x99191111 */ - 147, /* U+2118 - U+211F : 0x99111119 */ - 148, /* U+2120 - U+2127 : 0x91919999 */ - 149, /* U+2128 - U+212F : 0x17111191 */ - 1, /* U+2130 - U+2137 : 0x11111111 */ - 150, /* U+2138 - U+213F : 0x11119911 */ - 151, /* U+2140 - U+2147 : 0x11199999 */ - 152, /* U+2148 - U+214F : 0x11999911 */ - 9, /* U+2150 - U+2157 : 0x99999999 */ - 9, /* U+2158 - U+215F : 0x99999999 */ - 1, /* U+2160 - U+2167 : 0x11111111 */ - 1, /* U+2168 - U+216F : 0x11111111 */ - 1, /* U+2170 - U+2177 : 0x11111111 */ - 1, /* U+2178 - U+217F : 0x11111111 */ - 1, /* U+2180 - U+2187 : 0x11111111 */ - 153, /* U+2188 - U+218F : 0x11111191 */ - 9, /* U+2190 - U+2197 : 0x99999999 */ - 9, /* U+2198 - U+219F : 0x99999999 */ - 9, /* U+21A0 - U+21A7 : 0x99999999 */ - 9, /* U+21A8 - U+21AF : 0x99999999 */ - 9, /* U+21B0 - U+21B7 : 0x99999999 */ - 9, /* U+21B8 - U+21BF : 0x99999999 */ - 9, /* U+21C0 - U+21C7 : 0x99999999 */ - 9, /* U+21C8 - U+21CF : 0x99999999 */ - 9, /* U+21D0 - U+21D7 : 0x99999999 */ - 9, /* U+21D8 - U+21DF : 0x99999999 */ - 9, /* U+21E0 - U+21E7 : 0x99999999 */ - 9, /* U+21E8 - U+21EF : 0x99999999 */ - 9, /* U+21F0 - U+21F7 : 0x99999999 */ - 9, /* U+21F8 - U+21FF : 0x99999999 */ - 9, /* U+2200 - U+2207 : 0x99999999 */ - 9, /* U+2208 - U+220F : 0x99999999 */ - 154, /* U+2210 - U+2217 : 0x99997699 */ - 9, /* U+2218 - U+221F : 0x99999999 */ - 9, /* U+2220 - U+2227 : 0x99999999 */ - 9, /* U+2228 - U+222F : 0x99999999 */ - 9, /* U+2230 - U+2237 : 0x99999999 */ - 9, /* U+2238 - U+223F : 0x99999999 */ - 9, /* U+2240 - U+2247 : 0x99999999 */ - 9, /* U+2248 - U+224F : 0x99999999 */ - 9, /* U+2250 - U+2257 : 0x99999999 */ - 9, /* U+2258 - U+225F : 0x99999999 */ - 9, /* U+2260 - U+2267 : 0x99999999 */ - 9, /* U+2268 - U+226F : 0x99999999 */ - 9, /* U+2270 - U+2277 : 0x99999999 */ - 9, /* U+2278 - U+227F : 0x99999999 */ - 9, /* U+2280 - U+2287 : 0x99999999 */ - 9, /* U+2288 - U+228F : 0x99999999 */ - 9, /* U+2290 - U+2297 : 0x99999999 */ - 9, /* U+2298 - U+229F : 0x99999999 */ - 9, /* U+22A0 - U+22A7 : 0x99999999 */ - 9, /* U+22A8 - U+22AF : 0x99999999 */ - 9, /* U+22B0 - U+22B7 : 0x99999999 */ - 9, /* U+22B8 - U+22BF : 0x99999999 */ - 9, /* U+22C0 - U+22C7 : 0x99999999 */ - 9, /* U+22C8 - U+22CF : 0x99999999 */ - 9, /* U+22D0 - U+22D7 : 0x99999999 */ - 9, /* U+22D8 - U+22DF : 0x99999999 */ - 9, /* U+22E0 - U+22E7 : 0x99999999 */ - 9, /* U+22E8 - U+22EF : 0x99999999 */ - 9, /* U+22F0 - U+22F7 : 0x99999999 */ - 9, /* U+22F8 - U+22FF : 0x99999999 */ - 9, /* U+2300 - U+2307 : 0x99999999 */ - 9, /* U+2308 - U+230F : 0x99999999 */ - 9, /* U+2310 - U+2317 : 0x99999999 */ - 9, /* U+2318 - U+231F : 0x99999999 */ - 9, /* U+2320 - U+2327 : 0x99999999 */ - 9, /* U+2328 - U+232F : 0x99999999 */ - 155, /* U+2330 - U+2337 : 0x11999999 */ - 1, /* U+2338 - U+233F : 0x11111111 */ - 1, /* U+2340 - U+2347 : 0x11111111 */ - 1, /* U+2348 - U+234F : 0x11111111 */ - 1, /* U+2350 - U+2357 : 0x11111111 */ - 1, /* U+2358 - U+235F : 0x11111111 */ - 1, /* U+2360 - U+2367 : 0x11111111 */ - 1, /* U+2368 - U+236F : 0x11111111 */ - 1, /* U+2370 - U+2377 : 0x11111111 */ - 22, /* U+2378 - U+237F : 0x99999111 */ - 9, /* U+2380 - U+2387 : 0x99999999 */ - 9, /* U+2388 - U+238F : 0x99999999 */ - 156, /* U+2390 - U+2397 : 0x99199999 */ - 9, /* U+2398 - U+239F : 0x99999999 */ - 9, /* U+23A0 - U+23A7 : 0x99999999 */ - 9, /* U+23A8 - U+23AF : 0x99999999 */ - 9, /* U+23B0 - U+23B7 : 0x99999999 */ - 9, /* U+23B8 - U+23BF : 0x99999999 */ - 9, /* U+23C0 - U+23C7 : 0x99999999 */ - 9, /* U+23C8 - U+23CF : 0x99999999 */ - 9, /* U+23D0 - U+23D7 : 0x99999999 */ - 9, /* U+23D8 - U+23DF : 0x99999999 */ - 9, /* U+23E0 - U+23E7 : 0x99999999 */ - 9, /* U+23E8 - U+23EF : 0x99999999 */ - 157, /* U+23F0 - U+23F7 : 0x11119999 */ - 1, /* U+23F8 - U+23FF : 0x11111111 */ - 9, /* U+2400 - U+2407 : 0x99999999 */ - 9, /* U+2408 - U+240F : 0x99999999 */ - 9, /* U+2410 - U+2417 : 0x99999999 */ - 9, /* U+2418 - U+241F : 0x99999999 */ - 93, /* U+2420 - U+2427 : 0x19999999 */ - 1, /* U+2428 - U+242F : 0x11111111 */ - 1, /* U+2430 - U+2437 : 0x11111111 */ - 1, /* U+2438 - U+243F : 0x11111111 */ - 9, /* U+2440 - U+2447 : 0x99999999 */ - 158, /* U+2448 - U+244F : 0x11111999 */ - 1, /* U+2450 - U+2457 : 0x11111111 */ - 1, /* U+2458 - U+245F : 0x11111111 */ - 9, /* U+2460 - U+2467 : 0x99999999 */ - 9, /* U+2468 - U+246F : 0x99999999 */ - 9, /* U+2470 - U+2477 : 0x99999999 */ - 9, /* U+2478 - U+247F : 0x99999999 */ - 9, /* U+2480 - U+2487 : 0x99999999 */ - 5, /* U+2488 - U+248F : 0x55555555 */ - 5, /* U+2490 - U+2497 : 0x55555555 */ - 159, /* U+2498 - U+249F : 0x11115555 */ - 1, /* U+24A0 - U+24A7 : 0x11111111 */ - 1, /* U+24A8 - U+24AF : 0x11111111 */ - 1, /* U+24B0 - U+24B7 : 0x11111111 */ - 1, /* U+24B8 - U+24BF : 0x11111111 */ - 1, /* U+24C0 - U+24C7 : 0x11111111 */ - 1, /* U+24C8 - U+24CF : 0x11111111 */ - 1, /* U+24D0 - U+24D7 : 0x11111111 */ - 1, /* U+24D8 - U+24DF : 0x11111111 */ - 1, /* U+24E0 - U+24E7 : 0x11111111 */ - 31, /* U+24E8 - U+24EF : 0x99999911 */ - 9, /* U+24F0 - U+24F7 : 0x99999999 */ - 9, /* U+24F8 - U+24FF : 0x99999999 */ - 9, /* U+2500 - U+2507 : 0x99999999 */ - 9, /* U+2508 - U+250F : 0x99999999 */ - 9, /* U+2510 - U+2517 : 0x99999999 */ - 9, /* U+2518 - U+251F : 0x99999999 */ - 9, /* U+2520 - U+2527 : 0x99999999 */ - 9, /* U+2528 - U+252F : 0x99999999 */ - 9, /* U+2530 - U+2537 : 0x99999999 */ - 9, /* U+2538 - U+253F : 0x99999999 */ - 9, /* U+2540 - U+2547 : 0x99999999 */ - 9, /* U+2548 - U+254F : 0x99999999 */ - 9, /* U+2550 - U+2557 : 0x99999999 */ - 9, /* U+2558 - U+255F : 0x99999999 */ - 9, /* U+2560 - U+2567 : 0x99999999 */ - 9, /* U+2568 - U+256F : 0x99999999 */ - 9, /* U+2570 - U+2577 : 0x99999999 */ - 9, /* U+2578 - U+257F : 0x99999999 */ - 9, /* U+2580 - U+2587 : 0x99999999 */ - 9, /* U+2588 - U+258F : 0x99999999 */ - 9, /* U+2590 - U+2597 : 0x99999999 */ - 9, /* U+2598 - U+259F : 0x99999999 */ - 9, /* U+25A0 - U+25A7 : 0x99999999 */ - 9, /* U+25A8 - U+25AF : 0x99999999 */ - 9, /* U+25B0 - U+25B7 : 0x99999999 */ - 9, /* U+25B8 - U+25BF : 0x99999999 */ - 9, /* U+25C0 - U+25C7 : 0x99999999 */ - 9, /* U+25C8 - U+25CF : 0x99999999 */ - 9, /* U+25D0 - U+25D7 : 0x99999999 */ - 9, /* U+25D8 - U+25DF : 0x99999999 */ - 9, /* U+25E0 - U+25E7 : 0x99999999 */ - 9, /* U+25E8 - U+25EF : 0x99999999 */ - 9, /* U+25F0 - U+25F7 : 0x99999999 */ - 9, /* U+25F8 - U+25FF : 0x99999999 */ - 9, /* U+2600 - U+2607 : 0x99999999 */ - 9, /* U+2608 - U+260F : 0x99999999 */ - 9, /* U+2610 - U+2617 : 0x99999999 */ - 9, /* U+2618 - U+261F : 0x99999999 */ - 9, /* U+2620 - U+2627 : 0x99999999 */ - 9, /* U+2628 - U+262F : 0x99999999 */ - 9, /* U+2630 - U+2637 : 0x99999999 */ - 9, /* U+2638 - U+263F : 0x99999999 */ - 9, /* U+2640 - U+2647 : 0x99999999 */ - 9, /* U+2648 - U+264F : 0x99999999 */ - 9, /* U+2650 - U+2657 : 0x99999999 */ - 9, /* U+2658 - U+265F : 0x99999999 */ - 9, /* U+2660 - U+2667 : 0x99999999 */ - 9, /* U+2668 - U+266F : 0x99999999 */ - 9, /* U+2670 - U+2677 : 0x99999999 */ - 9, /* U+2678 - U+267F : 0x99999999 */ - 9, /* U+2680 - U+2687 : 0x99999999 */ - 9, /* U+2688 - U+268F : 0x99999999 */ - 9, /* U+2690 - U+2697 : 0x99999999 */ - 9, /* U+2698 - U+269F : 0x99999999 */ - 9, /* U+26A0 - U+26A7 : 0x99999999 */ - 160, /* U+26A8 - U+26AF : 0x99919999 */ - 9, /* U+26B0 - U+26B7 : 0x99999999 */ - 9, /* U+26B8 - U+26BF : 0x99999999 */ - 9, /* U+26C0 - U+26C7 : 0x99999999 */ - 9, /* U+26C8 - U+26CF : 0x99999999 */ - 9, /* U+26D0 - U+26D7 : 0x99999999 */ - 9, /* U+26D8 - U+26DF : 0x99999999 */ - 9, /* U+26E0 - U+26E7 : 0x99999999 */ - 9, /* U+26E8 - U+26EF : 0x99999999 */ - 9, /* U+26F0 - U+26F7 : 0x99999999 */ - 9, /* U+26F8 - U+26FF : 0x99999999 */ - 161, /* U+2700 - U+2707 : 0x99999991 */ - 9, /* U+2708 - U+270F : 0x99999999 */ - 9, /* U+2710 - U+2717 : 0x99999999 */ - 9, /* U+2718 - U+271F : 0x99999999 */ - 9, /* U+2720 - U+2727 : 0x99999999 */ - 9, /* U+2728 - U+272F : 0x99999999 */ - 9, /* U+2730 - U+2737 : 0x99999999 */ - 9, /* U+2738 - U+273F : 0x99999999 */ - 9, /* U+2740 - U+2747 : 0x99999999 */ - 9, /* U+2748 - U+274F : 0x99999999 */ - 9, /* U+2750 - U+2757 : 0x99999999 */ - 9, /* U+2758 - U+275F : 0x99999999 */ - 9, /* U+2760 - U+2767 : 0x99999999 */ - 9, /* U+2768 - U+276F : 0x99999999 */ - 9, /* U+2770 - U+2777 : 0x99999999 */ - 9, /* U+2778 - U+277F : 0x99999999 */ - 9, /* U+2780 - U+2787 : 0x99999999 */ - 9, /* U+2788 - U+278F : 0x99999999 */ - 9, /* U+2790 - U+2797 : 0x99999999 */ - 9, /* U+2798 - U+279F : 0x99999999 */ - 9, /* U+27A0 - U+27A7 : 0x99999999 */ - 9, /* U+27A8 - U+27AF : 0x99999999 */ - 9, /* U+27B0 - U+27B7 : 0x99999999 */ - 9, /* U+27B8 - U+27BF : 0x99999999 */ - 9, /* U+27C0 - U+27C7 : 0x99999999 */ - 9, /* U+27C8 - U+27CF : 0x99999999 */ - 9, /* U+27D0 - U+27D7 : 0x99999999 */ - 9, /* U+27D8 - U+27DF : 0x99999999 */ - 9, /* U+27E0 - U+27E7 : 0x99999999 */ - 9, /* U+27E8 - U+27EF : 0x99999999 */ - 9, /* U+27F0 - U+27F7 : 0x99999999 */ - 9, /* U+27F8 - U+27FF : 0x99999999 */ - 1, /* U+2800 - U+2807 : 0x11111111 */ - 1, /* U+2808 - U+280F : 0x11111111 */ - 1, /* U+2810 - U+2817 : 0x11111111 */ - 1, /* U+2818 - U+281F : 0x11111111 */ - 1, /* U+2820 - U+2827 : 0x11111111 */ - 1, /* U+2828 - U+282F : 0x11111111 */ - 1, /* U+2830 - U+2837 : 0x11111111 */ - 1, /* U+2838 - U+283F : 0x11111111 */ - 1, /* U+2840 - U+2847 : 0x11111111 */ - 1, /* U+2848 - U+284F : 0x11111111 */ - 1, /* U+2850 - U+2857 : 0x11111111 */ - 1, /* U+2858 - U+285F : 0x11111111 */ - 1, /* U+2860 - U+2867 : 0x11111111 */ - 1, /* U+2868 - U+286F : 0x11111111 */ - 1, /* U+2870 - U+2877 : 0x11111111 */ - 1, /* U+2878 - U+287F : 0x11111111 */ - 1, /* U+2880 - U+2887 : 0x11111111 */ - 1, /* U+2888 - U+288F : 0x11111111 */ - 1, /* U+2890 - U+2897 : 0x11111111 */ - 1, /* U+2898 - U+289F : 0x11111111 */ - 1, /* U+28A0 - U+28A7 : 0x11111111 */ - 1, /* U+28A8 - U+28AF : 0x11111111 */ - 1, /* U+28B0 - U+28B7 : 0x11111111 */ - 1, /* U+28B8 - U+28BF : 0x11111111 */ - 1, /* U+28C0 - U+28C7 : 0x11111111 */ - 1, /* U+28C8 - U+28CF : 0x11111111 */ - 1, /* U+28D0 - U+28D7 : 0x11111111 */ - 1, /* U+28D8 - U+28DF : 0x11111111 */ - 1, /* U+28E0 - U+28E7 : 0x11111111 */ - 1, /* U+28E8 - U+28EF : 0x11111111 */ - 1, /* U+28F0 - U+28F7 : 0x11111111 */ - 1, /* U+28F8 - U+28FF : 0x11111111 */ - 9, /* U+2900 - U+2907 : 0x99999999 */ - 9, /* U+2908 - U+290F : 0x99999999 */ - 9, /* U+2910 - U+2917 : 0x99999999 */ - 9, /* U+2918 - U+291F : 0x99999999 */ - 9, /* U+2920 - U+2927 : 0x99999999 */ - 9, /* U+2928 - U+292F : 0x99999999 */ - 9, /* U+2930 - U+2937 : 0x99999999 */ - 9, /* U+2938 - U+293F : 0x99999999 */ - 9, /* U+2940 - U+2947 : 0x99999999 */ - 9, /* U+2948 - U+294F : 0x99999999 */ - 9, /* U+2950 - U+2957 : 0x99999999 */ - 9, /* U+2958 - U+295F : 0x99999999 */ - 9, /* U+2960 - U+2967 : 0x99999999 */ - 9, /* U+2968 - U+296F : 0x99999999 */ - 9, /* U+2970 - U+2977 : 0x99999999 */ - 9, /* U+2978 - U+297F : 0x99999999 */ - 9, /* U+2980 - U+2987 : 0x99999999 */ - 9, /* U+2988 - U+298F : 0x99999999 */ - 9, /* U+2990 - U+2997 : 0x99999999 */ - 9, /* U+2998 - U+299F : 0x99999999 */ - 9, /* U+29A0 - U+29A7 : 0x99999999 */ - 9, /* U+29A8 - U+29AF : 0x99999999 */ - 9, /* U+29B0 - U+29B7 : 0x99999999 */ - 9, /* U+29B8 - U+29BF : 0x99999999 */ - 9, /* U+29C0 - U+29C7 : 0x99999999 */ - 9, /* U+29C8 - U+29CF : 0x99999999 */ - 9, /* U+29D0 - U+29D7 : 0x99999999 */ - 9, /* U+29D8 - U+29DF : 0x99999999 */ - 9, /* U+29E0 - U+29E7 : 0x99999999 */ - 9, /* U+29E8 - U+29EF : 0x99999999 */ - 9, /* U+29F0 - U+29F7 : 0x99999999 */ - 9, /* U+29F8 - U+29FF : 0x99999999 */ - 9, /* U+2A00 - U+2A07 : 0x99999999 */ - 9, /* U+2A08 - U+2A0F : 0x99999999 */ - 9, /* U+2A10 - U+2A17 : 0x99999999 */ - 9, /* U+2A18 - U+2A1F : 0x99999999 */ - 9, /* U+2A20 - U+2A27 : 0x99999999 */ - 9, /* U+2A28 - U+2A2F : 0x99999999 */ - 9, /* U+2A30 - U+2A37 : 0x99999999 */ - 9, /* U+2A38 - U+2A3F : 0x99999999 */ - 9, /* U+2A40 - U+2A47 : 0x99999999 */ - 9, /* U+2A48 - U+2A4F : 0x99999999 */ - 9, /* U+2A50 - U+2A57 : 0x99999999 */ - 9, /* U+2A58 - U+2A5F : 0x99999999 */ - 9, /* U+2A60 - U+2A67 : 0x99999999 */ - 9, /* U+2A68 - U+2A6F : 0x99999999 */ - 9, /* U+2A70 - U+2A77 : 0x99999999 */ - 9, /* U+2A78 - U+2A7F : 0x99999999 */ - 9, /* U+2A80 - U+2A87 : 0x99999999 */ - 9, /* U+2A88 - U+2A8F : 0x99999999 */ - 9, /* U+2A90 - U+2A97 : 0x99999999 */ - 9, /* U+2A98 - U+2A9F : 0x99999999 */ - 9, /* U+2AA0 - U+2AA7 : 0x99999999 */ - 9, /* U+2AA8 - U+2AAF : 0x99999999 */ - 9, /* U+2AB0 - U+2AB7 : 0x99999999 */ - 9, /* U+2AB8 - U+2ABF : 0x99999999 */ - 9, /* U+2AC0 - U+2AC7 : 0x99999999 */ - 9, /* U+2AC8 - U+2ACF : 0x99999999 */ - 9, /* U+2AD0 - U+2AD7 : 0x99999999 */ - 9, /* U+2AD8 - U+2ADF : 0x99999999 */ - 9, /* U+2AE0 - U+2AE7 : 0x99999999 */ - 9, /* U+2AE8 - U+2AEF : 0x99999999 */ - 9, /* U+2AF0 - U+2AF7 : 0x99999999 */ - 9, /* U+2AF8 - U+2AFF : 0x99999999 */ - 9, /* U+2B00 - U+2B07 : 0x99999999 */ - 9, /* U+2B08 - U+2B0F : 0x99999999 */ - 9, /* U+2B10 - U+2B17 : 0x99999999 */ - 9, /* U+2B18 - U+2B1F : 0x99999999 */ - 9, /* U+2B20 - U+2B27 : 0x99999999 */ - 9, /* U+2B28 - U+2B2F : 0x99999999 */ - 9, /* U+2B30 - U+2B37 : 0x99999999 */ - 9, /* U+2B38 - U+2B3F : 0x99999999 */ - 9, /* U+2B40 - U+2B47 : 0x99999999 */ - 151, /* U+2B48 - U+2B4F : 0x11199999 */ - 9, /* U+2B50 - U+2B57 : 0x99999999 */ - 111, /* U+2B58 - U+2B5F : 0x11111199 */ - 1, /* U+2B60 - U+2B67 : 0x11111111 */ - 1, /* U+2B68 - U+2B6F : 0x11111111 */ - 1, /* U+2B70 - U+2B77 : 0x11111111 */ - 1, /* U+2B78 - U+2B7F : 0x11111111 */ - 1, /* U+2B80 - U+2B87 : 0x11111111 */ - 1, /* U+2B88 - U+2B8F : 0x11111111 */ - 1, /* U+2B90 - U+2B97 : 0x11111111 */ - 1, /* U+2B98 - U+2B9F : 0x11111111 */ - 1, /* U+2BA0 - U+2BA7 : 0x11111111 */ - 1, /* U+2BA8 - U+2BAF : 0x11111111 */ - 1, /* U+2BB0 - U+2BB7 : 0x11111111 */ - 1, /* U+2BB8 - U+2BBF : 0x11111111 */ - 1, /* U+2BC0 - U+2BC7 : 0x11111111 */ - 1, /* U+2BC8 - U+2BCF : 0x11111111 */ - 1, /* U+2BD0 - U+2BD7 : 0x11111111 */ - 1, /* U+2BD8 - U+2BDF : 0x11111111 */ - 1, /* U+2BE0 - U+2BE7 : 0x11111111 */ - 1, /* U+2BE8 - U+2BEF : 0x11111111 */ - 1, /* U+2BF0 - U+2BF7 : 0x11111111 */ - 1, /* U+2BF8 - U+2BFF : 0x11111111 */ - 1, /* U+2C00 - U+2C07 : 0x11111111 */ - 1, /* U+2C08 - U+2C0F : 0x11111111 */ - 1, /* U+2C10 - U+2C17 : 0x11111111 */ - 1, /* U+2C18 - U+2C1F : 0x11111111 */ - 1, /* U+2C20 - U+2C27 : 0x11111111 */ - 1, /* U+2C28 - U+2C2F : 0x11111111 */ - 1, /* U+2C30 - U+2C37 : 0x11111111 */ - 1, /* U+2C38 - U+2C3F : 0x11111111 */ - 1, /* U+2C40 - U+2C47 : 0x11111111 */ - 1, /* U+2C48 - U+2C4F : 0x11111111 */ - 1, /* U+2C50 - U+2C57 : 0x11111111 */ - 1, /* U+2C58 - U+2C5F : 0x11111111 */ - 1, /* U+2C60 - U+2C67 : 0x11111111 */ - 1, /* U+2C68 - U+2C6F : 0x11111111 */ - 1, /* U+2C70 - U+2C77 : 0x11111111 */ - 1, /* U+2C78 - U+2C7F : 0x11111111 */ - 1, /* U+2C80 - U+2C87 : 0x11111111 */ - 1, /* U+2C88 - U+2C8F : 0x11111111 */ - 1, /* U+2C90 - U+2C97 : 0x11111111 */ - 1, /* U+2C98 - U+2C9F : 0x11111111 */ - 1, /* U+2CA0 - U+2CA7 : 0x11111111 */ - 1, /* U+2CA8 - U+2CAF : 0x11111111 */ - 1, /* U+2CB0 - U+2CB7 : 0x11111111 */ - 1, /* U+2CB8 - U+2CBF : 0x11111111 */ - 1, /* U+2CC0 - U+2CC7 : 0x11111111 */ - 1, /* U+2CC8 - U+2CCF : 0x11111111 */ - 1, /* U+2CD0 - U+2CD7 : 0x11111111 */ - 1, /* U+2CD8 - U+2CDF : 0x11111111 */ - 32, /* U+2CE0 - U+2CE7 : 0x99911111 */ - 162, /* U+2CE8 - U+2CEF : 0xA1111999 */ - 38, /* U+2CF0 - U+2CF7 : 0x111111AA */ - 161, /* U+2CF8 - U+2CFF : 0x99999991 */ - 1, /* U+2D00 - U+2D07 : 0x11111111 */ - 1, /* U+2D08 - U+2D0F : 0x11111111 */ - 1, /* U+2D10 - U+2D17 : 0x11111111 */ - 1, /* U+2D18 - U+2D1F : 0x11111111 */ - 1, /* U+2D20 - U+2D27 : 0x11111111 */ - 1, /* U+2D28 - U+2D2F : 0x11111111 */ - 1, /* U+2D30 - U+2D37 : 0x11111111 */ - 1, /* U+2D38 - U+2D3F : 0x11111111 */ - 1, /* U+2D40 - U+2D47 : 0x11111111 */ - 1, /* U+2D48 - U+2D4F : 0x11111111 */ - 1, /* U+2D50 - U+2D57 : 0x11111111 */ - 1, /* U+2D58 - U+2D5F : 0x11111111 */ - 1, /* U+2D60 - U+2D67 : 0x11111111 */ - 1, /* U+2D68 - U+2D6F : 0x11111111 */ - 1, /* U+2D70 - U+2D77 : 0x11111111 */ - 98, /* U+2D78 - U+2D7F : 0xA1111111 */ - 1, /* U+2D80 - U+2D87 : 0x11111111 */ - 1, /* U+2D88 - U+2D8F : 0x11111111 */ - 1, /* U+2D90 - U+2D97 : 0x11111111 */ - 1, /* U+2D98 - U+2D9F : 0x11111111 */ - 1, /* U+2DA0 - U+2DA7 : 0x11111111 */ - 1, /* U+2DA8 - U+2DAF : 0x11111111 */ - 1, /* U+2DB0 - U+2DB7 : 0x11111111 */ - 1, /* U+2DB8 - U+2DBF : 0x11111111 */ - 1, /* U+2DC0 - U+2DC7 : 0x11111111 */ - 1, /* U+2DC8 - U+2DCF : 0x11111111 */ - 1, /* U+2DD0 - U+2DD7 : 0x11111111 */ - 1, /* U+2DD8 - U+2DDF : 0x11111111 */ - 10, /* U+2DE0 - U+2DE7 : 0xAAAAAAAA */ - 10, /* U+2DE8 - U+2DEF : 0xAAAAAAAA */ - 10, /* U+2DF0 - U+2DF7 : 0xAAAAAAAA */ - 10, /* U+2DF8 - U+2DFF : 0xAAAAAAAA */ - 9, /* U+2E00 - U+2E07 : 0x99999999 */ - 9, /* U+2E08 - U+2E0F : 0x99999999 */ - 9, /* U+2E10 - U+2E17 : 0x99999999 */ - 9, /* U+2E18 - U+2E1F : 0x99999999 */ - 9, /* U+2E20 - U+2E27 : 0x99999999 */ - 9, /* U+2E28 - U+2E2F : 0x99999999 */ - 9, /* U+2E30 - U+2E37 : 0x99999999 */ - 157, /* U+2E38 - U+2E3F : 0x11119999 */ - 1, /* U+2E40 - U+2E47 : 0x11111111 */ - 1, /* U+2E48 - U+2E4F : 0x11111111 */ - 1, /* U+2E50 - U+2E57 : 0x11111111 */ - 1, /* U+2E58 - U+2E5F : 0x11111111 */ - 1, /* U+2E60 - U+2E67 : 0x11111111 */ - 1, /* U+2E68 - U+2E6F : 0x11111111 */ - 1, /* U+2E70 - U+2E77 : 0x11111111 */ - 1, /* U+2E78 - U+2E7F : 0x11111111 */ - 9, /* U+2E80 - U+2E87 : 0x99999999 */ - 9, /* U+2E88 - U+2E8F : 0x99999999 */ - 9, /* U+2E90 - U+2E97 : 0x99999999 */ - 163, /* U+2E98 - U+2E9F : 0x99999199 */ - 9, /* U+2EA0 - U+2EA7 : 0x99999999 */ - 9, /* U+2EA8 - U+2EAF : 0x99999999 */ - 9, /* U+2EB0 - U+2EB7 : 0x99999999 */ - 9, /* U+2EB8 - U+2EBF : 0x99999999 */ - 9, /* U+2EC0 - U+2EC7 : 0x99999999 */ - 9, /* U+2EC8 - U+2ECF : 0x99999999 */ - 9, /* U+2ED0 - U+2ED7 : 0x99999999 */ - 9, /* U+2ED8 - U+2EDF : 0x99999999 */ - 9, /* U+2EE0 - U+2EE7 : 0x99999999 */ - 9, /* U+2EE8 - U+2EEF : 0x99999999 */ - 157, /* U+2EF0 - U+2EF7 : 0x11119999 */ - 1, /* U+2EF8 - U+2EFF : 0x11111111 */ - 9, /* U+2F00 - U+2F07 : 0x99999999 */ - 9, /* U+2F08 - U+2F0F : 0x99999999 */ - 9, /* U+2F10 - U+2F17 : 0x99999999 */ - 9, /* U+2F18 - U+2F1F : 0x99999999 */ - 9, /* U+2F20 - U+2F27 : 0x99999999 */ - 9, /* U+2F28 - U+2F2F : 0x99999999 */ - 9, /* U+2F30 - U+2F37 : 0x99999999 */ - 9, /* U+2F38 - U+2F3F : 0x99999999 */ - 9, /* U+2F40 - U+2F47 : 0x99999999 */ - 9, /* U+2F48 - U+2F4F : 0x99999999 */ - 9, /* U+2F50 - U+2F57 : 0x99999999 */ - 9, /* U+2F58 - U+2F5F : 0x99999999 */ - 9, /* U+2F60 - U+2F67 : 0x99999999 */ - 9, /* U+2F68 - U+2F6F : 0x99999999 */ - 9, /* U+2F70 - U+2F77 : 0x99999999 */ - 9, /* U+2F78 - U+2F7F : 0x99999999 */ - 9, /* U+2F80 - U+2F87 : 0x99999999 */ - 9, /* U+2F88 - U+2F8F : 0x99999999 */ - 9, /* U+2F90 - U+2F97 : 0x99999999 */ - 9, /* U+2F98 - U+2F9F : 0x99999999 */ - 9, /* U+2FA0 - U+2FA7 : 0x99999999 */ - 9, /* U+2FA8 - U+2FAF : 0x99999999 */ - 9, /* U+2FB0 - U+2FB7 : 0x99999999 */ - 9, /* U+2FB8 - U+2FBF : 0x99999999 */ - 9, /* U+2FC0 - U+2FC7 : 0x99999999 */ - 9, /* U+2FC8 - U+2FCF : 0x99999999 */ - 155, /* U+2FD0 - U+2FD7 : 0x11999999 */ - 1, /* U+2FD8 - U+2FDF : 0x11111111 */ - 1, /* U+2FE0 - U+2FE7 : 0x11111111 */ - 1, /* U+2FE8 - U+2FEF : 0x11111111 */ - 9, /* U+2FF0 - U+2FF7 : 0x99999999 */ - 157, /* U+2FF8 - U+2FFF : 0x11119999 */ - 164, /* U+3000 - U+3007 : 0x1119999E */ - 9, /* U+3008 - U+300F : 0x99999999 */ - 9, /* U+3010 - U+3017 : 0x99999999 */ - 9, /* U+3018 - U+301F : 0x99999999 */ - 21, /* U+3020 - U+3027 : 0x11111119 */ - 127, /* U+3028 - U+302F : 0x11AAAA11 */ - 147, /* U+3030 - U+3037 : 0x99111119 */ - 32, /* U+3038 - U+303F : 0x99911111 */ - 1, /* U+3040 - U+3047 : 0x11111111 */ - 1, /* U+3048 - U+304F : 0x11111111 */ - 1, /* U+3050 - U+3057 : 0x11111111 */ - 1, /* U+3058 - U+305F : 0x11111111 */ - 1, /* U+3060 - U+3067 : 0x11111111 */ - 1, /* U+3068 - U+306F : 0x11111111 */ - 1, /* U+3070 - U+3077 : 0x11111111 */ - 1, /* U+3078 - U+307F : 0x11111111 */ - 1, /* U+3080 - U+3087 : 0x11111111 */ - 1, /* U+3088 - U+308F : 0x11111111 */ - 1, /* U+3090 - U+3097 : 0x11111111 */ - 165, /* U+3098 - U+309F : 0x11199AA1 */ - 21, /* U+30A0 - U+30A7 : 0x11111119 */ - 1, /* U+30A8 - U+30AF : 0x11111111 */ - 1, /* U+30B0 - U+30B7 : 0x11111111 */ - 1, /* U+30B8 - U+30BF : 0x11111111 */ - 1, /* U+30C0 - U+30C7 : 0x11111111 */ - 1, /* U+30C8 - U+30CF : 0x11111111 */ - 1, /* U+30D0 - U+30D7 : 0x11111111 */ - 1, /* U+30D8 - U+30DF : 0x11111111 */ - 1, /* U+30E0 - U+30E7 : 0x11111111 */ - 1, /* U+30E8 - U+30EF : 0x11111111 */ - 1, /* U+30F0 - U+30F7 : 0x11111111 */ - 166, /* U+30F8 - U+30FF : 0x11119111 */ - 1, /* U+3100 - U+3107 : 0x11111111 */ - 1, /* U+3108 - U+310F : 0x11111111 */ - 1, /* U+3110 - U+3117 : 0x11111111 */ - 1, /* U+3118 - U+311F : 0x11111111 */ - 1, /* U+3120 - U+3127 : 0x11111111 */ - 1, /* U+3128 - U+312F : 0x11111111 */ - 1, /* U+3130 - U+3137 : 0x11111111 */ - 1, /* U+3138 - U+313F : 0x11111111 */ - 1, /* U+3140 - U+3147 : 0x11111111 */ - 1, /* U+3148 - U+314F : 0x11111111 */ - 1, /* U+3150 - U+3157 : 0x11111111 */ - 1, /* U+3158 - U+315F : 0x11111111 */ - 1, /* U+3160 - U+3167 : 0x11111111 */ - 1, /* U+3168 - U+316F : 0x11111111 */ - 1, /* U+3170 - U+3177 : 0x11111111 */ - 1, /* U+3178 - U+317F : 0x11111111 */ - 1, /* U+3180 - U+3187 : 0x11111111 */ - 1, /* U+3188 - U+318F : 0x11111111 */ - 1, /* U+3190 - U+3197 : 0x11111111 */ - 1, /* U+3198 - U+319F : 0x11111111 */ - 1, /* U+31A0 - U+31A7 : 0x11111111 */ - 1, /* U+31A8 - U+31AF : 0x11111111 */ - 1, /* U+31B0 - U+31B7 : 0x11111111 */ - 1, /* U+31B8 - U+31BF : 0x11111111 */ - 9, /* U+31C0 - U+31C7 : 0x99999999 */ - 9, /* U+31C8 - U+31CF : 0x99999999 */ - 9, /* U+31D0 - U+31D7 : 0x99999999 */ - 9, /* U+31D8 - U+31DF : 0x99999999 */ - 157, /* U+31E0 - U+31E7 : 0x11119999 */ - 1, /* U+31E8 - U+31EF : 0x11111111 */ - 1, /* U+31F0 - U+31F7 : 0x11111111 */ - 1, /* U+31F8 - U+31FF : 0x11111111 */ - 1, /* U+3200 - U+3207 : 0x11111111 */ - 1, /* U+3208 - U+320F : 0x11111111 */ - 1, /* U+3210 - U+3217 : 0x11111111 */ - 134, /* U+3218 - U+321F : 0x19911111 */ - 1, /* U+3220 - U+3227 : 0x11111111 */ - 1, /* U+3228 - U+322F : 0x11111111 */ - 1, /* U+3230 - U+3237 : 0x11111111 */ - 1, /* U+3238 - U+323F : 0x11111111 */ - 1, /* U+3240 - U+3247 : 0x11111111 */ - 1, /* U+3248 - U+324F : 0x11111111 */ - 9, /* U+3250 - U+3257 : 0x99999999 */ - 9, /* U+3258 - U+325F : 0x99999999 */ - 1, /* U+3260 - U+3267 : 0x11111111 */ - 1, /* U+3268 - U+326F : 0x11111111 */ - 1, /* U+3270 - U+3277 : 0x11111111 */ - 167, /* U+3278 - U+327F : 0x19991111 */ - 1, /* U+3280 - U+3287 : 0x11111111 */ - 1, /* U+3288 - U+328F : 0x11111111 */ - 1, /* U+3290 - U+3297 : 0x11111111 */ - 1, /* U+3298 - U+329F : 0x11111111 */ - 1, /* U+32A0 - U+32A7 : 0x11111111 */ - 1, /* U+32A8 - U+32AF : 0x11111111 */ - 161, /* U+32B0 - U+32B7 : 0x99999991 */ - 9, /* U+32B8 - U+32BF : 0x99999999 */ - 1, /* U+32C0 - U+32C7 : 0x11111111 */ - 168, /* U+32C8 - U+32CF : 0x99991111 */ - 1, /* U+32D0 - U+32D7 : 0x11111111 */ - 1, /* U+32D8 - U+32DF : 0x11111111 */ - 1, /* U+32E0 - U+32E7 : 0x11111111 */ - 1, /* U+32E8 - U+32EF : 0x11111111 */ - 1, /* U+32F0 - U+32F7 : 0x11111111 */ - 1, /* U+32F8 - U+32FF : 0x11111111 */ - 1, /* U+3300 - U+3307 : 0x11111111 */ - 1, /* U+3308 - U+330F : 0x11111111 */ - 1, /* U+3310 - U+3317 : 0x11111111 */ - 1, /* U+3318 - U+331F : 0x11111111 */ - 1, /* U+3320 - U+3327 : 0x11111111 */ - 1, /* U+3328 - U+332F : 0x11111111 */ - 1, /* U+3330 - U+3337 : 0x11111111 */ - 1, /* U+3338 - U+333F : 0x11111111 */ - 1, /* U+3340 - U+3347 : 0x11111111 */ - 1, /* U+3348 - U+334F : 0x11111111 */ - 1, /* U+3350 - U+3357 : 0x11111111 */ - 1, /* U+3358 - U+335F : 0x11111111 */ - 1, /* U+3360 - U+3367 : 0x11111111 */ - 1, /* U+3368 - U+336F : 0x11111111 */ - 29, /* U+3370 - U+3377 : 0x91111111 */ - 158, /* U+3378 - U+337F : 0x11111999 */ - 1, /* U+3380 - U+3387 : 0x11111111 */ - 1, /* U+3388 - U+338F : 0x11111111 */ - 1, /* U+3390 - U+3397 : 0x11111111 */ - 1, /* U+3398 - U+339F : 0x11111111 */ - 1, /* U+33A0 - U+33A7 : 0x11111111 */ - 1, /* U+33A8 - U+33AF : 0x11111111 */ - 1, /* U+33B0 - U+33B7 : 0x11111111 */ - 1, /* U+33B8 - U+33BF : 0x11111111 */ - 1, /* U+33C0 - U+33C7 : 0x11111111 */ - 1, /* U+33C8 - U+33CF : 0x11111111 */ - 1, /* U+33D0 - U+33D7 : 0x11111111 */ - 122, /* U+33D8 - U+33DF : 0x99111111 */ - 1, /* U+33E0 - U+33E7 : 0x11111111 */ - 1, /* U+33E8 - U+33EF : 0x11111111 */ - 1, /* U+33F0 - U+33F7 : 0x11111111 */ - 29, /* U+33F8 - U+33FF : 0x91111111 */ -}; - -static PRUint8 gBidiCatIdx2[8] = { - 9, /* U+4DC0 - U+4DC7 : 0x99999999 */ - 9, /* U+4DC8 - U+4DCF : 0x99999999 */ - 9, /* U+4DD0 - U+4DD7 : 0x99999999 */ - 9, /* U+4DD8 - U+4DDF : 0x99999999 */ - 9, /* U+4DE0 - U+4DE7 : 0x99999999 */ - 9, /* U+4DE8 - U+4DEF : 0x99999999 */ - 9, /* U+4DF0 - U+4DF7 : 0x99999999 */ - 9, /* U+4DF8 - U+4DFF : 0x99999999 */ -}; - -static PRUint8 gBidiCatIdx3[384] = { - 1, /* U+A000 - U+A007 : 0x11111111 */ - 1, /* U+A008 - U+A00F : 0x11111111 */ - 1, /* U+A010 - U+A017 : 0x11111111 */ - 1, /* U+A018 - U+A01F : 0x11111111 */ - 1, /* U+A020 - U+A027 : 0x11111111 */ - 1, /* U+A028 - U+A02F : 0x11111111 */ - 1, /* U+A030 - U+A037 : 0x11111111 */ - 1, /* U+A038 - U+A03F : 0x11111111 */ - 1, /* U+A040 - U+A047 : 0x11111111 */ - 1, /* U+A048 - U+A04F : 0x11111111 */ - 1, /* U+A050 - U+A057 : 0x11111111 */ - 1, /* U+A058 - U+A05F : 0x11111111 */ - 1, /* U+A060 - U+A067 : 0x11111111 */ - 1, /* U+A068 - U+A06F : 0x11111111 */ - 1, /* U+A070 - U+A077 : 0x11111111 */ - 1, /* U+A078 - U+A07F : 0x11111111 */ - 1, /* U+A080 - U+A087 : 0x11111111 */ - 1, /* U+A088 - U+A08F : 0x11111111 */ - 1, /* U+A090 - U+A097 : 0x11111111 */ - 1, /* U+A098 - U+A09F : 0x11111111 */ - 1, /* U+A0A0 - U+A0A7 : 0x11111111 */ - 1, /* U+A0A8 - U+A0AF : 0x11111111 */ - 1, /* U+A0B0 - U+A0B7 : 0x11111111 */ - 1, /* U+A0B8 - U+A0BF : 0x11111111 */ - 1, /* U+A0C0 - U+A0C7 : 0x11111111 */ - 1, /* U+A0C8 - U+A0CF : 0x11111111 */ - 1, /* U+A0D0 - U+A0D7 : 0x11111111 */ - 1, /* U+A0D8 - U+A0DF : 0x11111111 */ - 1, /* U+A0E0 - U+A0E7 : 0x11111111 */ - 1, /* U+A0E8 - U+A0EF : 0x11111111 */ - 1, /* U+A0F0 - U+A0F7 : 0x11111111 */ - 1, /* U+A0F8 - U+A0FF : 0x11111111 */ - 1, /* U+A100 - U+A107 : 0x11111111 */ - 1, /* U+A108 - U+A10F : 0x11111111 */ - 1, /* U+A110 - U+A117 : 0x11111111 */ - 1, /* U+A118 - U+A11F : 0x11111111 */ - 1, /* U+A120 - U+A127 : 0x11111111 */ - 1, /* U+A128 - U+A12F : 0x11111111 */ - 1, /* U+A130 - U+A137 : 0x11111111 */ - 1, /* U+A138 - U+A13F : 0x11111111 */ - 1, /* U+A140 - U+A147 : 0x11111111 */ - 1, /* U+A148 - U+A14F : 0x11111111 */ - 1, /* U+A150 - U+A157 : 0x11111111 */ - 1, /* U+A158 - U+A15F : 0x11111111 */ - 1, /* U+A160 - U+A167 : 0x11111111 */ - 1, /* U+A168 - U+A16F : 0x11111111 */ - 1, /* U+A170 - U+A177 : 0x11111111 */ - 1, /* U+A178 - U+A17F : 0x11111111 */ - 1, /* U+A180 - U+A187 : 0x11111111 */ - 1, /* U+A188 - U+A18F : 0x11111111 */ - 1, /* U+A190 - U+A197 : 0x11111111 */ - 1, /* U+A198 - U+A19F : 0x11111111 */ - 1, /* U+A1A0 - U+A1A7 : 0x11111111 */ - 1, /* U+A1A8 - U+A1AF : 0x11111111 */ - 1, /* U+A1B0 - U+A1B7 : 0x11111111 */ - 1, /* U+A1B8 - U+A1BF : 0x11111111 */ - 1, /* U+A1C0 - U+A1C7 : 0x11111111 */ - 1, /* U+A1C8 - U+A1CF : 0x11111111 */ - 1, /* U+A1D0 - U+A1D7 : 0x11111111 */ - 1, /* U+A1D8 - U+A1DF : 0x11111111 */ - 1, /* U+A1E0 - U+A1E7 : 0x11111111 */ - 1, /* U+A1E8 - U+A1EF : 0x11111111 */ - 1, /* U+A1F0 - U+A1F7 : 0x11111111 */ - 1, /* U+A1F8 - U+A1FF : 0x11111111 */ - 1, /* U+A200 - U+A207 : 0x11111111 */ - 1, /* U+A208 - U+A20F : 0x11111111 */ - 1, /* U+A210 - U+A217 : 0x11111111 */ - 1, /* U+A218 - U+A21F : 0x11111111 */ - 1, /* U+A220 - U+A227 : 0x11111111 */ - 1, /* U+A228 - U+A22F : 0x11111111 */ - 1, /* U+A230 - U+A237 : 0x11111111 */ - 1, /* U+A238 - U+A23F : 0x11111111 */ - 1, /* U+A240 - U+A247 : 0x11111111 */ - 1, /* U+A248 - U+A24F : 0x11111111 */ - 1, /* U+A250 - U+A257 : 0x11111111 */ - 1, /* U+A258 - U+A25F : 0x11111111 */ - 1, /* U+A260 - U+A267 : 0x11111111 */ - 1, /* U+A268 - U+A26F : 0x11111111 */ - 1, /* U+A270 - U+A277 : 0x11111111 */ - 1, /* U+A278 - U+A27F : 0x11111111 */ - 1, /* U+A280 - U+A287 : 0x11111111 */ - 1, /* U+A288 - U+A28F : 0x11111111 */ - 1, /* U+A290 - U+A297 : 0x11111111 */ - 1, /* U+A298 - U+A29F : 0x11111111 */ - 1, /* U+A2A0 - U+A2A7 : 0x11111111 */ - 1, /* U+A2A8 - U+A2AF : 0x11111111 */ - 1, /* U+A2B0 - U+A2B7 : 0x11111111 */ - 1, /* U+A2B8 - U+A2BF : 0x11111111 */ - 1, /* U+A2C0 - U+A2C7 : 0x11111111 */ - 1, /* U+A2C8 - U+A2CF : 0x11111111 */ - 1, /* U+A2D0 - U+A2D7 : 0x11111111 */ - 1, /* U+A2D8 - U+A2DF : 0x11111111 */ - 1, /* U+A2E0 - U+A2E7 : 0x11111111 */ - 1, /* U+A2E8 - U+A2EF : 0x11111111 */ - 1, /* U+A2F0 - U+A2F7 : 0x11111111 */ - 1, /* U+A2F8 - U+A2FF : 0x11111111 */ - 1, /* U+A300 - U+A307 : 0x11111111 */ - 1, /* U+A308 - U+A30F : 0x11111111 */ - 1, /* U+A310 - U+A317 : 0x11111111 */ - 1, /* U+A318 - U+A31F : 0x11111111 */ - 1, /* U+A320 - U+A327 : 0x11111111 */ - 1, /* U+A328 - U+A32F : 0x11111111 */ - 1, /* U+A330 - U+A337 : 0x11111111 */ - 1, /* U+A338 - U+A33F : 0x11111111 */ - 1, /* U+A340 - U+A347 : 0x11111111 */ - 1, /* U+A348 - U+A34F : 0x11111111 */ - 1, /* U+A350 - U+A357 : 0x11111111 */ - 1, /* U+A358 - U+A35F : 0x11111111 */ - 1, /* U+A360 - U+A367 : 0x11111111 */ - 1, /* U+A368 - U+A36F : 0x11111111 */ - 1, /* U+A370 - U+A377 : 0x11111111 */ - 1, /* U+A378 - U+A37F : 0x11111111 */ - 1, /* U+A380 - U+A387 : 0x11111111 */ - 1, /* U+A388 - U+A38F : 0x11111111 */ - 1, /* U+A390 - U+A397 : 0x11111111 */ - 1, /* U+A398 - U+A39F : 0x11111111 */ - 1, /* U+A3A0 - U+A3A7 : 0x11111111 */ - 1, /* U+A3A8 - U+A3AF : 0x11111111 */ - 1, /* U+A3B0 - U+A3B7 : 0x11111111 */ - 1, /* U+A3B8 - U+A3BF : 0x11111111 */ - 1, /* U+A3C0 - U+A3C7 : 0x11111111 */ - 1, /* U+A3C8 - U+A3CF : 0x11111111 */ - 1, /* U+A3D0 - U+A3D7 : 0x11111111 */ - 1, /* U+A3D8 - U+A3DF : 0x11111111 */ - 1, /* U+A3E0 - U+A3E7 : 0x11111111 */ - 1, /* U+A3E8 - U+A3EF : 0x11111111 */ - 1, /* U+A3F0 - U+A3F7 : 0x11111111 */ - 1, /* U+A3F8 - U+A3FF : 0x11111111 */ - 1, /* U+A400 - U+A407 : 0x11111111 */ - 1, /* U+A408 - U+A40F : 0x11111111 */ - 1, /* U+A410 - U+A417 : 0x11111111 */ - 1, /* U+A418 - U+A41F : 0x11111111 */ - 1, /* U+A420 - U+A427 : 0x11111111 */ - 1, /* U+A428 - U+A42F : 0x11111111 */ - 1, /* U+A430 - U+A437 : 0x11111111 */ - 1, /* U+A438 - U+A43F : 0x11111111 */ - 1, /* U+A440 - U+A447 : 0x11111111 */ - 1, /* U+A448 - U+A44F : 0x11111111 */ - 1, /* U+A450 - U+A457 : 0x11111111 */ - 1, /* U+A458 - U+A45F : 0x11111111 */ - 1, /* U+A460 - U+A467 : 0x11111111 */ - 1, /* U+A468 - U+A46F : 0x11111111 */ - 1, /* U+A470 - U+A477 : 0x11111111 */ - 1, /* U+A478 - U+A47F : 0x11111111 */ - 1, /* U+A480 - U+A487 : 0x11111111 */ - 1, /* U+A488 - U+A48F : 0x11111111 */ - 9, /* U+A490 - U+A497 : 0x99999999 */ - 9, /* U+A498 - U+A49F : 0x99999999 */ - 9, /* U+A4A0 - U+A4A7 : 0x99999999 */ - 9, /* U+A4A8 - U+A4AF : 0x99999999 */ - 9, /* U+A4B0 - U+A4B7 : 0x99999999 */ - 9, /* U+A4B8 - U+A4BF : 0x99999999 */ - 93, /* U+A4C0 - U+A4C7 : 0x19999999 */ - 1, /* U+A4C8 - U+A4CF : 0x11111111 */ - 1, /* U+A4D0 - U+A4D7 : 0x11111111 */ - 1, /* U+A4D8 - U+A4DF : 0x11111111 */ - 1, /* U+A4E0 - U+A4E7 : 0x11111111 */ - 1, /* U+A4E8 - U+A4EF : 0x11111111 */ - 1, /* U+A4F0 - U+A4F7 : 0x11111111 */ - 1, /* U+A4F8 - U+A4FF : 0x11111111 */ - 1, /* U+A500 - U+A507 : 0x11111111 */ - 1, /* U+A508 - U+A50F : 0x11111111 */ - 1, /* U+A510 - U+A517 : 0x11111111 */ - 1, /* U+A518 - U+A51F : 0x11111111 */ - 1, /* U+A520 - U+A527 : 0x11111111 */ - 1, /* U+A528 - U+A52F : 0x11111111 */ - 1, /* U+A530 - U+A537 : 0x11111111 */ - 1, /* U+A538 - U+A53F : 0x11111111 */ - 1, /* U+A540 - U+A547 : 0x11111111 */ - 1, /* U+A548 - U+A54F : 0x11111111 */ - 1, /* U+A550 - U+A557 : 0x11111111 */ - 1, /* U+A558 - U+A55F : 0x11111111 */ - 1, /* U+A560 - U+A567 : 0x11111111 */ - 1, /* U+A568 - U+A56F : 0x11111111 */ - 1, /* U+A570 - U+A577 : 0x11111111 */ - 1, /* U+A578 - U+A57F : 0x11111111 */ - 1, /* U+A580 - U+A587 : 0x11111111 */ - 1, /* U+A588 - U+A58F : 0x11111111 */ - 1, /* U+A590 - U+A597 : 0x11111111 */ - 1, /* U+A598 - U+A59F : 0x11111111 */ - 1, /* U+A5A0 - U+A5A7 : 0x11111111 */ - 1, /* U+A5A8 - U+A5AF : 0x11111111 */ - 1, /* U+A5B0 - U+A5B7 : 0x11111111 */ - 1, /* U+A5B8 - U+A5BF : 0x11111111 */ - 1, /* U+A5C0 - U+A5C7 : 0x11111111 */ - 1, /* U+A5C8 - U+A5CF : 0x11111111 */ - 1, /* U+A5D0 - U+A5D7 : 0x11111111 */ - 1, /* U+A5D8 - U+A5DF : 0x11111111 */ - 1, /* U+A5E0 - U+A5E7 : 0x11111111 */ - 1, /* U+A5E8 - U+A5EF : 0x11111111 */ - 1, /* U+A5F0 - U+A5F7 : 0x11111111 */ - 1, /* U+A5F8 - U+A5FF : 0x11111111 */ - 1, /* U+A600 - U+A607 : 0x11111111 */ - 32, /* U+A608 - U+A60F : 0x99911111 */ - 1, /* U+A610 - U+A617 : 0x11111111 */ - 1, /* U+A618 - U+A61F : 0x11111111 */ - 1, /* U+A620 - U+A627 : 0x11111111 */ - 1, /* U+A628 - U+A62F : 0x11111111 */ - 1, /* U+A630 - U+A637 : 0x11111111 */ - 1, /* U+A638 - U+A63F : 0x11111111 */ - 1, /* U+A640 - U+A647 : 0x11111111 */ - 1, /* U+A648 - U+A64F : 0x11111111 */ - 1, /* U+A650 - U+A657 : 0x11111111 */ - 1, /* U+A658 - U+A65F : 0x11111111 */ - 1, /* U+A660 - U+A667 : 0x11111111 */ - 98, /* U+A668 - U+A66F : 0xA1111111 */ - 169, /* U+A670 - U+A677 : 0xAAAA9AAA */ - 170, /* U+A678 - U+A67F : 0x99AAAAAA */ - 1, /* U+A680 - U+A687 : 0x11111111 */ - 1, /* U+A688 - U+A68F : 0x11111111 */ - 1, /* U+A690 - U+A697 : 0x11111111 */ - 98, /* U+A698 - U+A69F : 0xA1111111 */ - 1, /* U+A6A0 - U+A6A7 : 0x11111111 */ - 1, /* U+A6A8 - U+A6AF : 0x11111111 */ - 1, /* U+A6B0 - U+A6B7 : 0x11111111 */ - 1, /* U+A6B8 - U+A6BF : 0x11111111 */ - 1, /* U+A6C0 - U+A6C7 : 0x11111111 */ - 1, /* U+A6C8 - U+A6CF : 0x11111111 */ - 1, /* U+A6D0 - U+A6D7 : 0x11111111 */ - 1, /* U+A6D8 - U+A6DF : 0x11111111 */ - 1, /* U+A6E0 - U+A6E7 : 0x11111111 */ - 1, /* U+A6E8 - U+A6EF : 0x11111111 */ - 38, /* U+A6F0 - U+A6F7 : 0x111111AA */ - 1, /* U+A6F8 - U+A6FF : 0x11111111 */ - 9, /* U+A700 - U+A707 : 0x99999999 */ - 9, /* U+A708 - U+A70F : 0x99999999 */ - 9, /* U+A710 - U+A717 : 0x99999999 */ - 9, /* U+A718 - U+A71F : 0x99999999 */ - 111, /* U+A720 - U+A727 : 0x11111199 */ - 1, /* U+A728 - U+A72F : 0x11111111 */ - 1, /* U+A730 - U+A737 : 0x11111111 */ - 1, /* U+A738 - U+A73F : 0x11111111 */ - 1, /* U+A740 - U+A747 : 0x11111111 */ - 1, /* U+A748 - U+A74F : 0x11111111 */ - 1, /* U+A750 - U+A757 : 0x11111111 */ - 1, /* U+A758 - U+A75F : 0x11111111 */ - 1, /* U+A760 - U+A767 : 0x11111111 */ - 1, /* U+A768 - U+A76F : 0x11111111 */ - 1, /* U+A770 - U+A777 : 0x11111111 */ - 1, /* U+A778 - U+A77F : 0x11111111 */ - 1, /* U+A780 - U+A787 : 0x11111111 */ - 21, /* U+A788 - U+A78F : 0x11111119 */ - 1, /* U+A790 - U+A797 : 0x11111111 */ - 1, /* U+A798 - U+A79F : 0x11111111 */ - 1, /* U+A7A0 - U+A7A7 : 0x11111111 */ - 1, /* U+A7A8 - U+A7AF : 0x11111111 */ - 1, /* U+A7B0 - U+A7B7 : 0x11111111 */ - 1, /* U+A7B8 - U+A7BF : 0x11111111 */ - 1, /* U+A7C0 - U+A7C7 : 0x11111111 */ - 1, /* U+A7C8 - U+A7CF : 0x11111111 */ - 1, /* U+A7D0 - U+A7D7 : 0x11111111 */ - 1, /* U+A7D8 - U+A7DF : 0x11111111 */ - 1, /* U+A7E0 - U+A7E7 : 0x11111111 */ - 1, /* U+A7E8 - U+A7EF : 0x11111111 */ - 1, /* U+A7F0 - U+A7F7 : 0x11111111 */ - 1, /* U+A7F8 - U+A7FF : 0x11111111 */ - 171, /* U+A800 - U+A807 : 0x1A111A11 */ - 172, /* U+A808 - U+A80F : 0x1111A111 */ - 1, /* U+A810 - U+A817 : 0x11111111 */ - 1, /* U+A818 - U+A81F : 0x11111111 */ - 92, /* U+A820 - U+A827 : 0x1AA11111 */ - 157, /* U+A828 - U+A82F : 0x11119999 */ - 1, /* U+A830 - U+A837 : 0x11111111 */ - 144, /* U+A838 - U+A83F : 0x11111177 */ - 1, /* U+A840 - U+A847 : 0x11111111 */ - 1, /* U+A848 - U+A84F : 0x11111111 */ - 1, /* U+A850 - U+A857 : 0x11111111 */ - 1, /* U+A858 - U+A85F : 0x11111111 */ - 1, /* U+A860 - U+A867 : 0x11111111 */ - 1, /* U+A868 - U+A86F : 0x11111111 */ - 168, /* U+A870 - U+A877 : 0x99991111 */ - 1, /* U+A878 - U+A87F : 0x11111111 */ - 1, /* U+A880 - U+A887 : 0x11111111 */ - 1, /* U+A888 - U+A88F : 0x11111111 */ - 1, /* U+A890 - U+A897 : 0x11111111 */ - 1, /* U+A898 - U+A89F : 0x11111111 */ - 1, /* U+A8A0 - U+A8A7 : 0x11111111 */ - 1, /* U+A8A8 - U+A8AF : 0x11111111 */ - 1, /* U+A8B0 - U+A8B7 : 0x11111111 */ - 1, /* U+A8B8 - U+A8BF : 0x11111111 */ - 73, /* U+A8C0 - U+A8C7 : 0x111A1111 */ - 1, /* U+A8C8 - U+A8CF : 0x11111111 */ - 1, /* U+A8D0 - U+A8D7 : 0x11111111 */ - 1, /* U+A8D8 - U+A8DF : 0x11111111 */ - 10, /* U+A8E0 - U+A8E7 : 0xAAAAAAAA */ - 10, /* U+A8E8 - U+A8EF : 0xAAAAAAAA */ - 38, /* U+A8F0 - U+A8F7 : 0x111111AA */ - 1, /* U+A8F8 - U+A8FF : 0x11111111 */ - 1, /* U+A900 - U+A907 : 0x11111111 */ - 1, /* U+A908 - U+A90F : 0x11111111 */ - 1, /* U+A910 - U+A917 : 0x11111111 */ - 1, /* U+A918 - U+A91F : 0x11111111 */ - 89, /* U+A920 - U+A927 : 0xAA111111 */ - 101, /* U+A928 - U+A92F : 0x11AAAAAA */ - 1, /* U+A930 - U+A937 : 0x11111111 */ - 1, /* U+A938 - U+A93F : 0x11111111 */ - 98, /* U+A940 - U+A947 : 0xA1111111 */ - 10, /* U+A948 - U+A94F : 0xAAAAAAAA */ - 38, /* U+A950 - U+A957 : 0x111111AA */ - 1, /* U+A958 - U+A95F : 0x11111111 */ - 1, /* U+A960 - U+A967 : 0x11111111 */ - 1, /* U+A968 - U+A96F : 0x11111111 */ - 1, /* U+A970 - U+A977 : 0x11111111 */ - 1, /* U+A978 - U+A97F : 0x11111111 */ - 67, /* U+A980 - U+A987 : 0x11111AAA */ - 1, /* U+A988 - U+A98F : 0x11111111 */ - 1, /* U+A990 - U+A997 : 0x11111111 */ - 1, /* U+A998 - U+A99F : 0x11111111 */ - 1, /* U+A9A0 - U+A9A7 : 0x11111111 */ - 1, /* U+A9A8 - U+A9AF : 0x11111111 */ - 173, /* U+A9B0 - U+A9B7 : 0xAA11A111 */ - 174, /* U+A9B8 - U+A9BF : 0x111A11AA */ - 1, /* U+A9C0 - U+A9C7 : 0x11111111 */ - 1, /* U+A9C8 - U+A9CF : 0x11111111 */ - 1, /* U+A9D0 - U+A9D7 : 0x11111111 */ - 1, /* U+A9D8 - U+A9DF : 0x11111111 */ - 1, /* U+A9E0 - U+A9E7 : 0x11111111 */ - 1, /* U+A9E8 - U+A9EF : 0x11111111 */ - 1, /* U+A9F0 - U+A9F7 : 0x11111111 */ - 1, /* U+A9F8 - U+A9FF : 0x11111111 */ - 1, /* U+AA00 - U+AA07 : 0x11111111 */ - 1, /* U+AA08 - U+AA0F : 0x11111111 */ - 1, /* U+AA10 - U+AA17 : 0x11111111 */ - 1, /* U+AA18 - U+AA1F : 0x11111111 */ - 1, /* U+AA20 - U+AA27 : 0x11111111 */ - 175, /* U+AA28 - U+AA2F : 0x1AAAAAA1 */ - 108, /* U+AA30 - U+AA37 : 0x1AA11AA1 */ - 1, /* U+AA38 - U+AA3F : 0x11111111 */ - 172, /* U+AA40 - U+AA47 : 0x1111A111 */ - 73, /* U+AA48 - U+AA4F : 0x111A1111 */ - 1, /* U+AA50 - U+AA57 : 0x11111111 */ - 1, /* U+AA58 - U+AA5F : 0x11111111 */ - 1, /* U+AA60 - U+AA67 : 0x11111111 */ - 1, /* U+AA68 - U+AA6F : 0x11111111 */ - 1, /* U+AA70 - U+AA77 : 0x11111111 */ - 1, /* U+AA78 - U+AA7F : 0x11111111 */ - 1, /* U+AA80 - U+AA87 : 0x11111111 */ - 1, /* U+AA88 - U+AA8F : 0x11111111 */ - 1, /* U+AA90 - U+AA97 : 0x11111111 */ - 1, /* U+AA98 - U+AA9F : 0x11111111 */ - 1, /* U+AAA0 - U+AAA7 : 0x11111111 */ - 1, /* U+AAA8 - U+AAAF : 0x11111111 */ - 176, /* U+AAB0 - U+AAB7 : 0xA11AAA1A */ - 90, /* U+AAB8 - U+AABF : 0xAA11111A */ - 72, /* U+AAC0 - U+AAC7 : 0x111111A1 */ - 1, /* U+AAC8 - U+AACF : 0x11111111 */ - 1, /* U+AAD0 - U+AAD7 : 0x11111111 */ - 1, /* U+AAD8 - U+AADF : 0x11111111 */ - 1, /* U+AAE0 - U+AAE7 : 0x11111111 */ - 94, /* U+AAE8 - U+AAEF : 0x11AA1111 */ - 85, /* U+AAF0 - U+AAF7 : 0x1A111111 */ - 1, /* U+AAF8 - U+AAFF : 0x11111111 */ - 1, /* U+AB00 - U+AB07 : 0x11111111 */ - 1, /* U+AB08 - U+AB0F : 0x11111111 */ - 1, /* U+AB10 - U+AB17 : 0x11111111 */ - 1, /* U+AB18 - U+AB1F : 0x11111111 */ - 1, /* U+AB20 - U+AB27 : 0x11111111 */ - 1, /* U+AB28 - U+AB2F : 0x11111111 */ - 1, /* U+AB30 - U+AB37 : 0x11111111 */ - 1, /* U+AB38 - U+AB3F : 0x11111111 */ - 1, /* U+AB40 - U+AB47 : 0x11111111 */ - 1, /* U+AB48 - U+AB4F : 0x11111111 */ - 1, /* U+AB50 - U+AB57 : 0x11111111 */ - 1, /* U+AB58 - U+AB5F : 0x11111111 */ - 1, /* U+AB60 - U+AB67 : 0x11111111 */ - 1, /* U+AB68 - U+AB6F : 0x11111111 */ - 1, /* U+AB70 - U+AB77 : 0x11111111 */ - 1, /* U+AB78 - U+AB7F : 0x11111111 */ - 1, /* U+AB80 - U+AB87 : 0x11111111 */ - 1, /* U+AB88 - U+AB8F : 0x11111111 */ - 1, /* U+AB90 - U+AB97 : 0x11111111 */ - 1, /* U+AB98 - U+AB9F : 0x11111111 */ - 1, /* U+ABA0 - U+ABA7 : 0x11111111 */ - 1, /* U+ABA8 - U+ABAF : 0x11111111 */ - 1, /* U+ABB0 - U+ABB7 : 0x11111111 */ - 1, /* U+ABB8 - U+ABBF : 0x11111111 */ - 1, /* U+ABC0 - U+ABC7 : 0x11111111 */ - 1, /* U+ABC8 - U+ABCF : 0x11111111 */ - 1, /* U+ABD0 - U+ABD7 : 0x11111111 */ - 1, /* U+ABD8 - U+ABDF : 0x11111111 */ - 75, /* U+ABE0 - U+ABE7 : 0x11A11111 */ - 70, /* U+ABE8 - U+ABEF : 0x11A1111A */ - 1, /* U+ABF0 - U+ABF7 : 0x11111111 */ - 1, /* U+ABF8 - U+ABFF : 0x11111111 */ -}; - -static PRUint8 gBidiCatIdx4[10] = { - 1, /* U+D7B0 - U+D7B7 : 0x11111111 */ - 1, /* U+D7B8 - U+D7BF : 0x11111111 */ - 1, /* U+D7C0 - U+D7C7 : 0x11111111 */ - 1, /* U+D7C8 - U+D7CF : 0x11111111 */ - 1, /* U+D7D0 - U+D7D7 : 0x11111111 */ - 1, /* U+D7D8 - U+D7DF : 0x11111111 */ - 1, /* U+D7E0 - U+D7E7 : 0x11111111 */ - 1, /* U+D7E8 - U+D7EF : 0x11111111 */ - 1, /* U+D7F0 - U+D7F7 : 0x11111111 */ - 1, /* U+D7F8 - U+D7FF : 0x11111111 */ -}; - -static PRUint8 gBidiCatIdx5[276] = { - 1, /* U+F900 - U+F907 : 0x11111111 */ - 1, /* U+F908 - U+F90F : 0x11111111 */ - 1, /* U+F910 - U+F917 : 0x11111111 */ - 1, /* U+F918 - U+F91F : 0x11111111 */ - 1, /* U+F920 - U+F927 : 0x11111111 */ - 1, /* U+F928 - U+F92F : 0x11111111 */ - 1, /* U+F930 - U+F937 : 0x11111111 */ - 1, /* U+F938 - U+F93F : 0x11111111 */ - 1, /* U+F940 - U+F947 : 0x11111111 */ - 1, /* U+F948 - U+F94F : 0x11111111 */ - 1, /* U+F950 - U+F957 : 0x11111111 */ - 1, /* U+F958 - U+F95F : 0x11111111 */ - 1, /* U+F960 - U+F967 : 0x11111111 */ - 1, /* U+F968 - U+F96F : 0x11111111 */ - 1, /* U+F970 - U+F977 : 0x11111111 */ - 1, /* U+F978 - U+F97F : 0x11111111 */ - 1, /* U+F980 - U+F987 : 0x11111111 */ - 1, /* U+F988 - U+F98F : 0x11111111 */ - 1, /* U+F990 - U+F997 : 0x11111111 */ - 1, /* U+F998 - U+F99F : 0x11111111 */ - 1, /* U+F9A0 - U+F9A7 : 0x11111111 */ - 1, /* U+F9A8 - U+F9AF : 0x11111111 */ - 1, /* U+F9B0 - U+F9B7 : 0x11111111 */ - 1, /* U+F9B8 - U+F9BF : 0x11111111 */ - 1, /* U+F9C0 - U+F9C7 : 0x11111111 */ - 1, /* U+F9C8 - U+F9CF : 0x11111111 */ - 1, /* U+F9D0 - U+F9D7 : 0x11111111 */ - 1, /* U+F9D8 - U+F9DF : 0x11111111 */ - 1, /* U+F9E0 - U+F9E7 : 0x11111111 */ - 1, /* U+F9E8 - U+F9EF : 0x11111111 */ - 1, /* U+F9F0 - U+F9F7 : 0x11111111 */ - 1, /* U+F9F8 - U+F9FF : 0x11111111 */ - 1, /* U+FA00 - U+FA07 : 0x11111111 */ - 1, /* U+FA08 - U+FA0F : 0x11111111 */ - 1, /* U+FA10 - U+FA17 : 0x11111111 */ - 1, /* U+FA18 - U+FA1F : 0x11111111 */ - 1, /* U+FA20 - U+FA27 : 0x11111111 */ - 1, /* U+FA28 - U+FA2F : 0x11111111 */ - 1, /* U+FA30 - U+FA37 : 0x11111111 */ - 1, /* U+FA38 - U+FA3F : 0x11111111 */ - 1, /* U+FA40 - U+FA47 : 0x11111111 */ - 1, /* U+FA48 - U+FA4F : 0x11111111 */ - 1, /* U+FA50 - U+FA57 : 0x11111111 */ - 1, /* U+FA58 - U+FA5F : 0x11111111 */ - 1, /* U+FA60 - U+FA67 : 0x11111111 */ - 1, /* U+FA68 - U+FA6F : 0x11111111 */ - 1, /* U+FA70 - U+FA77 : 0x11111111 */ - 1, /* U+FA78 - U+FA7F : 0x11111111 */ - 1, /* U+FA80 - U+FA87 : 0x11111111 */ - 1, /* U+FA88 - U+FA8F : 0x11111111 */ - 1, /* U+FA90 - U+FA97 : 0x11111111 */ - 1, /* U+FA98 - U+FA9F : 0x11111111 */ - 1, /* U+FAA0 - U+FAA7 : 0x11111111 */ - 1, /* U+FAA8 - U+FAAF : 0x11111111 */ - 1, /* U+FAB0 - U+FAB7 : 0x11111111 */ - 1, /* U+FAB8 - U+FABF : 0x11111111 */ - 1, /* U+FAC0 - U+FAC7 : 0x11111111 */ - 1, /* U+FAC8 - U+FACF : 0x11111111 */ - 1, /* U+FAD0 - U+FAD7 : 0x11111111 */ - 1, /* U+FAD8 - U+FADF : 0x11111111 */ - 1, /* U+FAE0 - U+FAE7 : 0x11111111 */ - 1, /* U+FAE8 - U+FAEF : 0x11111111 */ - 1, /* U+FAF0 - U+FAF7 : 0x11111111 */ - 1, /* U+FAF8 - U+FAFF : 0x11111111 */ - 1, /* U+FB00 - U+FB07 : 0x11111111 */ - 1, /* U+FB08 - U+FB0F : 0x11111111 */ - 1, /* U+FB10 - U+FB17 : 0x11111111 */ - 177, /* U+FB18 - U+FB1F : 0x2A211111 */ - 2, /* U+FB20 - U+FB27 : 0x22222222 */ - 178, /* U+FB28 - U+FB2F : 0x22222262 */ - 2, /* U+FB30 - U+FB37 : 0x22222222 */ - 2, /* U+FB38 - U+FB3F : 0x22222222 */ - 2, /* U+FB40 - U+FB47 : 0x22222222 */ - 2, /* U+FB48 - U+FB4F : 0x22222222 */ - 3, /* U+FB50 - U+FB57 : 0x33333333 */ - 3, /* U+FB58 - U+FB5F : 0x33333333 */ - 3, /* U+FB60 - U+FB67 : 0x33333333 */ - 3, /* U+FB68 - U+FB6F : 0x33333333 */ - 3, /* U+FB70 - U+FB77 : 0x33333333 */ - 3, /* U+FB78 - U+FB7F : 0x33333333 */ - 3, /* U+FB80 - U+FB87 : 0x33333333 */ - 3, /* U+FB88 - U+FB8F : 0x33333333 */ - 3, /* U+FB90 - U+FB97 : 0x33333333 */ - 3, /* U+FB98 - U+FB9F : 0x33333333 */ - 3, /* U+FBA0 - U+FBA7 : 0x33333333 */ - 3, /* U+FBA8 - U+FBAF : 0x33333333 */ - 3, /* U+FBB0 - U+FBB7 : 0x33333333 */ - 3, /* U+FBB8 - U+FBBF : 0x33333333 */ - 3, /* U+FBC0 - U+FBC7 : 0x33333333 */ - 3, /* U+FBC8 - U+FBCF : 0x33333333 */ - 3, /* U+FBD0 - U+FBD7 : 0x33333333 */ - 3, /* U+FBD8 - U+FBDF : 0x33333333 */ - 3, /* U+FBE0 - U+FBE7 : 0x33333333 */ - 3, /* U+FBE8 - U+FBEF : 0x33333333 */ - 3, /* U+FBF0 - U+FBF7 : 0x33333333 */ - 3, /* U+FBF8 - U+FBFF : 0x33333333 */ - 3, /* U+FC00 - U+FC07 : 0x33333333 */ - 3, /* U+FC08 - U+FC0F : 0x33333333 */ - 3, /* U+FC10 - U+FC17 : 0x33333333 */ - 3, /* U+FC18 - U+FC1F : 0x33333333 */ - 3, /* U+FC20 - U+FC27 : 0x33333333 */ - 3, /* U+FC28 - U+FC2F : 0x33333333 */ - 3, /* U+FC30 - U+FC37 : 0x33333333 */ - 3, /* U+FC38 - U+FC3F : 0x33333333 */ - 3, /* U+FC40 - U+FC47 : 0x33333333 */ - 3, /* U+FC48 - U+FC4F : 0x33333333 */ - 3, /* U+FC50 - U+FC57 : 0x33333333 */ - 3, /* U+FC58 - U+FC5F : 0x33333333 */ - 3, /* U+FC60 - U+FC67 : 0x33333333 */ - 3, /* U+FC68 - U+FC6F : 0x33333333 */ - 3, /* U+FC70 - U+FC77 : 0x33333333 */ - 3, /* U+FC78 - U+FC7F : 0x33333333 */ - 3, /* U+FC80 - U+FC87 : 0x33333333 */ - 3, /* U+FC88 - U+FC8F : 0x33333333 */ - 3, /* U+FC90 - U+FC97 : 0x33333333 */ - 3, /* U+FC98 - U+FC9F : 0x33333333 */ - 3, /* U+FCA0 - U+FCA7 : 0x33333333 */ - 3, /* U+FCA8 - U+FCAF : 0x33333333 */ - 3, /* U+FCB0 - U+FCB7 : 0x33333333 */ - 3, /* U+FCB8 - U+FCBF : 0x33333333 */ - 3, /* U+FCC0 - U+FCC7 : 0x33333333 */ - 3, /* U+FCC8 - U+FCCF : 0x33333333 */ - 3, /* U+FCD0 - U+FCD7 : 0x33333333 */ - 3, /* U+FCD8 - U+FCDF : 0x33333333 */ - 3, /* U+FCE0 - U+FCE7 : 0x33333333 */ - 3, /* U+FCE8 - U+FCEF : 0x33333333 */ - 3, /* U+FCF0 - U+FCF7 : 0x33333333 */ - 3, /* U+FCF8 - U+FCFF : 0x33333333 */ - 3, /* U+FD00 - U+FD07 : 0x33333333 */ - 3, /* U+FD08 - U+FD0F : 0x33333333 */ - 3, /* U+FD10 - U+FD17 : 0x33333333 */ - 3, /* U+FD18 - U+FD1F : 0x33333333 */ - 3, /* U+FD20 - U+FD27 : 0x33333333 */ - 3, /* U+FD28 - U+FD2F : 0x33333333 */ - 3, /* U+FD30 - U+FD37 : 0x33333333 */ - 179, /* U+FD38 - U+FD3F : 0x99333333 */ - 3, /* U+FD40 - U+FD47 : 0x33333333 */ - 3, /* U+FD48 - U+FD4F : 0x33333333 */ - 3, /* U+FD50 - U+FD57 : 0x33333333 */ - 3, /* U+FD58 - U+FD5F : 0x33333333 */ - 3, /* U+FD60 - U+FD67 : 0x33333333 */ - 3, /* U+FD68 - U+FD6F : 0x33333333 */ - 3, /* U+FD70 - U+FD77 : 0x33333333 */ - 3, /* U+FD78 - U+FD7F : 0x33333333 */ - 3, /* U+FD80 - U+FD87 : 0x33333333 */ - 3, /* U+FD88 - U+FD8F : 0x33333333 */ - 3, /* U+FD90 - U+FD97 : 0x33333333 */ - 3, /* U+FD98 - U+FD9F : 0x33333333 */ - 3, /* U+FDA0 - U+FDA7 : 0x33333333 */ - 3, /* U+FDA8 - U+FDAF : 0x33333333 */ - 3, /* U+FDB0 - U+FDB7 : 0x33333333 */ - 3, /* U+FDB8 - U+FDBF : 0x33333333 */ - 3, /* U+FDC0 - U+FDC7 : 0x33333333 */ - 3, /* U+FDC8 - U+FDCF : 0x33333333 */ - 3, /* U+FDD0 - U+FDD7 : 0x33333333 */ - 3, /* U+FDD8 - U+FDDF : 0x33333333 */ - 3, /* U+FDE0 - U+FDE7 : 0x33333333 */ - 3, /* U+FDE8 - U+FDEF : 0x33333333 */ - 3, /* U+FDF0 - U+FDF7 : 0x33333333 */ - 180, /* U+FDF8 - U+FDFF : 0x33933333 */ - 10, /* U+FE00 - U+FE07 : 0xAAAAAAAA */ - 10, /* U+FE08 - U+FE0F : 0xAAAAAAAA */ - 9, /* U+FE10 - U+FE17 : 0x99999999 */ - 111, /* U+FE18 - U+FE1F : 0x11111199 */ - 99, /* U+FE20 - U+FE27 : 0x1AAAAAAA */ - 1, /* U+FE28 - U+FE2F : 0x11111111 */ - 9, /* U+FE30 - U+FE37 : 0x99999999 */ - 9, /* U+FE38 - U+FE3F : 0x99999999 */ - 9, /* U+FE40 - U+FE47 : 0x99999999 */ - 9, /* U+FE48 - U+FE4F : 0x99999999 */ - 181, /* U+FE50 - U+FE57 : 0x99891898 */ - 182, /* U+FE58 - U+FE5F : 0x79999999 */ - 183, /* U+FE60 - U+FE67 : 0x19996699 */ - 184, /* U+FE68 - U+FE6F : 0x11119779 */ - 3, /* U+FE70 - U+FE77 : 0x33333333 */ - 3, /* U+FE78 - U+FE7F : 0x33333333 */ - 3, /* U+FE80 - U+FE87 : 0x33333333 */ - 3, /* U+FE88 - U+FE8F : 0x33333333 */ - 3, /* U+FE90 - U+FE97 : 0x33333333 */ - 3, /* U+FE98 - U+FE9F : 0x33333333 */ - 3, /* U+FEA0 - U+FEA7 : 0x33333333 */ - 3, /* U+FEA8 - U+FEAF : 0x33333333 */ - 3, /* U+FEB0 - U+FEB7 : 0x33333333 */ - 3, /* U+FEB8 - U+FEBF : 0x33333333 */ - 3, /* U+FEC0 - U+FEC7 : 0x33333333 */ - 3, /* U+FEC8 - U+FECF : 0x33333333 */ - 3, /* U+FED0 - U+FED7 : 0x33333333 */ - 3, /* U+FED8 - U+FEDF : 0x33333333 */ - 3, /* U+FEE0 - U+FEE7 : 0x33333333 */ - 3, /* U+FEE8 - U+FEEF : 0x33333333 */ - 3, /* U+FEF0 - U+FEF7 : 0x33333333 */ - 185, /* U+FEF8 - U+FEFF : 0xB3333333 */ - 186, /* U+FF00 - U+FF07 : 0x99777991 */ - 19, /* U+FF08 - U+FF0F : 0x88686999 */ - 5, /* U+FF10 - U+FF17 : 0x55555555 */ - 20, /* U+FF18 - U+FF1F : 0x99999855 */ - 21, /* U+FF20 - U+FF27 : 0x11111119 */ - 1, /* U+FF28 - U+FF2F : 0x11111111 */ - 1, /* U+FF30 - U+FF37 : 0x11111111 */ - 22, /* U+FF38 - U+FF3F : 0x99999111 */ - 21, /* U+FF40 - U+FF47 : 0x11111119 */ - 1, /* U+FF48 - U+FF4F : 0x11111111 */ - 1, /* U+FF50 - U+FF57 : 0x11111111 */ - 22, /* U+FF58 - U+FF5F : 0x99999111 */ - 155, /* U+FF60 - U+FF67 : 0x11999999 */ - 1, /* U+FF68 - U+FF6F : 0x11111111 */ - 1, /* U+FF70 - U+FF77 : 0x11111111 */ - 1, /* U+FF78 - U+FF7F : 0x11111111 */ - 1, /* U+FF80 - U+FF87 : 0x11111111 */ - 1, /* U+FF88 - U+FF8F : 0x11111111 */ - 1, /* U+FF90 - U+FF97 : 0x11111111 */ - 1, /* U+FF98 - U+FF9F : 0x11111111 */ - 1, /* U+FFA0 - U+FFA7 : 0x11111111 */ - 1, /* U+FFA8 - U+FFAF : 0x11111111 */ - 1, /* U+FFB0 - U+FFB7 : 0x11111111 */ - 1, /* U+FFB8 - U+FFBF : 0x11111111 */ - 1, /* U+FFC0 - U+FFC7 : 0x11111111 */ - 1, /* U+FFC8 - U+FFCF : 0x11111111 */ - 1, /* U+FFD0 - U+FFD7 : 0x11111111 */ - 1, /* U+FFD8 - U+FFDF : 0x11111111 */ - 187, /* U+FFE0 - U+FFE7 : 0x17799977 */ - 93, /* U+FFE8 - U+FFEF : 0x19999999 */ - 1, /* U+FFF0 - U+FFF7 : 0x11111111 */ - 188, /* U+FFF8 - U+FFFF : 0x11999991 */ - 1, /* U+10000 - U+10007 : 0x11111111 */ - 1, /* U+10008 - U+1000F : 0x11111111 */ - 1, /* U+10010 - U+10017 : 0x11111111 */ - 1, /* U+10018 - U+1001F : 0x11111111 */ - 1, /* U+10020 - U+10027 : 0x11111111 */ - 1, /* U+10028 - U+1002F : 0x11111111 */ - 1, /* U+10030 - U+10037 : 0x11111111 */ - 1, /* U+10038 - U+1003F : 0x11111111 */ - 1, /* U+10040 - U+10047 : 0x11111111 */ - 1, /* U+10048 - U+1004F : 0x11111111 */ - 1, /* U+10050 - U+10057 : 0x11111111 */ - 1, /* U+10058 - U+1005F : 0x11111111 */ - 1, /* U+10060 - U+10067 : 0x11111111 */ - 1, /* U+10068 - U+1006F : 0x11111111 */ - 1, /* U+10070 - U+10077 : 0x11111111 */ - 1, /* U+10078 - U+1007F : 0x11111111 */ - 1, /* U+10080 - U+10087 : 0x11111111 */ - 1, /* U+10088 - U+1008F : 0x11111111 */ - 1, /* U+10090 - U+10097 : 0x11111111 */ - 1, /* U+10098 - U+1009F : 0x11111111 */ - 1, /* U+100A0 - U+100A7 : 0x11111111 */ - 1, /* U+100A8 - U+100AF : 0x11111111 */ - 1, /* U+100B0 - U+100B7 : 0x11111111 */ - 1, /* U+100B8 - U+100BF : 0x11111111 */ - 1, /* U+100C0 - U+100C7 : 0x11111111 */ - 1, /* U+100C8 - U+100CF : 0x11111111 */ - 1, /* U+100D0 - U+100D7 : 0x11111111 */ - 1, /* U+100D8 - U+100DF : 0x11111111 */ - 1, /* U+100E0 - U+100E7 : 0x11111111 */ - 1, /* U+100E8 - U+100EF : 0x11111111 */ - 1, /* U+100F0 - U+100F7 : 0x11111111 */ - 1, /* U+100F8 - U+100FF : 0x11111111 */ - 153, /* U+10100 - U+10107 : 0x11111191 */ - 1, /* U+10108 - U+1010F : 0x11111111 */ - 1, /* U+10110 - U+10117 : 0x11111111 */ - 1, /* U+10118 - U+1011F : 0x11111111 */ - 1, /* U+10120 - U+10127 : 0x11111111 */ - 1, /* U+10128 - U+1012F : 0x11111111 */ - 1, /* U+10130 - U+10137 : 0x11111111 */ - 1, /* U+10138 - U+1013F : 0x11111111 */ - 9, /* U+10140 - U+10147 : 0x99999999 */ - 9, /* U+10148 - U+1014F : 0x99999999 */ - 9, /* U+10150 - U+10157 : 0x99999999 */ - 9, /* U+10158 - U+1015F : 0x99999999 */ - 9, /* U+10160 - U+10167 : 0x99999999 */ - 9, /* U+10168 - U+1016F : 0x99999999 */ - 9, /* U+10170 - U+10177 : 0x99999999 */ - 9, /* U+10178 - U+1017F : 0x99999999 */ - 9, /* U+10180 - U+10187 : 0x99999999 */ - 158, /* U+10188 - U+1018F : 0x11111999 */ - 9, /* U+10190 - U+10197 : 0x99999999 */ - 157, /* U+10198 - U+1019F : 0x11119999 */ -}; - -static PRUint8 gBidiCatIdx6[6] = { - 1, /* U+101D0 - U+101D7 : 0x11111111 */ - 1, /* U+101D8 - U+101DF : 0x11111111 */ - 1, /* U+101E0 - U+101E7 : 0x11111111 */ - 1, /* U+101E8 - U+101EF : 0x11111111 */ - 1, /* U+101F0 - U+101F7 : 0x11111111 */ - 75, /* U+101F8 - U+101FF : 0x11A11111 */ -}; - -static PRUint8 gBidiCatIdx7[80] = { - 1, /* U+10280 - U+10287 : 0x11111111 */ - 1, /* U+10288 - U+1028F : 0x11111111 */ - 1, /* U+10290 - U+10297 : 0x11111111 */ - 1, /* U+10298 - U+1029F : 0x11111111 */ - 1, /* U+102A0 - U+102A7 : 0x11111111 */ - 1, /* U+102A8 - U+102AF : 0x11111111 */ - 1, /* U+102B0 - U+102B7 : 0x11111111 */ - 1, /* U+102B8 - U+102BF : 0x11111111 */ - 1, /* U+102C0 - U+102C7 : 0x11111111 */ - 1, /* U+102C8 - U+102CF : 0x11111111 */ - 1, /* U+102D0 - U+102D7 : 0x11111111 */ - 1, /* U+102D8 - U+102DF : 0x11111111 */ - 1, /* U+102E0 - U+102E7 : 0x11111111 */ - 1, /* U+102E8 - U+102EF : 0x11111111 */ - 1, /* U+102F0 - U+102F7 : 0x11111111 */ - 1, /* U+102F8 - U+102FF : 0x11111111 */ - 1, /* U+10300 - U+10307 : 0x11111111 */ - 1, /* U+10308 - U+1030F : 0x11111111 */ - 1, /* U+10310 - U+10317 : 0x11111111 */ - 1, /* U+10318 - U+1031F : 0x11111111 */ - 1, /* U+10320 - U+10327 : 0x11111111 */ - 1, /* U+10328 - U+1032F : 0x11111111 */ - 1, /* U+10330 - U+10337 : 0x11111111 */ - 1, /* U+10338 - U+1033F : 0x11111111 */ - 1, /* U+10340 - U+10347 : 0x11111111 */ - 1, /* U+10348 - U+1034F : 0x11111111 */ - 1, /* U+10350 - U+10357 : 0x11111111 */ - 1, /* U+10358 - U+1035F : 0x11111111 */ - 1, /* U+10360 - U+10367 : 0x11111111 */ - 1, /* U+10368 - U+1036F : 0x11111111 */ - 1, /* U+10370 - U+10377 : 0x11111111 */ - 1, /* U+10378 - U+1037F : 0x11111111 */ - 1, /* U+10380 - U+10387 : 0x11111111 */ - 1, /* U+10388 - U+1038F : 0x11111111 */ - 1, /* U+10390 - U+10397 : 0x11111111 */ - 1, /* U+10398 - U+1039F : 0x11111111 */ - 1, /* U+103A0 - U+103A7 : 0x11111111 */ - 1, /* U+103A8 - U+103AF : 0x11111111 */ - 1, /* U+103B0 - U+103B7 : 0x11111111 */ - 1, /* U+103B8 - U+103BF : 0x11111111 */ - 1, /* U+103C0 - U+103C7 : 0x11111111 */ - 1, /* U+103C8 - U+103CF : 0x11111111 */ - 1, /* U+103D0 - U+103D7 : 0x11111111 */ - 1, /* U+103D8 - U+103DF : 0x11111111 */ - 1, /* U+103E0 - U+103E7 : 0x11111111 */ - 1, /* U+103E8 - U+103EF : 0x11111111 */ - 1, /* U+103F0 - U+103F7 : 0x11111111 */ - 1, /* U+103F8 - U+103FF : 0x11111111 */ - 1, /* U+10400 - U+10407 : 0x11111111 */ - 1, /* U+10408 - U+1040F : 0x11111111 */ - 1, /* U+10410 - U+10417 : 0x11111111 */ - 1, /* U+10418 - U+1041F : 0x11111111 */ - 1, /* U+10420 - U+10427 : 0x11111111 */ - 1, /* U+10428 - U+1042F : 0x11111111 */ - 1, /* U+10430 - U+10437 : 0x11111111 */ - 1, /* U+10438 - U+1043F : 0x11111111 */ - 1, /* U+10440 - U+10447 : 0x11111111 */ - 1, /* U+10448 - U+1044F : 0x11111111 */ - 1, /* U+10450 - U+10457 : 0x11111111 */ - 1, /* U+10458 - U+1045F : 0x11111111 */ - 1, /* U+10460 - U+10467 : 0x11111111 */ - 1, /* U+10468 - U+1046F : 0x11111111 */ - 1, /* U+10470 - U+10477 : 0x11111111 */ - 1, /* U+10478 - U+1047F : 0x11111111 */ - 1, /* U+10480 - U+10487 : 0x11111111 */ - 1, /* U+10488 - U+1048F : 0x11111111 */ - 1, /* U+10490 - U+10497 : 0x11111111 */ - 1, /* U+10498 - U+1049F : 0x11111111 */ - 1, /* U+104A0 - U+104A7 : 0x11111111 */ - 1, /* U+104A8 - U+104AF : 0x11111111 */ - 1, /* U+104B0 - U+104B7 : 0x11111111 */ - 1, /* U+104B8 - U+104BF : 0x11111111 */ - 1, /* U+104C0 - U+104C7 : 0x11111111 */ - 1, /* U+104C8 - U+104CF : 0x11111111 */ - 1, /* U+104D0 - U+104D7 : 0x11111111 */ - 1, /* U+104D8 - U+104DF : 0x11111111 */ - 1, /* U+104E0 - U+104E7 : 0x11111111 */ - 1, /* U+104E8 - U+104EF : 0x11111111 */ - 1, /* U+104F0 - U+104F7 : 0x11111111 */ - 1, /* U+104F8 - U+104FF : 0x11111111 */ -}; - -static PRUint8 gBidiCatIdx8[12] = { - 2, /* U+10800 - U+10807 : 0x22222222 */ - 2, /* U+10808 - U+1080F : 0x22222222 */ - 2, /* U+10810 - U+10817 : 0x22222222 */ - 2, /* U+10818 - U+1081F : 0x22222222 */ - 2, /* U+10820 - U+10827 : 0x22222222 */ - 2, /* U+10828 - U+1082F : 0x22222222 */ - 2, /* U+10830 - U+10837 : 0x22222222 */ - 2, /* U+10838 - U+1083F : 0x22222222 */ - 2, /* U+10840 - U+10847 : 0x22222222 */ - 2, /* U+10848 - U+1084F : 0x22222222 */ - 2, /* U+10850 - U+10857 : 0x22222222 */ - 2, /* U+10858 - U+1085F : 0x22222222 */ -}; - -static PRUint8 gBidiCatIdx9[8] = { - 2, /* U+10900 - U+10907 : 0x22222222 */ - 2, /* U+10908 - U+1090F : 0x22222222 */ - 2, /* U+10910 - U+10917 : 0x22222222 */ - 189, /* U+10918 - U+1091F : 0x92222222 */ - 2, /* U+10920 - U+10927 : 0x22222222 */ - 2, /* U+10928 - U+1092F : 0x22222222 */ - 2, /* U+10930 - U+10937 : 0x22222222 */ - 2, /* U+10938 - U+1093F : 0x22222222 */ -}; - -static PRUint8 gBidiCatIdx10[32] = { - 2, /* U+10980 - U+10987 : 0x22222222 */ - 2, /* U+10988 - U+1098F : 0x22222222 */ - 2, /* U+10990 - U+10997 : 0x22222222 */ - 2, /* U+10998 - U+1099F : 0x22222222 */ - 2, /* U+109A0 - U+109A7 : 0x22222222 */ - 2, /* U+109A8 - U+109AF : 0x22222222 */ - 2, /* U+109B0 - U+109B7 : 0x22222222 */ - 2, /* U+109B8 - U+109BF : 0x22222222 */ - 2, /* U+109C0 - U+109C7 : 0x22222222 */ - 2, /* U+109C8 - U+109CF : 0x22222222 */ - 2, /* U+109D0 - U+109D7 : 0x22222222 */ - 2, /* U+109D8 - U+109DF : 0x22222222 */ - 2, /* U+109E0 - U+109E7 : 0x22222222 */ - 2, /* U+109E8 - U+109EF : 0x22222222 */ - 2, /* U+109F0 - U+109F7 : 0x22222222 */ - 2, /* U+109F8 - U+109FF : 0x22222222 */ - 190, /* U+10A00 - U+10A07 : 0x2AA2AAA2 */ - 65, /* U+10A08 - U+10A0F : 0xAAAA2222 */ - 2, /* U+10A10 - U+10A17 : 0x22222222 */ - 2, /* U+10A18 - U+10A1F : 0x22222222 */ - 2, /* U+10A20 - U+10A27 : 0x22222222 */ - 2, /* U+10A28 - U+10A2F : 0x22222222 */ - 2, /* U+10A30 - U+10A37 : 0x22222222 */ - 191, /* U+10A38 - U+10A3F : 0xA2222AAA */ - 2, /* U+10A40 - U+10A47 : 0x22222222 */ - 2, /* U+10A48 - U+10A4F : 0x22222222 */ - 2, /* U+10A50 - U+10A57 : 0x22222222 */ - 2, /* U+10A58 - U+10A5F : 0x22222222 */ - 2, /* U+10A60 - U+10A67 : 0x22222222 */ - 2, /* U+10A68 - U+10A6F : 0x22222222 */ - 2, /* U+10A70 - U+10A77 : 0x22222222 */ - 2, /* U+10A78 - U+10A7F : 0x22222222 */ -}; - -static PRUint8 gBidiCatIdx11[16] = { - 2, /* U+10B00 - U+10B07 : 0x22222222 */ - 2, /* U+10B08 - U+10B0F : 0x22222222 */ - 2, /* U+10B10 - U+10B17 : 0x22222222 */ - 2, /* U+10B18 - U+10B1F : 0x22222222 */ - 2, /* U+10B20 - U+10B27 : 0x22222222 */ - 2, /* U+10B28 - U+10B2F : 0x22222222 */ - 2, /* U+10B30 - U+10B37 : 0x22222222 */ - 192, /* U+10B38 - U+10B3F : 0x99999992 */ - 2, /* U+10B40 - U+10B47 : 0x22222222 */ - 2, /* U+10B48 - U+10B4F : 0x22222222 */ - 2, /* U+10B50 - U+10B57 : 0x22222222 */ - 2, /* U+10B58 - U+10B5F : 0x22222222 */ - 2, /* U+10B60 - U+10B67 : 0x22222222 */ - 2, /* U+10B68 - U+10B6F : 0x22222222 */ - 2, /* U+10B70 - U+10B77 : 0x22222222 */ - 2, /* U+10B78 - U+10B7F : 0x22222222 */ -}; - -static PRUint8 gBidiCatIdx12[10] = { - 2, /* U+10C00 - U+10C07 : 0x22222222 */ - 2, /* U+10C08 - U+10C0F : 0x22222222 */ - 2, /* U+10C10 - U+10C17 : 0x22222222 */ - 2, /* U+10C18 - U+10C1F : 0x22222222 */ - 2, /* U+10C20 - U+10C27 : 0x22222222 */ - 2, /* U+10C28 - U+10C2F : 0x22222222 */ - 2, /* U+10C30 - U+10C37 : 0x22222222 */ - 2, /* U+10C38 - U+10C3F : 0x22222222 */ - 2, /* U+10C40 - U+10C47 : 0x22222222 */ - 2, /* U+10C48 - U+10C4F : 0x22222222 */ -}; - -static PRUint8 gBidiCatIdx13[4] = { - 4, /* U+10E60 - U+10E67 : 0x44444444 */ - 4, /* U+10E68 - U+10E6F : 0x44444444 */ - 4, /* U+10E70 - U+10E77 : 0x44444444 */ - 193, /* U+10E78 - U+10E7F : 0x24444444 */ -}; - -static PRUint8 gBidiCatIdx14[64] = { - 72, /* U+11000 - U+11007 : 0x111111A1 */ - 1, /* U+11008 - U+1100F : 0x11111111 */ - 1, /* U+11010 - U+11017 : 0x11111111 */ - 1, /* U+11018 - U+1101F : 0x11111111 */ - 1, /* U+11020 - U+11027 : 0x11111111 */ - 1, /* U+11028 - U+1102F : 0x11111111 */ - 1, /* U+11030 - U+11037 : 0x11111111 */ - 10, /* U+11038 - U+1103F : 0xAAAAAAAA */ - 99, /* U+11040 - U+11047 : 0x1AAAAAAA */ - 1, /* U+11048 - U+1104F : 0x11111111 */ - 31, /* U+11050 - U+11057 : 0x99999911 */ - 9, /* U+11058 - U+1105F : 0x99999999 */ - 155, /* U+11060 - U+11067 : 0x11999999 */ - 1, /* U+11068 - U+1106F : 0x11111111 */ - 1, /* U+11070 - U+11077 : 0x11111111 */ - 1, /* U+11078 - U+1107F : 0x11111111 */ - 38, /* U+11080 - U+11087 : 0x111111AA */ - 1, /* U+11088 - U+1108F : 0x11111111 */ - 1, /* U+11090 - U+11097 : 0x11111111 */ - 1, /* U+11098 - U+1109F : 0x11111111 */ - 1, /* U+110A0 - U+110A7 : 0x11111111 */ - 1, /* U+110A8 - U+110AF : 0x11111111 */ - 194, /* U+110B0 - U+110B7 : 0x1AAAA111 */ - 78, /* U+110B8 - U+110BF : 0x11111AA1 */ - 1, /* U+110C0 - U+110C7 : 0x11111111 */ - 1, /* U+110C8 - U+110CF : 0x11111111 */ - 1, /* U+110D0 - U+110D7 : 0x11111111 */ - 1, /* U+110D8 - U+110DF : 0x11111111 */ - 1, /* U+110E0 - U+110E7 : 0x11111111 */ - 1, /* U+110E8 - U+110EF : 0x11111111 */ - 1, /* U+110F0 - U+110F7 : 0x11111111 */ - 1, /* U+110F8 - U+110FF : 0x11111111 */ - 67, /* U+11100 - U+11107 : 0x11111AAA */ - 1, /* U+11108 - U+1110F : 0x11111111 */ - 1, /* U+11110 - U+11117 : 0x11111111 */ - 1, /* U+11118 - U+1111F : 0x11111111 */ - 98, /* U+11120 - U+11127 : 0xA1111111 */ - 195, /* U+11128 - U+1112F : 0xAAA1AAAA */ - 106, /* U+11130 - U+11137 : 0x111AAAAA */ - 1, /* U+11138 - U+1113F : 0x11111111 */ - 1, /* U+11140 - U+11147 : 0x11111111 */ - 1, /* U+11148 - U+1114F : 0x11111111 */ - 1, /* U+11150 - U+11157 : 0x11111111 */ - 1, /* U+11158 - U+1115F : 0x11111111 */ - 1, /* U+11160 - U+11167 : 0x11111111 */ - 1, /* U+11168 - U+1116F : 0x11111111 */ - 1, /* U+11170 - U+11177 : 0x11111111 */ - 1, /* U+11178 - U+1117F : 0x11111111 */ - 38, /* U+11180 - U+11187 : 0x111111AA */ - 1, /* U+11188 - U+1118F : 0x11111111 */ - 1, /* U+11190 - U+11197 : 0x11111111 */ - 1, /* U+11198 - U+1119F : 0x11111111 */ - 1, /* U+111A0 - U+111A7 : 0x11111111 */ - 1, /* U+111A8 - U+111AF : 0x11111111 */ - 89, /* U+111B0 - U+111B7 : 0xAA111111 */ - 99, /* U+111B8 - U+111BF : 0x1AAAAAAA */ - 1, /* U+111C0 - U+111C7 : 0x11111111 */ - 1, /* U+111C8 - U+111CF : 0x11111111 */ - 1, /* U+111D0 - U+111D7 : 0x11111111 */ - 1, /* U+111D8 - U+111DF : 0x11111111 */ - 1, /* U+111E0 - U+111E7 : 0x11111111 */ - 1, /* U+111E8 - U+111EF : 0x11111111 */ - 1, /* U+111F0 - U+111F7 : 0x11111111 */ - 1, /* U+111F8 - U+111FF : 0x11111111 */ -}; - -static PRUint8 gBidiCatIdx15[16] = { - 1, /* U+11680 - U+11687 : 0x11111111 */ - 1, /* U+11688 - U+1168F : 0x11111111 */ - 1, /* U+11690 - U+11697 : 0x11111111 */ - 1, /* U+11698 - U+1169F : 0x11111111 */ - 1, /* U+116A0 - U+116A7 : 0x11111111 */ - 196, /* U+116A8 - U+116AF : 0x11A1A111 */ - 197, /* U+116B0 - U+116B7 : 0xA1AAAAAA */ - 1, /* U+116B8 - U+116BF : 0x11111111 */ - 1, /* U+116C0 - U+116C7 : 0x11111111 */ - 1, /* U+116C8 - U+116CF : 0x11111111 */ - 1, /* U+116D0 - U+116D7 : 0x11111111 */ - 1, /* U+116D8 - U+116DF : 0x11111111 */ - 1, /* U+116E0 - U+116E7 : 0x11111111 */ - 1, /* U+116E8 - U+116EF : 0x11111111 */ - 1, /* U+116F0 - U+116F7 : 0x11111111 */ - 1, /* U+116F8 - U+116FF : 0x11111111 */ -}; - -static PRUint8 gBidiCatIdx16[144] = { - 1, /* U+12000 - U+12007 : 0x11111111 */ - 1, /* U+12008 - U+1200F : 0x11111111 */ - 1, /* U+12010 - U+12017 : 0x11111111 */ - 1, /* U+12018 - U+1201F : 0x11111111 */ - 1, /* U+12020 - U+12027 : 0x11111111 */ - 1, /* U+12028 - U+1202F : 0x11111111 */ - 1, /* U+12030 - U+12037 : 0x11111111 */ - 1, /* U+12038 - U+1203F : 0x11111111 */ - 1, /* U+12040 - U+12047 : 0x11111111 */ - 1, /* U+12048 - U+1204F : 0x11111111 */ - 1, /* U+12050 - U+12057 : 0x11111111 */ - 1, /* U+12058 - U+1205F : 0x11111111 */ - 1, /* U+12060 - U+12067 : 0x11111111 */ - 1, /* U+12068 - U+1206F : 0x11111111 */ - 1, /* U+12070 - U+12077 : 0x11111111 */ - 1, /* U+12078 - U+1207F : 0x11111111 */ - 1, /* U+12080 - U+12087 : 0x11111111 */ - 1, /* U+12088 - U+1208F : 0x11111111 */ - 1, /* U+12090 - U+12097 : 0x11111111 */ - 1, /* U+12098 - U+1209F : 0x11111111 */ - 1, /* U+120A0 - U+120A7 : 0x11111111 */ - 1, /* U+120A8 - U+120AF : 0x11111111 */ - 1, /* U+120B0 - U+120B7 : 0x11111111 */ - 1, /* U+120B8 - U+120BF : 0x11111111 */ - 1, /* U+120C0 - U+120C7 : 0x11111111 */ - 1, /* U+120C8 - U+120CF : 0x11111111 */ - 1, /* U+120D0 - U+120D7 : 0x11111111 */ - 1, /* U+120D8 - U+120DF : 0x11111111 */ - 1, /* U+120E0 - U+120E7 : 0x11111111 */ - 1, /* U+120E8 - U+120EF : 0x11111111 */ - 1, /* U+120F0 - U+120F7 : 0x11111111 */ - 1, /* U+120F8 - U+120FF : 0x11111111 */ - 1, /* U+12100 - U+12107 : 0x11111111 */ - 1, /* U+12108 - U+1210F : 0x11111111 */ - 1, /* U+12110 - U+12117 : 0x11111111 */ - 1, /* U+12118 - U+1211F : 0x11111111 */ - 1, /* U+12120 - U+12127 : 0x11111111 */ - 1, /* U+12128 - U+1212F : 0x11111111 */ - 1, /* U+12130 - U+12137 : 0x11111111 */ - 1, /* U+12138 - U+1213F : 0x11111111 */ - 1, /* U+12140 - U+12147 : 0x11111111 */ - 1, /* U+12148 - U+1214F : 0x11111111 */ - 1, /* U+12150 - U+12157 : 0x11111111 */ - 1, /* U+12158 - U+1215F : 0x11111111 */ - 1, /* U+12160 - U+12167 : 0x11111111 */ - 1, /* U+12168 - U+1216F : 0x11111111 */ - 1, /* U+12170 - U+12177 : 0x11111111 */ - 1, /* U+12178 - U+1217F : 0x11111111 */ - 1, /* U+12180 - U+12187 : 0x11111111 */ - 1, /* U+12188 - U+1218F : 0x11111111 */ - 1, /* U+12190 - U+12197 : 0x11111111 */ - 1, /* U+12198 - U+1219F : 0x11111111 */ - 1, /* U+121A0 - U+121A7 : 0x11111111 */ - 1, /* U+121A8 - U+121AF : 0x11111111 */ - 1, /* U+121B0 - U+121B7 : 0x11111111 */ - 1, /* U+121B8 - U+121BF : 0x11111111 */ - 1, /* U+121C0 - U+121C7 : 0x11111111 */ - 1, /* U+121C8 - U+121CF : 0x11111111 */ - 1, /* U+121D0 - U+121D7 : 0x11111111 */ - 1, /* U+121D8 - U+121DF : 0x11111111 */ - 1, /* U+121E0 - U+121E7 : 0x11111111 */ - 1, /* U+121E8 - U+121EF : 0x11111111 */ - 1, /* U+121F0 - U+121F7 : 0x11111111 */ - 1, /* U+121F8 - U+121FF : 0x11111111 */ - 1, /* U+12200 - U+12207 : 0x11111111 */ - 1, /* U+12208 - U+1220F : 0x11111111 */ - 1, /* U+12210 - U+12217 : 0x11111111 */ - 1, /* U+12218 - U+1221F : 0x11111111 */ - 1, /* U+12220 - U+12227 : 0x11111111 */ - 1, /* U+12228 - U+1222F : 0x11111111 */ - 1, /* U+12230 - U+12237 : 0x11111111 */ - 1, /* U+12238 - U+1223F : 0x11111111 */ - 1, /* U+12240 - U+12247 : 0x11111111 */ - 1, /* U+12248 - U+1224F : 0x11111111 */ - 1, /* U+12250 - U+12257 : 0x11111111 */ - 1, /* U+12258 - U+1225F : 0x11111111 */ - 1, /* U+12260 - U+12267 : 0x11111111 */ - 1, /* U+12268 - U+1226F : 0x11111111 */ - 1, /* U+12270 - U+12277 : 0x11111111 */ - 1, /* U+12278 - U+1227F : 0x11111111 */ - 1, /* U+12280 - U+12287 : 0x11111111 */ - 1, /* U+12288 - U+1228F : 0x11111111 */ - 1, /* U+12290 - U+12297 : 0x11111111 */ - 1, /* U+12298 - U+1229F : 0x11111111 */ - 1, /* U+122A0 - U+122A7 : 0x11111111 */ - 1, /* U+122A8 - U+122AF : 0x11111111 */ - 1, /* U+122B0 - U+122B7 : 0x11111111 */ - 1, /* U+122B8 - U+122BF : 0x11111111 */ - 1, /* U+122C0 - U+122C7 : 0x11111111 */ - 1, /* U+122C8 - U+122CF : 0x11111111 */ - 1, /* U+122D0 - U+122D7 : 0x11111111 */ - 1, /* U+122D8 - U+122DF : 0x11111111 */ - 1, /* U+122E0 - U+122E7 : 0x11111111 */ - 1, /* U+122E8 - U+122EF : 0x11111111 */ - 1, /* U+122F0 - U+122F7 : 0x11111111 */ - 1, /* U+122F8 - U+122FF : 0x11111111 */ - 1, /* U+12300 - U+12307 : 0x11111111 */ - 1, /* U+12308 - U+1230F : 0x11111111 */ - 1, /* U+12310 - U+12317 : 0x11111111 */ - 1, /* U+12318 - U+1231F : 0x11111111 */ - 1, /* U+12320 - U+12327 : 0x11111111 */ - 1, /* U+12328 - U+1232F : 0x11111111 */ - 1, /* U+12330 - U+12337 : 0x11111111 */ - 1, /* U+12338 - U+1233F : 0x11111111 */ - 1, /* U+12340 - U+12347 : 0x11111111 */ - 1, /* U+12348 - U+1234F : 0x11111111 */ - 1, /* U+12350 - U+12357 : 0x11111111 */ - 1, /* U+12358 - U+1235F : 0x11111111 */ - 1, /* U+12360 - U+12367 : 0x11111111 */ - 1, /* U+12368 - U+1236F : 0x11111111 */ - 1, /* U+12370 - U+12377 : 0x11111111 */ - 1, /* U+12378 - U+1237F : 0x11111111 */ - 1, /* U+12380 - U+12387 : 0x11111111 */ - 1, /* U+12388 - U+1238F : 0x11111111 */ - 1, /* U+12390 - U+12397 : 0x11111111 */ - 1, /* U+12398 - U+1239F : 0x11111111 */ - 1, /* U+123A0 - U+123A7 : 0x11111111 */ - 1, /* U+123A8 - U+123AF : 0x11111111 */ - 1, /* U+123B0 - U+123B7 : 0x11111111 */ - 1, /* U+123B8 - U+123BF : 0x11111111 */ - 1, /* U+123C0 - U+123C7 : 0x11111111 */ - 1, /* U+123C8 - U+123CF : 0x11111111 */ - 1, /* U+123D0 - U+123D7 : 0x11111111 */ - 1, /* U+123D8 - U+123DF : 0x11111111 */ - 1, /* U+123E0 - U+123E7 : 0x11111111 */ - 1, /* U+123E8 - U+123EF : 0x11111111 */ - 1, /* U+123F0 - U+123F7 : 0x11111111 */ - 1, /* U+123F8 - U+123FF : 0x11111111 */ - 1, /* U+12400 - U+12407 : 0x11111111 */ - 1, /* U+12408 - U+1240F : 0x11111111 */ - 1, /* U+12410 - U+12417 : 0x11111111 */ - 1, /* U+12418 - U+1241F : 0x11111111 */ - 1, /* U+12420 - U+12427 : 0x11111111 */ - 1, /* U+12428 - U+1242F : 0x11111111 */ - 1, /* U+12430 - U+12437 : 0x11111111 */ - 1, /* U+12438 - U+1243F : 0x11111111 */ - 1, /* U+12440 - U+12447 : 0x11111111 */ - 1, /* U+12448 - U+1244F : 0x11111111 */ - 1, /* U+12450 - U+12457 : 0x11111111 */ - 1, /* U+12458 - U+1245F : 0x11111111 */ - 1, /* U+12460 - U+12467 : 0x11111111 */ - 1, /* U+12468 - U+1246F : 0x11111111 */ - 1, /* U+12470 - U+12477 : 0x11111111 */ - 1, /* U+12478 - U+1247F : 0x11111111 */ -}; - -static PRUint8 gBidiCatIdx17[134] = { - 1, /* U+13000 - U+13007 : 0x11111111 */ - 1, /* U+13008 - U+1300F : 0x11111111 */ - 1, /* U+13010 - U+13017 : 0x11111111 */ - 1, /* U+13018 - U+1301F : 0x11111111 */ - 1, /* U+13020 - U+13027 : 0x11111111 */ - 1, /* U+13028 - U+1302F : 0x11111111 */ - 1, /* U+13030 - U+13037 : 0x11111111 */ - 1, /* U+13038 - U+1303F : 0x11111111 */ - 1, /* U+13040 - U+13047 : 0x11111111 */ - 1, /* U+13048 - U+1304F : 0x11111111 */ - 1, /* U+13050 - U+13057 : 0x11111111 */ - 1, /* U+13058 - U+1305F : 0x11111111 */ - 1, /* U+13060 - U+13067 : 0x11111111 */ - 1, /* U+13068 - U+1306F : 0x11111111 */ - 1, /* U+13070 - U+13077 : 0x11111111 */ - 1, /* U+13078 - U+1307F : 0x11111111 */ - 1, /* U+13080 - U+13087 : 0x11111111 */ - 1, /* U+13088 - U+1308F : 0x11111111 */ - 1, /* U+13090 - U+13097 : 0x11111111 */ - 1, /* U+13098 - U+1309F : 0x11111111 */ - 1, /* U+130A0 - U+130A7 : 0x11111111 */ - 1, /* U+130A8 - U+130AF : 0x11111111 */ - 1, /* U+130B0 - U+130B7 : 0x11111111 */ - 1, /* U+130B8 - U+130BF : 0x11111111 */ - 1, /* U+130C0 - U+130C7 : 0x11111111 */ - 1, /* U+130C8 - U+130CF : 0x11111111 */ - 1, /* U+130D0 - U+130D7 : 0x11111111 */ - 1, /* U+130D8 - U+130DF : 0x11111111 */ - 1, /* U+130E0 - U+130E7 : 0x11111111 */ - 1, /* U+130E8 - U+130EF : 0x11111111 */ - 1, /* U+130F0 - U+130F7 : 0x11111111 */ - 1, /* U+130F8 - U+130FF : 0x11111111 */ - 1, /* U+13100 - U+13107 : 0x11111111 */ - 1, /* U+13108 - U+1310F : 0x11111111 */ - 1, /* U+13110 - U+13117 : 0x11111111 */ - 1, /* U+13118 - U+1311F : 0x11111111 */ - 1, /* U+13120 - U+13127 : 0x11111111 */ - 1, /* U+13128 - U+1312F : 0x11111111 */ - 1, /* U+13130 - U+13137 : 0x11111111 */ - 1, /* U+13138 - U+1313F : 0x11111111 */ - 1, /* U+13140 - U+13147 : 0x11111111 */ - 1, /* U+13148 - U+1314F : 0x11111111 */ - 1, /* U+13150 - U+13157 : 0x11111111 */ - 1, /* U+13158 - U+1315F : 0x11111111 */ - 1, /* U+13160 - U+13167 : 0x11111111 */ - 1, /* U+13168 - U+1316F : 0x11111111 */ - 1, /* U+13170 - U+13177 : 0x11111111 */ - 1, /* U+13178 - U+1317F : 0x11111111 */ - 1, /* U+13180 - U+13187 : 0x11111111 */ - 1, /* U+13188 - U+1318F : 0x11111111 */ - 1, /* U+13190 - U+13197 : 0x11111111 */ - 1, /* U+13198 - U+1319F : 0x11111111 */ - 1, /* U+131A0 - U+131A7 : 0x11111111 */ - 1, /* U+131A8 - U+131AF : 0x11111111 */ - 1, /* U+131B0 - U+131B7 : 0x11111111 */ - 1, /* U+131B8 - U+131BF : 0x11111111 */ - 1, /* U+131C0 - U+131C7 : 0x11111111 */ - 1, /* U+131C8 - U+131CF : 0x11111111 */ - 1, /* U+131D0 - U+131D7 : 0x11111111 */ - 1, /* U+131D8 - U+131DF : 0x11111111 */ - 1, /* U+131E0 - U+131E7 : 0x11111111 */ - 1, /* U+131E8 - U+131EF : 0x11111111 */ - 1, /* U+131F0 - U+131F7 : 0x11111111 */ - 1, /* U+131F8 - U+131FF : 0x11111111 */ - 1, /* U+13200 - U+13207 : 0x11111111 */ - 1, /* U+13208 - U+1320F : 0x11111111 */ - 1, /* U+13210 - U+13217 : 0x11111111 */ - 1, /* U+13218 - U+1321F : 0x11111111 */ - 1, /* U+13220 - U+13227 : 0x11111111 */ - 1, /* U+13228 - U+1322F : 0x11111111 */ - 1, /* U+13230 - U+13237 : 0x11111111 */ - 1, /* U+13238 - U+1323F : 0x11111111 */ - 1, /* U+13240 - U+13247 : 0x11111111 */ - 1, /* U+13248 - U+1324F : 0x11111111 */ - 1, /* U+13250 - U+13257 : 0x11111111 */ - 1, /* U+13258 - U+1325F : 0x11111111 */ - 1, /* U+13260 - U+13267 : 0x11111111 */ - 1, /* U+13268 - U+1326F : 0x11111111 */ - 1, /* U+13270 - U+13277 : 0x11111111 */ - 1, /* U+13278 - U+1327F : 0x11111111 */ - 1, /* U+13280 - U+13287 : 0x11111111 */ - 1, /* U+13288 - U+1328F : 0x11111111 */ - 1, /* U+13290 - U+13297 : 0x11111111 */ - 1, /* U+13298 - U+1329F : 0x11111111 */ - 1, /* U+132A0 - U+132A7 : 0x11111111 */ - 1, /* U+132A8 - U+132AF : 0x11111111 */ - 1, /* U+132B0 - U+132B7 : 0x11111111 */ - 1, /* U+132B8 - U+132BF : 0x11111111 */ - 1, /* U+132C0 - U+132C7 : 0x11111111 */ - 1, /* U+132C8 - U+132CF : 0x11111111 */ - 1, /* U+132D0 - U+132D7 : 0x11111111 */ - 1, /* U+132D8 - U+132DF : 0x11111111 */ - 1, /* U+132E0 - U+132E7 : 0x11111111 */ - 1, /* U+132E8 - U+132EF : 0x11111111 */ - 1, /* U+132F0 - U+132F7 : 0x11111111 */ - 1, /* U+132F8 - U+132FF : 0x11111111 */ - 1, /* U+13300 - U+13307 : 0x11111111 */ - 1, /* U+13308 - U+1330F : 0x11111111 */ - 1, /* U+13310 - U+13317 : 0x11111111 */ - 1, /* U+13318 - U+1331F : 0x11111111 */ - 1, /* U+13320 - U+13327 : 0x11111111 */ - 1, /* U+13328 - U+1332F : 0x11111111 */ - 1, /* U+13330 - U+13337 : 0x11111111 */ - 1, /* U+13338 - U+1333F : 0x11111111 */ - 1, /* U+13340 - U+13347 : 0x11111111 */ - 1, /* U+13348 - U+1334F : 0x11111111 */ - 1, /* U+13350 - U+13357 : 0x11111111 */ - 1, /* U+13358 - U+1335F : 0x11111111 */ - 1, /* U+13360 - U+13367 : 0x11111111 */ - 1, /* U+13368 - U+1336F : 0x11111111 */ - 1, /* U+13370 - U+13377 : 0x11111111 */ - 1, /* U+13378 - U+1337F : 0x11111111 */ - 1, /* U+13380 - U+13387 : 0x11111111 */ - 1, /* U+13388 - U+1338F : 0x11111111 */ - 1, /* U+13390 - U+13397 : 0x11111111 */ - 1, /* U+13398 - U+1339F : 0x11111111 */ - 1, /* U+133A0 - U+133A7 : 0x11111111 */ - 1, /* U+133A8 - U+133AF : 0x11111111 */ - 1, /* U+133B0 - U+133B7 : 0x11111111 */ - 1, /* U+133B8 - U+133BF : 0x11111111 */ - 1, /* U+133C0 - U+133C7 : 0x11111111 */ - 1, /* U+133C8 - U+133CF : 0x11111111 */ - 1, /* U+133D0 - U+133D7 : 0x11111111 */ - 1, /* U+133D8 - U+133DF : 0x11111111 */ - 1, /* U+133E0 - U+133E7 : 0x11111111 */ - 1, /* U+133E8 - U+133EF : 0x11111111 */ - 1, /* U+133F0 - U+133F7 : 0x11111111 */ - 1, /* U+133F8 - U+133FF : 0x11111111 */ - 1, /* U+13400 - U+13407 : 0x11111111 */ - 1, /* U+13408 - U+1340F : 0x11111111 */ - 1, /* U+13410 - U+13417 : 0x11111111 */ - 1, /* U+13418 - U+1341F : 0x11111111 */ - 1, /* U+13420 - U+13427 : 0x11111111 */ - 1, /* U+13428 - U+1342F : 0x11111111 */ -}; - -static PRUint8 gBidiCatIdx18[72] = { - 1, /* U+16800 - U+16807 : 0x11111111 */ - 1, /* U+16808 - U+1680F : 0x11111111 */ - 1, /* U+16810 - U+16817 : 0x11111111 */ - 1, /* U+16818 - U+1681F : 0x11111111 */ - 1, /* U+16820 - U+16827 : 0x11111111 */ - 1, /* U+16828 - U+1682F : 0x11111111 */ - 1, /* U+16830 - U+16837 : 0x11111111 */ - 1, /* U+16838 - U+1683F : 0x11111111 */ - 1, /* U+16840 - U+16847 : 0x11111111 */ - 1, /* U+16848 - U+1684F : 0x11111111 */ - 1, /* U+16850 - U+16857 : 0x11111111 */ - 1, /* U+16858 - U+1685F : 0x11111111 */ - 1, /* U+16860 - U+16867 : 0x11111111 */ - 1, /* U+16868 - U+1686F : 0x11111111 */ - 1, /* U+16870 - U+16877 : 0x11111111 */ - 1, /* U+16878 - U+1687F : 0x11111111 */ - 1, /* U+16880 - U+16887 : 0x11111111 */ - 1, /* U+16888 - U+1688F : 0x11111111 */ - 1, /* U+16890 - U+16897 : 0x11111111 */ - 1, /* U+16898 - U+1689F : 0x11111111 */ - 1, /* U+168A0 - U+168A7 : 0x11111111 */ - 1, /* U+168A8 - U+168AF : 0x11111111 */ - 1, /* U+168B0 - U+168B7 : 0x11111111 */ - 1, /* U+168B8 - U+168BF : 0x11111111 */ - 1, /* U+168C0 - U+168C7 : 0x11111111 */ - 1, /* U+168C8 - U+168CF : 0x11111111 */ - 1, /* U+168D0 - U+168D7 : 0x11111111 */ - 1, /* U+168D8 - U+168DF : 0x11111111 */ - 1, /* U+168E0 - U+168E7 : 0x11111111 */ - 1, /* U+168E8 - U+168EF : 0x11111111 */ - 1, /* U+168F0 - U+168F7 : 0x11111111 */ - 1, /* U+168F8 - U+168FF : 0x11111111 */ - 1, /* U+16900 - U+16907 : 0x11111111 */ - 1, /* U+16908 - U+1690F : 0x11111111 */ - 1, /* U+16910 - U+16917 : 0x11111111 */ - 1, /* U+16918 - U+1691F : 0x11111111 */ - 1, /* U+16920 - U+16927 : 0x11111111 */ - 1, /* U+16928 - U+1692F : 0x11111111 */ - 1, /* U+16930 - U+16937 : 0x11111111 */ - 1, /* U+16938 - U+1693F : 0x11111111 */ - 1, /* U+16940 - U+16947 : 0x11111111 */ - 1, /* U+16948 - U+1694F : 0x11111111 */ - 1, /* U+16950 - U+16957 : 0x11111111 */ - 1, /* U+16958 - U+1695F : 0x11111111 */ - 1, /* U+16960 - U+16967 : 0x11111111 */ - 1, /* U+16968 - U+1696F : 0x11111111 */ - 1, /* U+16970 - U+16977 : 0x11111111 */ - 1, /* U+16978 - U+1697F : 0x11111111 */ - 1, /* U+16980 - U+16987 : 0x11111111 */ - 1, /* U+16988 - U+1698F : 0x11111111 */ - 1, /* U+16990 - U+16997 : 0x11111111 */ - 1, /* U+16998 - U+1699F : 0x11111111 */ - 1, /* U+169A0 - U+169A7 : 0x11111111 */ - 1, /* U+169A8 - U+169AF : 0x11111111 */ - 1, /* U+169B0 - U+169B7 : 0x11111111 */ - 1, /* U+169B8 - U+169BF : 0x11111111 */ - 1, /* U+169C0 - U+169C7 : 0x11111111 */ - 1, /* U+169C8 - U+169CF : 0x11111111 */ - 1, /* U+169D0 - U+169D7 : 0x11111111 */ - 1, /* U+169D8 - U+169DF : 0x11111111 */ - 1, /* U+169E0 - U+169E7 : 0x11111111 */ - 1, /* U+169E8 - U+169EF : 0x11111111 */ - 1, /* U+169F0 - U+169F7 : 0x11111111 */ - 1, /* U+169F8 - U+169FF : 0x11111111 */ - 1, /* U+16A00 - U+16A07 : 0x11111111 */ - 1, /* U+16A08 - U+16A0F : 0x11111111 */ - 1, /* U+16A10 - U+16A17 : 0x11111111 */ - 1, /* U+16A18 - U+16A1F : 0x11111111 */ - 1, /* U+16A20 - U+16A27 : 0x11111111 */ - 1, /* U+16A28 - U+16A2F : 0x11111111 */ - 1, /* U+16A30 - U+16A37 : 0x11111111 */ - 1, /* U+16A38 - U+16A3F : 0x11111111 */ -}; - -static PRUint8 gBidiCatIdx19[32] = { - 1, /* U+16F00 - U+16F07 : 0x11111111 */ - 1, /* U+16F08 - U+16F0F : 0x11111111 */ - 1, /* U+16F10 - U+16F17 : 0x11111111 */ - 1, /* U+16F18 - U+16F1F : 0x11111111 */ - 1, /* U+16F20 - U+16F27 : 0x11111111 */ - 1, /* U+16F28 - U+16F2F : 0x11111111 */ - 1, /* U+16F30 - U+16F37 : 0x11111111 */ - 1, /* U+16F38 - U+16F3F : 0x11111111 */ - 1, /* U+16F40 - U+16F47 : 0x11111111 */ - 1, /* U+16F48 - U+16F4F : 0x11111111 */ - 1, /* U+16F50 - U+16F57 : 0x11111111 */ - 1, /* U+16F58 - U+16F5F : 0x11111111 */ - 1, /* U+16F60 - U+16F67 : 0x11111111 */ - 1, /* U+16F68 - U+16F6F : 0x11111111 */ - 1, /* U+16F70 - U+16F77 : 0x11111111 */ - 1, /* U+16F78 - U+16F7F : 0x11111111 */ - 1, /* U+16F80 - U+16F87 : 0x11111111 */ - 98, /* U+16F88 - U+16F8F : 0xA1111111 */ - 67, /* U+16F90 - U+16F97 : 0x11111AAA */ - 1, /* U+16F98 - U+16F9F : 0x11111111 */ - 1, /* U+16FA0 - U+16FA7 : 0x11111111 */ - 1, /* U+16FA8 - U+16FAF : 0x11111111 */ - 1, /* U+16FB0 - U+16FB7 : 0x11111111 */ - 1, /* U+16FB8 - U+16FBF : 0x11111111 */ - 1, /* U+16FC0 - U+16FC7 : 0x11111111 */ - 1, /* U+16FC8 - U+16FCF : 0x11111111 */ - 1, /* U+16FD0 - U+16FD7 : 0x11111111 */ - 1, /* U+16FD8 - U+16FDF : 0x11111111 */ - 1, /* U+16FE0 - U+16FE7 : 0x11111111 */ - 1, /* U+16FE8 - U+16FEF : 0x11111111 */ - 1, /* U+16FF0 - U+16FF7 : 0x11111111 */ - 1, /* U+16FF8 - U+16FFF : 0x11111111 */ -}; - -static PRUint8 gBidiCatIdx20[2] = { - 1, /* U+1B000 - U+1B007 : 0x11111111 */ - 1, /* U+1B008 - U+1B00F : 0x11111111 */ -}; - -static PRUint8 gBidiCatIdx21[256] = { - 1, /* U+1D000 - U+1D007 : 0x11111111 */ - 1, /* U+1D008 - U+1D00F : 0x11111111 */ - 1, /* U+1D010 - U+1D017 : 0x11111111 */ - 1, /* U+1D018 - U+1D01F : 0x11111111 */ - 1, /* U+1D020 - U+1D027 : 0x11111111 */ - 1, /* U+1D028 - U+1D02F : 0x11111111 */ - 1, /* U+1D030 - U+1D037 : 0x11111111 */ - 1, /* U+1D038 - U+1D03F : 0x11111111 */ - 1, /* U+1D040 - U+1D047 : 0x11111111 */ - 1, /* U+1D048 - U+1D04F : 0x11111111 */ - 1, /* U+1D050 - U+1D057 : 0x11111111 */ - 1, /* U+1D058 - U+1D05F : 0x11111111 */ - 1, /* U+1D060 - U+1D067 : 0x11111111 */ - 1, /* U+1D068 - U+1D06F : 0x11111111 */ - 1, /* U+1D070 - U+1D077 : 0x11111111 */ - 1, /* U+1D078 - U+1D07F : 0x11111111 */ - 1, /* U+1D080 - U+1D087 : 0x11111111 */ - 1, /* U+1D088 - U+1D08F : 0x11111111 */ - 1, /* U+1D090 - U+1D097 : 0x11111111 */ - 1, /* U+1D098 - U+1D09F : 0x11111111 */ - 1, /* U+1D0A0 - U+1D0A7 : 0x11111111 */ - 1, /* U+1D0A8 - U+1D0AF : 0x11111111 */ - 1, /* U+1D0B0 - U+1D0B7 : 0x11111111 */ - 1, /* U+1D0B8 - U+1D0BF : 0x11111111 */ - 1, /* U+1D0C0 - U+1D0C7 : 0x11111111 */ - 1, /* U+1D0C8 - U+1D0CF : 0x11111111 */ - 1, /* U+1D0D0 - U+1D0D7 : 0x11111111 */ - 1, /* U+1D0D8 - U+1D0DF : 0x11111111 */ - 1, /* U+1D0E0 - U+1D0E7 : 0x11111111 */ - 1, /* U+1D0E8 - U+1D0EF : 0x11111111 */ - 1, /* U+1D0F0 - U+1D0F7 : 0x11111111 */ - 1, /* U+1D0F8 - U+1D0FF : 0x11111111 */ - 1, /* U+1D100 - U+1D107 : 0x11111111 */ - 1, /* U+1D108 - U+1D10F : 0x11111111 */ - 1, /* U+1D110 - U+1D117 : 0x11111111 */ - 1, /* U+1D118 - U+1D11F : 0x11111111 */ - 1, /* U+1D120 - U+1D127 : 0x11111111 */ - 1, /* U+1D128 - U+1D12F : 0x11111111 */ - 1, /* U+1D130 - U+1D137 : 0x11111111 */ - 1, /* U+1D138 - U+1D13F : 0x11111111 */ - 1, /* U+1D140 - U+1D147 : 0x11111111 */ - 1, /* U+1D148 - U+1D14F : 0x11111111 */ - 1, /* U+1D150 - U+1D157 : 0x11111111 */ - 1, /* U+1D158 - U+1D15F : 0x11111111 */ - 98, /* U+1D160 - U+1D167 : 0xA1111111 */ - 38, /* U+1D168 - U+1D16F : 0x111111AA */ - 198, /* U+1D170 - U+1D177 : 0xBBBBB111 */ - 199, /* U+1D178 - U+1D17F : 0xAAAAABBB */ - 200, /* U+1D180 - U+1D187 : 0xAAA11AAA */ - 116, /* U+1D188 - U+1D18F : 0x1111AAAA */ - 1, /* U+1D190 - U+1D197 : 0x11111111 */ - 1, /* U+1D198 - U+1D19F : 0x11111111 */ - 1, /* U+1D1A0 - U+1D1A7 : 0x11111111 */ - 127, /* U+1D1A8 - U+1D1AF : 0x11AAAA11 */ - 1, /* U+1D1B0 - U+1D1B7 : 0x11111111 */ - 1, /* U+1D1B8 - U+1D1BF : 0x11111111 */ - 1, /* U+1D1C0 - U+1D1C7 : 0x11111111 */ - 1, /* U+1D1C8 - U+1D1CF : 0x11111111 */ - 1, /* U+1D1D0 - U+1D1D7 : 0x11111111 */ - 1, /* U+1D1D8 - U+1D1DF : 0x11111111 */ - 1, /* U+1D1E0 - U+1D1E7 : 0x11111111 */ - 1, /* U+1D1E8 - U+1D1EF : 0x11111111 */ - 1, /* U+1D1F0 - U+1D1F7 : 0x11111111 */ - 1, /* U+1D1F8 - U+1D1FF : 0x11111111 */ - 9, /* U+1D200 - U+1D207 : 0x99999999 */ - 9, /* U+1D208 - U+1D20F : 0x99999999 */ - 9, /* U+1D210 - U+1D217 : 0x99999999 */ - 9, /* U+1D218 - U+1D21F : 0x99999999 */ - 9, /* U+1D220 - U+1D227 : 0x99999999 */ - 9, /* U+1D228 - U+1D22F : 0x99999999 */ - 9, /* U+1D230 - U+1D237 : 0x99999999 */ - 9, /* U+1D238 - U+1D23F : 0x99999999 */ - 201, /* U+1D240 - U+1D247 : 0x119AAA99 */ - 1, /* U+1D248 - U+1D24F : 0x11111111 */ - 1, /* U+1D250 - U+1D257 : 0x11111111 */ - 1, /* U+1D258 - U+1D25F : 0x11111111 */ - 1, /* U+1D260 - U+1D267 : 0x11111111 */ - 1, /* U+1D268 - U+1D26F : 0x11111111 */ - 1, /* U+1D270 - U+1D277 : 0x11111111 */ - 1, /* U+1D278 - U+1D27F : 0x11111111 */ - 1, /* U+1D280 - U+1D287 : 0x11111111 */ - 1, /* U+1D288 - U+1D28F : 0x11111111 */ - 1, /* U+1D290 - U+1D297 : 0x11111111 */ - 1, /* U+1D298 - U+1D29F : 0x11111111 */ - 1, /* U+1D2A0 - U+1D2A7 : 0x11111111 */ - 1, /* U+1D2A8 - U+1D2AF : 0x11111111 */ - 1, /* U+1D2B0 - U+1D2B7 : 0x11111111 */ - 1, /* U+1D2B8 - U+1D2BF : 0x11111111 */ - 1, /* U+1D2C0 - U+1D2C7 : 0x11111111 */ - 1, /* U+1D2C8 - U+1D2CF : 0x11111111 */ - 1, /* U+1D2D0 - U+1D2D7 : 0x11111111 */ - 1, /* U+1D2D8 - U+1D2DF : 0x11111111 */ - 1, /* U+1D2E0 - U+1D2E7 : 0x11111111 */ - 1, /* U+1D2E8 - U+1D2EF : 0x11111111 */ - 1, /* U+1D2F0 - U+1D2F7 : 0x11111111 */ - 1, /* U+1D2F8 - U+1D2FF : 0x11111111 */ - 9, /* U+1D300 - U+1D307 : 0x99999999 */ - 9, /* U+1D308 - U+1D30F : 0x99999999 */ - 9, /* U+1D310 - U+1D317 : 0x99999999 */ - 9, /* U+1D318 - U+1D31F : 0x99999999 */ - 9, /* U+1D320 - U+1D327 : 0x99999999 */ - 9, /* U+1D328 - U+1D32F : 0x99999999 */ - 9, /* U+1D330 - U+1D337 : 0x99999999 */ - 9, /* U+1D338 - U+1D33F : 0x99999999 */ - 9, /* U+1D340 - U+1D347 : 0x99999999 */ - 9, /* U+1D348 - U+1D34F : 0x99999999 */ - 93, /* U+1D350 - U+1D357 : 0x19999999 */ - 1, /* U+1D358 - U+1D35F : 0x11111111 */ - 1, /* U+1D360 - U+1D367 : 0x11111111 */ - 1, /* U+1D368 - U+1D36F : 0x11111111 */ - 1, /* U+1D370 - U+1D377 : 0x11111111 */ - 1, /* U+1D378 - U+1D37F : 0x11111111 */ - 1, /* U+1D380 - U+1D387 : 0x11111111 */ - 1, /* U+1D388 - U+1D38F : 0x11111111 */ - 1, /* U+1D390 - U+1D397 : 0x11111111 */ - 1, /* U+1D398 - U+1D39F : 0x11111111 */ - 1, /* U+1D3A0 - U+1D3A7 : 0x11111111 */ - 1, /* U+1D3A8 - U+1D3AF : 0x11111111 */ - 1, /* U+1D3B0 - U+1D3B7 : 0x11111111 */ - 1, /* U+1D3B8 - U+1D3BF : 0x11111111 */ - 1, /* U+1D3C0 - U+1D3C7 : 0x11111111 */ - 1, /* U+1D3C8 - U+1D3CF : 0x11111111 */ - 1, /* U+1D3D0 - U+1D3D7 : 0x11111111 */ - 1, /* U+1D3D8 - U+1D3DF : 0x11111111 */ - 1, /* U+1D3E0 - U+1D3E7 : 0x11111111 */ - 1, /* U+1D3E8 - U+1D3EF : 0x11111111 */ - 1, /* U+1D3F0 - U+1D3F7 : 0x11111111 */ - 1, /* U+1D3F8 - U+1D3FF : 0x11111111 */ - 1, /* U+1D400 - U+1D407 : 0x11111111 */ - 1, /* U+1D408 - U+1D40F : 0x11111111 */ - 1, /* U+1D410 - U+1D417 : 0x11111111 */ - 1, /* U+1D418 - U+1D41F : 0x11111111 */ - 1, /* U+1D420 - U+1D427 : 0x11111111 */ - 1, /* U+1D428 - U+1D42F : 0x11111111 */ - 1, /* U+1D430 - U+1D437 : 0x11111111 */ - 1, /* U+1D438 - U+1D43F : 0x11111111 */ - 1, /* U+1D440 - U+1D447 : 0x11111111 */ - 1, /* U+1D448 - U+1D44F : 0x11111111 */ - 1, /* U+1D450 - U+1D457 : 0x11111111 */ - 1, /* U+1D458 - U+1D45F : 0x11111111 */ - 1, /* U+1D460 - U+1D467 : 0x11111111 */ - 1, /* U+1D468 - U+1D46F : 0x11111111 */ - 1, /* U+1D470 - U+1D477 : 0x11111111 */ - 1, /* U+1D478 - U+1D47F : 0x11111111 */ - 1, /* U+1D480 - U+1D487 : 0x11111111 */ - 1, /* U+1D488 - U+1D48F : 0x11111111 */ - 1, /* U+1D490 - U+1D497 : 0x11111111 */ - 1, /* U+1D498 - U+1D49F : 0x11111111 */ - 1, /* U+1D4A0 - U+1D4A7 : 0x11111111 */ - 1, /* U+1D4A8 - U+1D4AF : 0x11111111 */ - 1, /* U+1D4B0 - U+1D4B7 : 0x11111111 */ - 1, /* U+1D4B8 - U+1D4BF : 0x11111111 */ - 1, /* U+1D4C0 - U+1D4C7 : 0x11111111 */ - 1, /* U+1D4C8 - U+1D4CF : 0x11111111 */ - 1, /* U+1D4D0 - U+1D4D7 : 0x11111111 */ - 1, /* U+1D4D8 - U+1D4DF : 0x11111111 */ - 1, /* U+1D4E0 - U+1D4E7 : 0x11111111 */ - 1, /* U+1D4E8 - U+1D4EF : 0x11111111 */ - 1, /* U+1D4F0 - U+1D4F7 : 0x11111111 */ - 1, /* U+1D4F8 - U+1D4FF : 0x11111111 */ - 1, /* U+1D500 - U+1D507 : 0x11111111 */ - 1, /* U+1D508 - U+1D50F : 0x11111111 */ - 1, /* U+1D510 - U+1D517 : 0x11111111 */ - 1, /* U+1D518 - U+1D51F : 0x11111111 */ - 1, /* U+1D520 - U+1D527 : 0x11111111 */ - 1, /* U+1D528 - U+1D52F : 0x11111111 */ - 1, /* U+1D530 - U+1D537 : 0x11111111 */ - 1, /* U+1D538 - U+1D53F : 0x11111111 */ - 1, /* U+1D540 - U+1D547 : 0x11111111 */ - 1, /* U+1D548 - U+1D54F : 0x11111111 */ - 1, /* U+1D550 - U+1D557 : 0x11111111 */ - 1, /* U+1D558 - U+1D55F : 0x11111111 */ - 1, /* U+1D560 - U+1D567 : 0x11111111 */ - 1, /* U+1D568 - U+1D56F : 0x11111111 */ - 1, /* U+1D570 - U+1D577 : 0x11111111 */ - 1, /* U+1D578 - U+1D57F : 0x11111111 */ - 1, /* U+1D580 - U+1D587 : 0x11111111 */ - 1, /* U+1D588 - U+1D58F : 0x11111111 */ - 1, /* U+1D590 - U+1D597 : 0x11111111 */ - 1, /* U+1D598 - U+1D59F : 0x11111111 */ - 1, /* U+1D5A0 - U+1D5A7 : 0x11111111 */ - 1, /* U+1D5A8 - U+1D5AF : 0x11111111 */ - 1, /* U+1D5B0 - U+1D5B7 : 0x11111111 */ - 1, /* U+1D5B8 - U+1D5BF : 0x11111111 */ - 1, /* U+1D5C0 - U+1D5C7 : 0x11111111 */ - 1, /* U+1D5C8 - U+1D5CF : 0x11111111 */ - 1, /* U+1D5D0 - U+1D5D7 : 0x11111111 */ - 1, /* U+1D5D8 - U+1D5DF : 0x11111111 */ - 1, /* U+1D5E0 - U+1D5E7 : 0x11111111 */ - 1, /* U+1D5E8 - U+1D5EF : 0x11111111 */ - 1, /* U+1D5F0 - U+1D5F7 : 0x11111111 */ - 1, /* U+1D5F8 - U+1D5FF : 0x11111111 */ - 1, /* U+1D600 - U+1D607 : 0x11111111 */ - 1, /* U+1D608 - U+1D60F : 0x11111111 */ - 1, /* U+1D610 - U+1D617 : 0x11111111 */ - 1, /* U+1D618 - U+1D61F : 0x11111111 */ - 1, /* U+1D620 - U+1D627 : 0x11111111 */ - 1, /* U+1D628 - U+1D62F : 0x11111111 */ - 1, /* U+1D630 - U+1D637 : 0x11111111 */ - 1, /* U+1D638 - U+1D63F : 0x11111111 */ - 1, /* U+1D640 - U+1D647 : 0x11111111 */ - 1, /* U+1D648 - U+1D64F : 0x11111111 */ - 1, /* U+1D650 - U+1D657 : 0x11111111 */ - 1, /* U+1D658 - U+1D65F : 0x11111111 */ - 1, /* U+1D660 - U+1D667 : 0x11111111 */ - 1, /* U+1D668 - U+1D66F : 0x11111111 */ - 1, /* U+1D670 - U+1D677 : 0x11111111 */ - 1, /* U+1D678 - U+1D67F : 0x11111111 */ - 1, /* U+1D680 - U+1D687 : 0x11111111 */ - 1, /* U+1D688 - U+1D68F : 0x11111111 */ - 1, /* U+1D690 - U+1D697 : 0x11111111 */ - 1, /* U+1D698 - U+1D69F : 0x11111111 */ - 1, /* U+1D6A0 - U+1D6A7 : 0x11111111 */ - 1, /* U+1D6A8 - U+1D6AF : 0x11111111 */ - 1, /* U+1D6B0 - U+1D6B7 : 0x11111111 */ - 1, /* U+1D6B8 - U+1D6BF : 0x11111111 */ - 1, /* U+1D6C0 - U+1D6C7 : 0x11111111 */ - 1, /* U+1D6C8 - U+1D6CF : 0x11111111 */ - 1, /* U+1D6D0 - U+1D6D7 : 0x11111111 */ - 166, /* U+1D6D8 - U+1D6DF : 0x11119111 */ - 1, /* U+1D6E0 - U+1D6E7 : 0x11111111 */ - 1, /* U+1D6E8 - U+1D6EF : 0x11111111 */ - 1, /* U+1D6F0 - U+1D6F7 : 0x11111111 */ - 1, /* U+1D6F8 - U+1D6FF : 0x11111111 */ - 1, /* U+1D700 - U+1D707 : 0x11111111 */ - 1, /* U+1D708 - U+1D70F : 0x11111111 */ - 202, /* U+1D710 - U+1D717 : 0x11911111 */ - 1, /* U+1D718 - U+1D71F : 0x11111111 */ - 1, /* U+1D720 - U+1D727 : 0x11111111 */ - 1, /* U+1D728 - U+1D72F : 0x11111111 */ - 1, /* U+1D730 - U+1D737 : 0x11111111 */ - 1, /* U+1D738 - U+1D73F : 0x11111111 */ - 1, /* U+1D740 - U+1D747 : 0x11111111 */ - 29, /* U+1D748 - U+1D74F : 0x91111111 */ - 1, /* U+1D750 - U+1D757 : 0x11111111 */ - 1, /* U+1D758 - U+1D75F : 0x11111111 */ - 1, /* U+1D760 - U+1D767 : 0x11111111 */ - 1, /* U+1D768 - U+1D76F : 0x11111111 */ - 1, /* U+1D770 - U+1D777 : 0x11111111 */ - 1, /* U+1D778 - U+1D77F : 0x11111111 */ - 1, /* U+1D780 - U+1D787 : 0x11111111 */ - 153, /* U+1D788 - U+1D78F : 0x11111191 */ - 1, /* U+1D790 - U+1D797 : 0x11111111 */ - 1, /* U+1D798 - U+1D79F : 0x11111111 */ - 1, /* U+1D7A0 - U+1D7A7 : 0x11111111 */ - 1, /* U+1D7A8 - U+1D7AF : 0x11111111 */ - 1, /* U+1D7B0 - U+1D7B7 : 0x11111111 */ - 1, /* U+1D7B8 - U+1D7BF : 0x11111111 */ - 166, /* U+1D7C0 - U+1D7C7 : 0x11119111 */ - 203, /* U+1D7C8 - U+1D7CF : 0x55111111 */ - 5, /* U+1D7D0 - U+1D7D7 : 0x55555555 */ - 5, /* U+1D7D8 - U+1D7DF : 0x55555555 */ - 5, /* U+1D7E0 - U+1D7E7 : 0x55555555 */ - 5, /* U+1D7E8 - U+1D7EF : 0x55555555 */ - 5, /* U+1D7F0 - U+1D7F7 : 0x55555555 */ - 5, /* U+1D7F8 - U+1D7FF : 0x55555555 */ -}; - -static PRUint8 gBidiCatIdx22[32] = { - 204, /* U+1EE00 - U+1EE07 : 0x33313333 */ - 3, /* U+1EE08 - U+1EE0F : 0x33333333 */ - 3, /* U+1EE10 - U+1EE17 : 0x33333333 */ - 3, /* U+1EE18 - U+1EE1F : 0x33333333 */ - 205, /* U+1EE20 - U+1EE27 : 0x31131331 */ - 206, /* U+1EE28 - U+1EE2F : 0x33333331 */ - 207, /* U+1EE30 - U+1EE37 : 0x33331333 */ - 208, /* U+1EE38 - U+1EE3F : 0x11113131 */ - 209, /* U+1EE40 - U+1EE47 : 0x31111311 */ - 210, /* U+1EE48 - U+1EE4F : 0x33313131 */ - 205, /* U+1EE50 - U+1EE57 : 0x31131331 */ - 211, /* U+1EE58 - U+1EE5F : 0x31313131 */ - 205, /* U+1EE60 - U+1EE67 : 0x31131331 */ - 207, /* U+1EE68 - U+1EE6F : 0x33331333 */ - 207, /* U+1EE70 - U+1EE77 : 0x33331333 */ - 212, /* U+1EE78 - U+1EE7F : 0x13133331 */ - 3, /* U+1EE80 - U+1EE87 : 0x33333333 */ - 213, /* U+1EE88 - U+1EE8F : 0x33333133 */ - 3, /* U+1EE90 - U+1EE97 : 0x33333333 */ - 214, /* U+1EE98 - U+1EE9F : 0x11113333 */ - 215, /* U+1EEA0 - U+1EEA7 : 0x33313331 */ - 213, /* U+1EEA8 - U+1EEAF : 0x33333133 */ - 3, /* U+1EEB0 - U+1EEB7 : 0x33333333 */ - 214, /* U+1EEB8 - U+1EEBF : 0x11113333 */ - 1, /* U+1EEC0 - U+1EEC7 : 0x11111111 */ - 1, /* U+1EEC8 - U+1EECF : 0x11111111 */ - 1, /* U+1EED0 - U+1EED7 : 0x11111111 */ - 1, /* U+1EED8 - U+1EEDF : 0x11111111 */ - 1, /* U+1EEE0 - U+1EEE7 : 0x11111111 */ - 1, /* U+1EEE8 - U+1EEEF : 0x11111111 */ - 111, /* U+1EEF0 - U+1EEF7 : 0x11111199 */ - 1, /* U+1EEF8 - U+1EEFF : 0x11111111 */ -}; - -static PRUint8 gBidiCatIdx23[240] = { - 9, /* U+1F000 - U+1F007 : 0x99999999 */ - 9, /* U+1F008 - U+1F00F : 0x99999999 */ - 9, /* U+1F010 - U+1F017 : 0x99999999 */ - 9, /* U+1F018 - U+1F01F : 0x99999999 */ - 9, /* U+1F020 - U+1F027 : 0x99999999 */ - 157, /* U+1F028 - U+1F02F : 0x11119999 */ - 9, /* U+1F030 - U+1F037 : 0x99999999 */ - 9, /* U+1F038 - U+1F03F : 0x99999999 */ - 9, /* U+1F040 - U+1F047 : 0x99999999 */ - 9, /* U+1F048 - U+1F04F : 0x99999999 */ - 9, /* U+1F050 - U+1F057 : 0x99999999 */ - 9, /* U+1F058 - U+1F05F : 0x99999999 */ - 9, /* U+1F060 - U+1F067 : 0x99999999 */ - 9, /* U+1F068 - U+1F06F : 0x99999999 */ - 9, /* U+1F070 - U+1F077 : 0x99999999 */ - 9, /* U+1F078 - U+1F07F : 0x99999999 */ - 9, /* U+1F080 - U+1F087 : 0x99999999 */ - 9, /* U+1F088 - U+1F08F : 0x99999999 */ - 157, /* U+1F090 - U+1F097 : 0x11119999 */ - 1, /* U+1F098 - U+1F09F : 0x11111111 */ - 9, /* U+1F0A0 - U+1F0A7 : 0x99999999 */ - 93, /* U+1F0A8 - U+1F0AF : 0x19999999 */ - 161, /* U+1F0B0 - U+1F0B7 : 0x99999991 */ - 93, /* U+1F0B8 - U+1F0BF : 0x19999999 */ - 161, /* U+1F0C0 - U+1F0C7 : 0x99999991 */ - 9, /* U+1F0C8 - U+1F0CF : 0x99999999 */ - 161, /* U+1F0D0 - U+1F0D7 : 0x99999991 */ - 9, /* U+1F0D8 - U+1F0DF : 0x99999999 */ - 1, /* U+1F0E0 - U+1F0E7 : 0x11111111 */ - 1, /* U+1F0E8 - U+1F0EF : 0x11111111 */ - 1, /* U+1F0F0 - U+1F0F7 : 0x11111111 */ - 1, /* U+1F0F8 - U+1F0FF : 0x11111111 */ - 5, /* U+1F100 - U+1F107 : 0x55555555 */ - 216, /* U+1F108 - U+1F10F : 0x11111555 */ - 1, /* U+1F110 - U+1F117 : 0x11111111 */ - 1, /* U+1F118 - U+1F11F : 0x11111111 */ - 1, /* U+1F120 - U+1F127 : 0x11111111 */ - 1, /* U+1F128 - U+1F12F : 0x11111111 */ - 1, /* U+1F130 - U+1F137 : 0x11111111 */ - 1, /* U+1F138 - U+1F13F : 0x11111111 */ - 1, /* U+1F140 - U+1F147 : 0x11111111 */ - 1, /* U+1F148 - U+1F14F : 0x11111111 */ - 1, /* U+1F150 - U+1F157 : 0x11111111 */ - 1, /* U+1F158 - U+1F15F : 0x11111111 */ - 1, /* U+1F160 - U+1F167 : 0x11111111 */ - 150, /* U+1F168 - U+1F16F : 0x11119911 */ - 1, /* U+1F170 - U+1F177 : 0x11111111 */ - 1, /* U+1F178 - U+1F17F : 0x11111111 */ - 1, /* U+1F180 - U+1F187 : 0x11111111 */ - 1, /* U+1F188 - U+1F18F : 0x11111111 */ - 1, /* U+1F190 - U+1F197 : 0x11111111 */ - 1, /* U+1F198 - U+1F19F : 0x11111111 */ - 1, /* U+1F1A0 - U+1F1A7 : 0x11111111 */ - 1, /* U+1F1A8 - U+1F1AF : 0x11111111 */ - 1, /* U+1F1B0 - U+1F1B7 : 0x11111111 */ - 1, /* U+1F1B8 - U+1F1BF : 0x11111111 */ - 1, /* U+1F1C0 - U+1F1C7 : 0x11111111 */ - 1, /* U+1F1C8 - U+1F1CF : 0x11111111 */ - 1, /* U+1F1D0 - U+1F1D7 : 0x11111111 */ - 1, /* U+1F1D8 - U+1F1DF : 0x11111111 */ - 1, /* U+1F1E0 - U+1F1E7 : 0x11111111 */ - 1, /* U+1F1E8 - U+1F1EF : 0x11111111 */ - 1, /* U+1F1F0 - U+1F1F7 : 0x11111111 */ - 1, /* U+1F1F8 - U+1F1FF : 0x11111111 */ - 1, /* U+1F200 - U+1F207 : 0x11111111 */ - 1, /* U+1F208 - U+1F20F : 0x11111111 */ - 1, /* U+1F210 - U+1F217 : 0x11111111 */ - 1, /* U+1F218 - U+1F21F : 0x11111111 */ - 1, /* U+1F220 - U+1F227 : 0x11111111 */ - 1, /* U+1F228 - U+1F22F : 0x11111111 */ - 1, /* U+1F230 - U+1F237 : 0x11111111 */ - 1, /* U+1F238 - U+1F23F : 0x11111111 */ - 1, /* U+1F240 - U+1F247 : 0x11111111 */ - 1, /* U+1F248 - U+1F24F : 0x11111111 */ - 1, /* U+1F250 - U+1F257 : 0x11111111 */ - 1, /* U+1F258 - U+1F25F : 0x11111111 */ - 1, /* U+1F260 - U+1F267 : 0x11111111 */ - 1, /* U+1F268 - U+1F26F : 0x11111111 */ - 1, /* U+1F270 - U+1F277 : 0x11111111 */ - 1, /* U+1F278 - U+1F27F : 0x11111111 */ - 1, /* U+1F280 - U+1F287 : 0x11111111 */ - 1, /* U+1F288 - U+1F28F : 0x11111111 */ - 1, /* U+1F290 - U+1F297 : 0x11111111 */ - 1, /* U+1F298 - U+1F29F : 0x11111111 */ - 1, /* U+1F2A0 - U+1F2A7 : 0x11111111 */ - 1, /* U+1F2A8 - U+1F2AF : 0x11111111 */ - 1, /* U+1F2B0 - U+1F2B7 : 0x11111111 */ - 1, /* U+1F2B8 - U+1F2BF : 0x11111111 */ - 1, /* U+1F2C0 - U+1F2C7 : 0x11111111 */ - 1, /* U+1F2C8 - U+1F2CF : 0x11111111 */ - 1, /* U+1F2D0 - U+1F2D7 : 0x11111111 */ - 1, /* U+1F2D8 - U+1F2DF : 0x11111111 */ - 1, /* U+1F2E0 - U+1F2E7 : 0x11111111 */ - 1, /* U+1F2E8 - U+1F2EF : 0x11111111 */ - 1, /* U+1F2F0 - U+1F2F7 : 0x11111111 */ - 1, /* U+1F2F8 - U+1F2FF : 0x11111111 */ - 9, /* U+1F300 - U+1F307 : 0x99999999 */ - 9, /* U+1F308 - U+1F30F : 0x99999999 */ - 9, /* U+1F310 - U+1F317 : 0x99999999 */ - 9, /* U+1F318 - U+1F31F : 0x99999999 */ - 21, /* U+1F320 - U+1F327 : 0x11111119 */ - 1, /* U+1F328 - U+1F32F : 0x11111111 */ - 33, /* U+1F330 - U+1F337 : 0x91999999 */ - 9, /* U+1F338 - U+1F33F : 0x99999999 */ - 9, /* U+1F340 - U+1F347 : 0x99999999 */ - 9, /* U+1F348 - U+1F34F : 0x99999999 */ - 9, /* U+1F350 - U+1F357 : 0x99999999 */ - 9, /* U+1F358 - U+1F35F : 0x99999999 */ - 9, /* U+1F360 - U+1F367 : 0x99999999 */ - 9, /* U+1F368 - U+1F36F : 0x99999999 */ - 9, /* U+1F370 - U+1F377 : 0x99999999 */ - 151, /* U+1F378 - U+1F37F : 0x11199999 */ - 9, /* U+1F380 - U+1F387 : 0x99999999 */ - 9, /* U+1F388 - U+1F38F : 0x99999999 */ - 157, /* U+1F390 - U+1F397 : 0x11119999 */ - 1, /* U+1F398 - U+1F39F : 0x11111111 */ - 9, /* U+1F3A0 - U+1F3A7 : 0x99999999 */ - 9, /* U+1F3A8 - U+1F3AF : 0x99999999 */ - 9, /* U+1F3B0 - U+1F3B7 : 0x99999999 */ - 9, /* U+1F3B8 - U+1F3BF : 0x99999999 */ - 156, /* U+1F3C0 - U+1F3C7 : 0x99199999 */ - 158, /* U+1F3C8 - U+1F3CF : 0x11111999 */ - 1, /* U+1F3D0 - U+1F3D7 : 0x11111111 */ - 1, /* U+1F3D8 - U+1F3DF : 0x11111111 */ - 9, /* U+1F3E0 - U+1F3E7 : 0x99999999 */ - 9, /* U+1F3E8 - U+1F3EF : 0x99999999 */ - 21, /* U+1F3F0 - U+1F3F7 : 0x11111119 */ - 1, /* U+1F3F8 - U+1F3FF : 0x11111111 */ - 9, /* U+1F400 - U+1F407 : 0x99999999 */ - 9, /* U+1F408 - U+1F40F : 0x99999999 */ - 9, /* U+1F410 - U+1F417 : 0x99999999 */ - 9, /* U+1F418 - U+1F41F : 0x99999999 */ - 9, /* U+1F420 - U+1F427 : 0x99999999 */ - 9, /* U+1F428 - U+1F42F : 0x99999999 */ - 9, /* U+1F430 - U+1F437 : 0x99999999 */ - 93, /* U+1F438 - U+1F43F : 0x19999999 */ - 217, /* U+1F440 - U+1F447 : 0x99999919 */ - 9, /* U+1F448 - U+1F44F : 0x99999999 */ - 9, /* U+1F450 - U+1F457 : 0x99999999 */ - 9, /* U+1F458 - U+1F45F : 0x99999999 */ - 9, /* U+1F460 - U+1F467 : 0x99999999 */ - 9, /* U+1F468 - U+1F46F : 0x99999999 */ - 9, /* U+1F470 - U+1F477 : 0x99999999 */ - 9, /* U+1F478 - U+1F47F : 0x99999999 */ - 9, /* U+1F480 - U+1F487 : 0x99999999 */ - 9, /* U+1F488 - U+1F48F : 0x99999999 */ - 9, /* U+1F490 - U+1F497 : 0x99999999 */ - 9, /* U+1F498 - U+1F49F : 0x99999999 */ - 9, /* U+1F4A0 - U+1F4A7 : 0x99999999 */ - 9, /* U+1F4A8 - U+1F4AF : 0x99999999 */ - 9, /* U+1F4B0 - U+1F4B7 : 0x99999999 */ - 9, /* U+1F4B8 - U+1F4BF : 0x99999999 */ - 9, /* U+1F4C0 - U+1F4C7 : 0x99999999 */ - 9, /* U+1F4C8 - U+1F4CF : 0x99999999 */ - 9, /* U+1F4D0 - U+1F4D7 : 0x99999999 */ - 9, /* U+1F4D8 - U+1F4DF : 0x99999999 */ - 9, /* U+1F4E0 - U+1F4E7 : 0x99999999 */ - 9, /* U+1F4E8 - U+1F4EF : 0x99999999 */ - 9, /* U+1F4F0 - U+1F4F7 : 0x99999999 */ - 218, /* U+1F4F8 - U+1F4FF : 0x11199991 */ - 9, /* U+1F500 - U+1F507 : 0x99999999 */ - 9, /* U+1F508 - U+1F50F : 0x99999999 */ - 9, /* U+1F510 - U+1F517 : 0x99999999 */ - 9, /* U+1F518 - U+1F51F : 0x99999999 */ - 9, /* U+1F520 - U+1F527 : 0x99999999 */ - 9, /* U+1F528 - U+1F52F : 0x99999999 */ - 9, /* U+1F530 - U+1F537 : 0x99999999 */ - 155, /* U+1F538 - U+1F53F : 0x11999999 */ - 157, /* U+1F540 - U+1F547 : 0x11119999 */ - 1, /* U+1F548 - U+1F54F : 0x11111111 */ - 9, /* U+1F550 - U+1F557 : 0x99999999 */ - 9, /* U+1F558 - U+1F55F : 0x99999999 */ - 9, /* U+1F560 - U+1F567 : 0x99999999 */ - 1, /* U+1F568 - U+1F56F : 0x11111111 */ - 1, /* U+1F570 - U+1F577 : 0x11111111 */ - 1, /* U+1F578 - U+1F57F : 0x11111111 */ - 1, /* U+1F580 - U+1F587 : 0x11111111 */ - 1, /* U+1F588 - U+1F58F : 0x11111111 */ - 1, /* U+1F590 - U+1F597 : 0x11111111 */ - 1, /* U+1F598 - U+1F59F : 0x11111111 */ - 1, /* U+1F5A0 - U+1F5A7 : 0x11111111 */ - 1, /* U+1F5A8 - U+1F5AF : 0x11111111 */ - 1, /* U+1F5B0 - U+1F5B7 : 0x11111111 */ - 1, /* U+1F5B8 - U+1F5BF : 0x11111111 */ - 1, /* U+1F5C0 - U+1F5C7 : 0x11111111 */ - 1, /* U+1F5C8 - U+1F5CF : 0x11111111 */ - 1, /* U+1F5D0 - U+1F5D7 : 0x11111111 */ - 1, /* U+1F5D8 - U+1F5DF : 0x11111111 */ - 1, /* U+1F5E0 - U+1F5E7 : 0x11111111 */ - 1, /* U+1F5E8 - U+1F5EF : 0x11111111 */ - 1, /* U+1F5F0 - U+1F5F7 : 0x11111111 */ - 22, /* U+1F5F8 - U+1F5FF : 0x99999111 */ - 9, /* U+1F600 - U+1F607 : 0x99999999 */ - 9, /* U+1F608 - U+1F60F : 0x99999999 */ - 9, /* U+1F610 - U+1F617 : 0x99999999 */ - 9, /* U+1F618 - U+1F61F : 0x99999999 */ - 9, /* U+1F620 - U+1F627 : 0x99999999 */ - 9, /* U+1F628 - U+1F62F : 0x99999999 */ - 9, /* U+1F630 - U+1F637 : 0x99999999 */ - 9, /* U+1F638 - U+1F63F : 0x99999999 */ - 219, /* U+1F640 - U+1F647 : 0x99911119 */ - 9, /* U+1F648 - U+1F64F : 0x99999999 */ - 1, /* U+1F650 - U+1F657 : 0x11111111 */ - 1, /* U+1F658 - U+1F65F : 0x11111111 */ - 1, /* U+1F660 - U+1F667 : 0x11111111 */ - 1, /* U+1F668 - U+1F66F : 0x11111111 */ - 1, /* U+1F670 - U+1F677 : 0x11111111 */ - 1, /* U+1F678 - U+1F67F : 0x11111111 */ - 9, /* U+1F680 - U+1F687 : 0x99999999 */ - 9, /* U+1F688 - U+1F68F : 0x99999999 */ - 9, /* U+1F690 - U+1F697 : 0x99999999 */ - 9, /* U+1F698 - U+1F69F : 0x99999999 */ - 9, /* U+1F6A0 - U+1F6A7 : 0x99999999 */ - 9, /* U+1F6A8 - U+1F6AF : 0x99999999 */ - 9, /* U+1F6B0 - U+1F6B7 : 0x99999999 */ - 9, /* U+1F6B8 - U+1F6BF : 0x99999999 */ - 155, /* U+1F6C0 - U+1F6C7 : 0x11999999 */ - 1, /* U+1F6C8 - U+1F6CF : 0x11111111 */ - 1, /* U+1F6D0 - U+1F6D7 : 0x11111111 */ - 1, /* U+1F6D8 - U+1F6DF : 0x11111111 */ - 1, /* U+1F6E0 - U+1F6E7 : 0x11111111 */ - 1, /* U+1F6E8 - U+1F6EF : 0x11111111 */ - 1, /* U+1F6F0 - U+1F6F7 : 0x11111111 */ - 1, /* U+1F6F8 - U+1F6FF : 0x11111111 */ - 9, /* U+1F700 - U+1F707 : 0x99999999 */ - 9, /* U+1F708 - U+1F70F : 0x99999999 */ - 9, /* U+1F710 - U+1F717 : 0x99999999 */ - 9, /* U+1F718 - U+1F71F : 0x99999999 */ - 9, /* U+1F720 - U+1F727 : 0x99999999 */ - 9, /* U+1F728 - U+1F72F : 0x99999999 */ - 9, /* U+1F730 - U+1F737 : 0x99999999 */ - 9, /* U+1F738 - U+1F73F : 0x99999999 */ - 9, /* U+1F740 - U+1F747 : 0x99999999 */ - 9, /* U+1F748 - U+1F74F : 0x99999999 */ - 9, /* U+1F750 - U+1F757 : 0x99999999 */ - 9, /* U+1F758 - U+1F75F : 0x99999999 */ - 9, /* U+1F760 - U+1F767 : 0x99999999 */ - 9, /* U+1F768 - U+1F76F : 0x99999999 */ - 157, /* U+1F770 - U+1F777 : 0x11119999 */ - 1, /* U+1F778 - U+1F77F : 0x11111111 */ -}; - -static PRUint8 gBidiCatIdx24[68] = { - 1, /* U+2F800 - U+2F807 : 0x11111111 */ - 1, /* U+2F808 - U+2F80F : 0x11111111 */ - 1, /* U+2F810 - U+2F817 : 0x11111111 */ - 1, /* U+2F818 - U+2F81F : 0x11111111 */ - 1, /* U+2F820 - U+2F827 : 0x11111111 */ - 1, /* U+2F828 - U+2F82F : 0x11111111 */ - 1, /* U+2F830 - U+2F837 : 0x11111111 */ - 1, /* U+2F838 - U+2F83F : 0x11111111 */ - 1, /* U+2F840 - U+2F847 : 0x11111111 */ - 1, /* U+2F848 - U+2F84F : 0x11111111 */ - 1, /* U+2F850 - U+2F857 : 0x11111111 */ - 1, /* U+2F858 - U+2F85F : 0x11111111 */ - 1, /* U+2F860 - U+2F867 : 0x11111111 */ - 1, /* U+2F868 - U+2F86F : 0x11111111 */ - 1, /* U+2F870 - U+2F877 : 0x11111111 */ - 1, /* U+2F878 - U+2F87F : 0x11111111 */ - 1, /* U+2F880 - U+2F887 : 0x11111111 */ - 1, /* U+2F888 - U+2F88F : 0x11111111 */ - 1, /* U+2F890 - U+2F897 : 0x11111111 */ - 1, /* U+2F898 - U+2F89F : 0x11111111 */ - 1, /* U+2F8A0 - U+2F8A7 : 0x11111111 */ - 1, /* U+2F8A8 - U+2F8AF : 0x11111111 */ - 1, /* U+2F8B0 - U+2F8B7 : 0x11111111 */ - 1, /* U+2F8B8 - U+2F8BF : 0x11111111 */ - 1, /* U+2F8C0 - U+2F8C7 : 0x11111111 */ - 1, /* U+2F8C8 - U+2F8CF : 0x11111111 */ - 1, /* U+2F8D0 - U+2F8D7 : 0x11111111 */ - 1, /* U+2F8D8 - U+2F8DF : 0x11111111 */ - 1, /* U+2F8E0 - U+2F8E7 : 0x11111111 */ - 1, /* U+2F8E8 - U+2F8EF : 0x11111111 */ - 1, /* U+2F8F0 - U+2F8F7 : 0x11111111 */ - 1, /* U+2F8F8 - U+2F8FF : 0x11111111 */ - 1, /* U+2F900 - U+2F907 : 0x11111111 */ - 1, /* U+2F908 - U+2F90F : 0x11111111 */ - 1, /* U+2F910 - U+2F917 : 0x11111111 */ - 1, /* U+2F918 - U+2F91F : 0x11111111 */ - 1, /* U+2F920 - U+2F927 : 0x11111111 */ - 1, /* U+2F928 - U+2F92F : 0x11111111 */ - 1, /* U+2F930 - U+2F937 : 0x11111111 */ - 1, /* U+2F938 - U+2F93F : 0x11111111 */ - 1, /* U+2F940 - U+2F947 : 0x11111111 */ - 1, /* U+2F948 - U+2F94F : 0x11111111 */ - 1, /* U+2F950 - U+2F957 : 0x11111111 */ - 1, /* U+2F958 - U+2F95F : 0x11111111 */ - 1, /* U+2F960 - U+2F967 : 0x11111111 */ - 1, /* U+2F968 - U+2F96F : 0x11111111 */ - 1, /* U+2F970 - U+2F977 : 0x11111111 */ - 1, /* U+2F978 - U+2F97F : 0x11111111 */ - 1, /* U+2F980 - U+2F987 : 0x11111111 */ - 1, /* U+2F988 - U+2F98F : 0x11111111 */ - 1, /* U+2F990 - U+2F997 : 0x11111111 */ - 1, /* U+2F998 - U+2F99F : 0x11111111 */ - 1, /* U+2F9A0 - U+2F9A7 : 0x11111111 */ - 1, /* U+2F9A8 - U+2F9AF : 0x11111111 */ - 1, /* U+2F9B0 - U+2F9B7 : 0x11111111 */ - 1, /* U+2F9B8 - U+2F9BF : 0x11111111 */ - 1, /* U+2F9C0 - U+2F9C7 : 0x11111111 */ - 1, /* U+2F9C8 - U+2F9CF : 0x11111111 */ - 1, /* U+2F9D0 - U+2F9D7 : 0x11111111 */ - 1, /* U+2F9D8 - U+2F9DF : 0x11111111 */ - 1, /* U+2F9E0 - U+2F9E7 : 0x11111111 */ - 1, /* U+2F9E8 - U+2F9EF : 0x11111111 */ - 1, /* U+2F9F0 - U+2F9F7 : 0x11111111 */ - 1, /* U+2F9F8 - U+2F9FF : 0x11111111 */ - 1, /* U+2FA00 - U+2FA07 : 0x11111111 */ - 1, /* U+2FA08 - U+2FA0F : 0x11111111 */ - 1, /* U+2FA10 - U+2FA17 : 0x11111111 */ - 1, /* U+2FA18 - U+2FA1F : 0x11111111 */ -}; - -static PRUint8 gBidiCatIdx25[64] = { - 220, /* U+E0000 - U+E0007 : 0x111111B1 */ - 1, /* U+E0008 - U+E000F : 0x11111111 */ - 1, /* U+E0010 - U+E0017 : 0x11111111 */ - 1, /* U+E0018 - U+E001F : 0x11111111 */ - 11, /* U+E0020 - U+E0027 : 0xBBBBBBBB */ - 11, /* U+E0028 - U+E002F : 0xBBBBBBBB */ - 11, /* U+E0030 - U+E0037 : 0xBBBBBBBB */ - 11, /* U+E0038 - U+E003F : 0xBBBBBBBB */ - 11, /* U+E0040 - U+E0047 : 0xBBBBBBBB */ - 11, /* U+E0048 - U+E004F : 0xBBBBBBBB */ - 11, /* U+E0050 - U+E0057 : 0xBBBBBBBB */ - 11, /* U+E0058 - U+E005F : 0xBBBBBBBB */ - 11, /* U+E0060 - U+E0067 : 0xBBBBBBBB */ - 11, /* U+E0068 - U+E006F : 0xBBBBBBBB */ - 11, /* U+E0070 - U+E0077 : 0xBBBBBBBB */ - 11, /* U+E0078 - U+E007F : 0xBBBBBBBB */ - 1, /* U+E0080 - U+E0087 : 0x11111111 */ - 1, /* U+E0088 - U+E008F : 0x11111111 */ - 1, /* U+E0090 - U+E0097 : 0x11111111 */ - 1, /* U+E0098 - U+E009F : 0x11111111 */ - 1, /* U+E00A0 - U+E00A7 : 0x11111111 */ - 1, /* U+E00A8 - U+E00AF : 0x11111111 */ - 1, /* U+E00B0 - U+E00B7 : 0x11111111 */ - 1, /* U+E00B8 - U+E00BF : 0x11111111 */ - 1, /* U+E00C0 - U+E00C7 : 0x11111111 */ - 1, /* U+E00C8 - U+E00CF : 0x11111111 */ - 1, /* U+E00D0 - U+E00D7 : 0x11111111 */ - 1, /* U+E00D8 - U+E00DF : 0x11111111 */ - 1, /* U+E00E0 - U+E00E7 : 0x11111111 */ - 1, /* U+E00E8 - U+E00EF : 0x11111111 */ - 1, /* U+E00F0 - U+E00F7 : 0x11111111 */ - 1, /* U+E00F8 - U+E00FF : 0x11111111 */ - 10, /* U+E0100 - U+E0107 : 0xAAAAAAAA */ - 10, /* U+E0108 - U+E010F : 0xAAAAAAAA */ - 10, /* U+E0110 - U+E0117 : 0xAAAAAAAA */ - 10, /* U+E0118 - U+E011F : 0xAAAAAAAA */ - 10, /* U+E0120 - U+E0127 : 0xAAAAAAAA */ - 10, /* U+E0128 - U+E012F : 0xAAAAAAAA */ - 10, /* U+E0130 - U+E0137 : 0xAAAAAAAA */ - 10, /* U+E0138 - U+E013F : 0xAAAAAAAA */ - 10, /* U+E0140 - U+E0147 : 0xAAAAAAAA */ - 10, /* U+E0148 - U+E014F : 0xAAAAAAAA */ - 10, /* U+E0150 - U+E0157 : 0xAAAAAAAA */ - 10, /* U+E0158 - U+E015F : 0xAAAAAAAA */ - 10, /* U+E0160 - U+E0167 : 0xAAAAAAAA */ - 10, /* U+E0168 - U+E016F : 0xAAAAAAAA */ - 10, /* U+E0170 - U+E0177 : 0xAAAAAAAA */ - 10, /* U+E0178 - U+E017F : 0xAAAAAAAA */ - 10, /* U+E0180 - U+E0187 : 0xAAAAAAAA */ - 10, /* U+E0188 - U+E018F : 0xAAAAAAAA */ - 10, /* U+E0190 - U+E0197 : 0xAAAAAAAA */ - 10, /* U+E0198 - U+E019F : 0xAAAAAAAA */ - 10, /* U+E01A0 - U+E01A7 : 0xAAAAAAAA */ - 10, /* U+E01A8 - U+E01AF : 0xAAAAAAAA */ - 10, /* U+E01B0 - U+E01B7 : 0xAAAAAAAA */ - 10, /* U+E01B8 - U+E01BF : 0xAAAAAAAA */ - 10, /* U+E01C0 - U+E01C7 : 0xAAAAAAAA */ - 10, /* U+E01C8 - U+E01CF : 0xAAAAAAAA */ - 10, /* U+E01D0 - U+E01D7 : 0xAAAAAAAA */ - 10, /* U+E01D8 - U+E01DF : 0xAAAAAAAA */ - 10, /* U+E01E0 - U+E01E7 : 0xAAAAAAAA */ - 10, /* U+E01E8 - U+E01EF : 0xAAAAAAAA */ - 1, /* U+E01F0 - U+E01F7 : 0x11111111 */ - 1, /* U+E01F8 - U+E01FF : 0x11111111 */ -}; - -static PRUint32 gBidiCatPat[221] = { - 0x00000000, /* 0 */ - 0x11111111, /* 1 */ - 0x22222222, /* 2 */ - 0x33333333, /* 3 */ - 0x44444444, /* 4 */ - 0x55555555, /* 5 */ - 0x66666666, /* 6 */ - 0x77777777, /* 7 */ - 0x88888888, /* 8 */ - 0x99999999, /* 9 */ - 0xAAAAAAAA, /* 10 */ - 0xBBBBBBBB, /* 11 */ - 0xCCCCCCCC, /* 12 */ - 0xDDDDDDDD, /* 13 */ - 0xEEEEEEEE, /* 14 */ - 0xFFFFFFFF, /* 15 */ - 0xBBCEDCDB, /* 16 */ - 0xDCCCBBBB, /* 17 */ - 0x9977799E, /* 18 */ - 0x88686999, /* 19 */ - 0x99999855, /* 20 */ - 0x11111119, /* 21 */ - 0x99999111, /* 22 */ - 0xB9999111, /* 23 */ - 0xBBCBBBBB, /* 24 */ - 0x99777798, /* 25 */ - 0x99B99199, /* 26 */ - 0x99195577, /* 27 */ - 0x99999159, /* 28 */ - 0x91111111, /* 29 */ - 0x11111991, /* 30 */ - 0x99999911, /* 31 */ - 0x99911111, /* 32 */ - 0x91999999, /* 33 */ - 0x11991111, /* 34 */ - 0x19111111, /* 35 */ - 0x91991111, /* 36 */ - 0xAAAAA111, /* 37 */ - 0x111111AA, /* 38 */ - 0x71111911, /* 39 */ - 0xAAAAAAA2, /* 40 */ - 0xA2AAAAAA, /* 41 */ - 0xA2AA2AA2, /* 42 */ - 0x99344444, /* 43 */ - 0x99383773, /* 44 */ - 0x33333AAA, /* 45 */ - 0xAAAAA333, /* 46 */ - 0x33344744, /* 47 */ - 0x3333333A, /* 48 */ - 0xAA333333, /* 49 */ - 0xA94AAAAA, /* 50 */ - 0xA33AAAAA, /* 51 */ - 0x33AAAA9A, /* 52 */ - 0x33333355, /* 53 */ - 0x333333A3, /* 54 */ - 0xAAAAA222, /* 55 */ - 0x9922AAAA, /* 56 */ - 0x22222299, /* 57 */ - 0xAA222222, /* 58 */ - 0xAAAAA2AA, /* 59 */ - 0xAAA2AAAA, /* 60 */ - 0x22AAAAA2, /* 61 */ - 0x2222AAA2, /* 62 */ - 0x33333323, /* 63 */ - 0x22233333, /* 64 */ - 0xAAAA2222, /* 65 */ - 0x2AAAAAAA, /* 66 */ - 0x11111AAA, /* 67 */ - 0x111A1A11, /* 68 */ - 0xAAAAAAA1, /* 69 */ - 0x11A1111A, /* 70 */ - 0x1111AA11, /* 71 */ - 0x111111A1, /* 72 */ - 0x111A1111, /* 73 */ - 0x111AAAA1, /* 74 */ - 0x11A11111, /* 75 */ - 0x11117711, /* 76 */ - 0x11117111, /* 77 */ - 0x11111AA1, /* 78 */ - 0xA1111AA1, /* 79 */ - 0x11AAA11A, /* 80 */ - 0x11A111AA, /* 81 */ - 0xA1AAAAA1, /* 82 */ - 0x11111171, /* 83 */ - 0xA11A1111, /* 84 */ - 0x1A111111, /* 85 */ - 0x11111A11, /* 86 */ - 0x1111111A, /* 87 */ - 0x11111979, /* 88 */ - 0xAA111111, /* 89 */ - 0xAA11111A, /* 90 */ - 0x11AAAA1A, /* 91 */ - 0x1AA11111, /* 92 */ - 0x19999999, /* 93 */ - 0x11AA1111, /* 94 */ - 0x1A1AAA11, /* 95 */ - 0xAAAA11A1, /* 96 */ - 0x71111AAA, /* 97 */ - 0xA1111111, /* 98 */ - 0x1AAAAAAA, /* 99 */ - 0x111AA1AA, /* 100 */ - 0x11AAAAAA, /* 101 */ - 0xA1A11111, /* 102 */ - 0x119999A1, /* 103 */ - 0xAA1AAAAA, /* 104 */ - 0xAAA11111, /* 105 */ - 0x111AAAAA, /* 106 */ - 0xAAAAAA1A, /* 107 */ - 0x1AA11AA1, /* 108 */ - 0xAA1111AA, /* 109 */ - 0x1AA11A11, /* 110 */ - 0x11111199, /* 111 */ - 0x1111111E, /* 112 */ - 0x11199111, /* 113 */ - 0x111AAA11, /* 114 */ - 0xA1AA1111, /* 115 */ - 0x1111AAAA, /* 116 */ - 0x11A17111, /* 117 */ - 0x1EAAA999, /* 118 */ - 0xA1111AAA, /* 119 */ - 0x1111AAA1, /* 120 */ - 0x11991119, /* 121 */ - 0x99111111, /* 122 */ - 0xAAA11A1A, /* 123 */ - 0xA11AAAAA, /* 124 */ - 0xAA1A1111, /* 125 */ - 0x111A1AAA, /* 126 */ - 0x11AAAA11, /* 127 */ - 0x1111A1AA, /* 128 */ - 0xA1A111AA, /* 129 */ - 0xAAAA1111, /* 130 */ - 0xAA11AAAA, /* 131 */ - 0xAAAA1AAA, /* 132 */ - 0x91911111, /* 133 */ - 0x19911111, /* 134 */ - 0x21BBBEEE, /* 135 */ - 0x8FFFFFCE, /* 136 */ - 0x99977777, /* 137 */ - 0x99989999, /* 138 */ - 0xE9999999, /* 139 */ - 0x111BBBBB, /* 140 */ - 0xBBBBBB11, /* 141 */ - 0x55551115, /* 142 */ - 0x19996655, /* 143 */ - 0x11111177, /* 144 */ - 0x19999199, /* 145 */ - 0x99191111, /* 146 */ - 0x99111119, /* 147 */ - 0x91919999, /* 148 */ - 0x17111191, /* 149 */ - 0x11119911, /* 150 */ - 0x11199999, /* 151 */ - 0x11999911, /* 152 */ - 0x11111191, /* 153 */ - 0x99997699, /* 154 */ - 0x11999999, /* 155 */ - 0x99199999, /* 156 */ - 0x11119999, /* 157 */ - 0x11111999, /* 158 */ - 0x11115555, /* 159 */ - 0x99919999, /* 160 */ - 0x99999991, /* 161 */ - 0xA1111999, /* 162 */ - 0x99999199, /* 163 */ - 0x1119999E, /* 164 */ - 0x11199AA1, /* 165 */ - 0x11119111, /* 166 */ - 0x19991111, /* 167 */ - 0x99991111, /* 168 */ - 0xAAAA9AAA, /* 169 */ - 0x99AAAAAA, /* 170 */ - 0x1A111A11, /* 171 */ - 0x1111A111, /* 172 */ - 0xAA11A111, /* 173 */ - 0x111A11AA, /* 174 */ - 0x1AAAAAA1, /* 175 */ - 0xA11AAA1A, /* 176 */ - 0x2A211111, /* 177 */ - 0x22222262, /* 178 */ - 0x99333333, /* 179 */ - 0x33933333, /* 180 */ - 0x99891898, /* 181 */ - 0x79999999, /* 182 */ - 0x19996699, /* 183 */ - 0x11119779, /* 184 */ - 0xB3333333, /* 185 */ - 0x99777991, /* 186 */ - 0x17799977, /* 187 */ - 0x11999991, /* 188 */ - 0x92222222, /* 189 */ - 0x2AA2AAA2, /* 190 */ - 0xA2222AAA, /* 191 */ - 0x99999992, /* 192 */ - 0x24444444, /* 193 */ - 0x1AAAA111, /* 194 */ - 0xAAA1AAAA, /* 195 */ - 0x11A1A111, /* 196 */ - 0xA1AAAAAA, /* 197 */ - 0xBBBBB111, /* 198 */ - 0xAAAAABBB, /* 199 */ - 0xAAA11AAA, /* 200 */ - 0x119AAA99, /* 201 */ - 0x11911111, /* 202 */ - 0x55111111, /* 203 */ - 0x33313333, /* 204 */ - 0x31131331, /* 205 */ - 0x33333331, /* 206 */ - 0x33331333, /* 207 */ - 0x11113131, /* 208 */ - 0x31111311, /* 209 */ - 0x33313131, /* 210 */ - 0x31313131, /* 211 */ - 0x13133331, /* 212 */ - 0x33333133, /* 213 */ - 0x11113333, /* 214 */ - 0x33313331, /* 215 */ - 0x11111555, /* 216 */ - 0x99999919, /* 217 */ - 0x11199991, /* 218 */ - 0x99911119, /* 219 */ - 0x111111B1, /* 220 */ -}; - -static eBidiCategory GetBidiCat(PRUint32 u) -{ - PRUint32 pat; - PRUint16 patidx; - - /* Handle blocks which use index table mapping */ - - /* Handle U+0000 to U+33FF */ - if (u<=((PRUint32)0x33FF)) { - patidx = gBidiCatIdx1 [( u >> 3 )]; - } - - /* Handle U+4DC0 to U+4DFF */ - else if ((((PRUint32)0x4DC0)<=u)&&(u<=((PRUint32)0x4DFF))) { - patidx = gBidiCatIdx2 [( (u -(PRUint32) 0x4DC0) >> 3 )]; - } - - /* Handle U+A000 to U+ABFF */ - else if ((((PRUint32)0xA000)<=u)&&(u<=((PRUint32)0xABFF))) { - patidx = gBidiCatIdx3 [( (u -(PRUint32) 0xA000) >> 3 )]; - } - - /* Handle U+D7B0 to U+D7FF */ - else if ((((PRUint32)0xD7B0)<=u)&&(u<=((PRUint32)0xD7FF))) { - patidx = gBidiCatIdx4 [( (u -(PRUint32) 0xD7B0) >> 3 )]; - } - - /* Handle U+F900 to U+1019F */ - else if ((((PRUint32)0xF900)<=u)&&(u<=((PRUint32)0x1019F))) { - patidx = gBidiCatIdx5 [( (u -(PRUint32) 0xF900) >> 3 )]; - } - - /* Handle U+101D0 to U+101FF */ - else if ((((PRUint32)0x101D0)<=u)&&(u<=((PRUint32)0x101FF))) { - patidx = gBidiCatIdx6 [( (u -(PRUint32) 0x101D0) >> 3 )]; - } - - /* Handle U+10280 to U+104FF */ - else if ((((PRUint32)0x10280)<=u)&&(u<=((PRUint32)0x104FF))) { - patidx = gBidiCatIdx7 [( (u -(PRUint32) 0x10280) >> 3 )]; - } - - /* Handle U+10800 to U+1085F */ - else if ((((PRUint32)0x10800)<=u)&&(u<=((PRUint32)0x1085F))) { - patidx = gBidiCatIdx8 [( (u -(PRUint32) 0x10800) >> 3 )]; - } - - /* Handle U+10900 to U+1093F */ - else if ((((PRUint32)0x10900)<=u)&&(u<=((PRUint32)0x1093F))) { - patidx = gBidiCatIdx9 [( (u -(PRUint32) 0x10900) >> 3 )]; - } - - /* Handle U+10980 to U+10A7F */ - else if ((((PRUint32)0x10980)<=u)&&(u<=((PRUint32)0x10A7F))) { - patidx = gBidiCatIdx10 [( (u -(PRUint32) 0x10980) >> 3 )]; - } - - /* Handle U+10B00 to U+10B7F */ - else if ((((PRUint32)0x10B00)<=u)&&(u<=((PRUint32)0x10B7F))) { - patidx = gBidiCatIdx11 [( (u -(PRUint32) 0x10B00) >> 3 )]; - } - - /* Handle U+10C00 to U+10C4F */ - else if ((((PRUint32)0x10C00)<=u)&&(u<=((PRUint32)0x10C4F))) { - patidx = gBidiCatIdx12 [( (u -(PRUint32) 0x10C00) >> 3 )]; - } - - /* Handle U+10E60 to U+10E7F */ - else if ((((PRUint32)0x10E60)<=u)&&(u<=((PRUint32)0x10E7F))) { - patidx = gBidiCatIdx13 [( (u -(PRUint32) 0x10E60) >> 3 )]; - } - - /* Handle U+11000 to U+111FF */ - else if ((((PRUint32)0x11000)<=u)&&(u<=((PRUint32)0x111FF))) { - patidx = gBidiCatIdx14 [( (u -(PRUint32) 0x11000) >> 3 )]; - } - - /* Handle U+11680 to U+116FF */ - else if ((((PRUint32)0x11680)<=u)&&(u<=((PRUint32)0x116FF))) { - patidx = gBidiCatIdx15 [( (u -(PRUint32) 0x11680) >> 3 )]; - } - - /* Handle U+12000 to U+1247F */ - else if ((((PRUint32)0x12000)<=u)&&(u<=((PRUint32)0x1247F))) { - patidx = gBidiCatIdx16 [( (u -(PRUint32) 0x12000) >> 3 )]; - } - - /* Handle U+13000 to U+1342F */ - else if ((((PRUint32)0x13000)<=u)&&(u<=((PRUint32)0x1342F))) { - patidx = gBidiCatIdx17 [( (u -(PRUint32) 0x13000) >> 3 )]; - } - - /* Handle U+16800 to U+16A3F */ - else if ((((PRUint32)0x16800)<=u)&&(u<=((PRUint32)0x16A3F))) { - patidx = gBidiCatIdx18 [( (u -(PRUint32) 0x16800) >> 3 )]; - } - - /* Handle U+16F00 to U+16FFF */ - else if ((((PRUint32)0x16F00)<=u)&&(u<=((PRUint32)0x16FFF))) { - patidx = gBidiCatIdx19 [( (u -(PRUint32) 0x16F00) >> 3 )]; - } - - /* Handle U+1B000 to U+1B00F */ - else if ((((PRUint32)0x1B000)<=u)&&(u<=((PRUint32)0x1B00F))) { - patidx = gBidiCatIdx20 [( (u -(PRUint32) 0x1B000) >> 3 )]; - } - - /* Handle U+1D000 to U+1D7FF */ - else if ((((PRUint32)0x1D000)<=u)&&(u<=((PRUint32)0x1D7FF))) { - patidx = gBidiCatIdx21 [( (u -(PRUint32) 0x1D000) >> 3 )]; - } - - /* Handle U+1EE00 to U+1EEFF */ - else if ((((PRUint32)0x1EE00)<=u)&&(u<=((PRUint32)0x1EEFF))) { - patidx = gBidiCatIdx22 [( (u -(PRUint32) 0x1EE00) >> 3 )]; - } - - /* Handle U+1F000 to U+1F77F */ - else if ((((PRUint32)0x1F000)<=u)&&(u<=((PRUint32)0x1F77F))) { - patidx = gBidiCatIdx23 [( (u -(PRUint32) 0x1F000) >> 3 )]; - } - - /* Handle U+2F800 to U+2FA1F */ - else if ((((PRUint32)0x2F800)<=u)&&(u<=((PRUint32)0x2FA1F))) { - patidx = gBidiCatIdx24 [( (u -(PRUint32) 0x2F800) >> 3 )]; - } - - /* Handle U+E0000 to U+E01FF */ - else if ((((PRUint32)0xE0000)<=u)&&(u<=((PRUint32)0xE01FF))) { - patidx = gBidiCatIdx25 [( (u -(PRUint32) 0xE0000) >> 3 )]; - } - - else { - /* defaults for unassigned characters - * see http://www.unicode.org/Public/UNIDATA/extracted/DerivedBidiClass.txt - * and http://www.unicode.org/Public/UNIDATA/Blocks.txt - */ - if (((u >= 0x0590) && (u <= 0x05FF)) || - ((u >= 0x07C0) && (u <= 0x08FF)) || - ((u >= 0xFB1D) && (u <= 0xFB4F)) || - ((u >= 0x10800) && (u <=0x10FFF))) - return eBidiCat_R; - else if (((u >= 0x0600) && (u <= 0x07BF)) || - ((u >= 0xFB50) && (u <= 0xFDFF)) || - ((u >= 0xFE70) && (u <= 0xFEFE))) - return eBidiCat_AL; - else - return eBidiCat_L; - } - - if (patidx < 0x10) - return (eBidiCategory)patidx; - else { - pat = gBidiCatPat[patidx]; - return (eBidiCategory)((pat >> ((u % 8) * 4)) & 0x0F); - } -} - -/* total data size = 4518 */ diff --git a/intl/unicharutil/util/genbidicattable.pl b/intl/unicharutil/util/genbidicattable.pl deleted file mode 100644 index 7429bb65f73..00000000000 --- a/intl/unicharutil/util/genbidicattable.pl +++ /dev/null @@ -1,417 +0,0 @@ -#!/usr/local/bin/perl -# -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# IBM Corporation. -# Portions created by the Initial Developer are Copyright (C) 2000 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# -# Alternatively, the contents of this file may be used under the terms of -# either of the GNU General Public License Version 2 or later (the "GPL"), -# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** - -###################################################################### -# -# Initial global variable -# -###################################################################### - -%gcount = (); -%pat = (); - -%map = ( - "L" => "1", # Left-to-Right - "R" => "2", # Right-to-Left - "AL" => "3", # Right-to-Left Arabic - "AN" => "4", # Arabic Number - "EN" => "5", # European Number - "ES" => "6", # European Number Separator - "ET" => "7", # European Number Terminator - "CS" => "8", # Common Number Separator - "ON" => "9", # Other Neutrals - "NSM" => "10", # Non-Spacing Mark - "BN" => "11", # Boundary Neutral - "B" => "12", # Paragraph Separator - "S" => "13", # Segment Separator - "WS" => "14", # Whitespace - "LRE" => "15", # Left-to-Right Embedding - "RLE" => "15", # Right-to-Left Embedding - "PDF" => "15", # Pop Directional Format - "LRO" => "15", # Left-to-Right Override - "RLO" => "15" # Right-to-Left Override -); - -%special = (); - -###################################################################### -# -# Open the unicode database file -# -###################################################################### -open ( UNICODATA , "< UnicodeData-Latest.txt") - || die "cannot find UnicodeData-Latest.txt"; - -###################################################################### -# -# Open the output file -# -###################################################################### -open ( OUT , "> bidicattable.h") - || die "cannot open output bidicattable.h file"; - -###################################################################### -# -# Generate license and header -# -###################################################################### -$npl = <) { - chop; - ###################################################################### - # - # Get value from fields - # - ###################################################################### - @f = split(/;/ , $_); - $c = $f[0]; # The unicode value - $n = $f[1]; # The unicode name - $g = $f[2]; # The General Category - $b = $f[4]; # The Bidi Category - - if(( substr($n, 0, 1) ne "<") || ($n eq "")) - { - # - # print $g; - # - - $gcount{$b}++; - $bidicategory{$c} = $b; - } else { - - # Handle special block - @pair=split(/, /, $n ); - $catnum = $map{$b}; - - # printf "[%s][%s] => %d\n", $pair[0], $pair[1], $catnum; - if( $pair[1] eq "First>") { - $sl{$pair[0]} = $c; - $sc{$pair[0]} = $catnum; - } elsif ( $pair[1] eq "Last>") { - $sh{$pair[0]} = $c; - if($sc{$pair[0]} ne $catnum) - { - print "WARNING !!!! error in handling special block\n\n"; - } - } else { - print "WARNING !!!! error in handling special block\n\n"; - } - } -} - -# XXX - How can this be made more flexible as new blocks are added to the UCDB? - -@range = ( - 0x0000, 0x33ff, - 0x4dc0, 0x4dff, - 0xa000, 0xabff, - 0xd7b0, 0xd7ff, - 0xf900, 0x1019f, - 0x101d0, 0x101ff, - 0x10280, 0x104ff, - 0x10800, 0x1085f, - 0x10900, 0x1093f, - 0x10980, 0x10a7f, - 0x10b00, 0x10b7f, - 0x10c00, 0x10c4f, - 0x10e60, 0x10e7f, - 0x11000, 0x111ff, - 0x11680, 0x116ff, - 0x12000, 0x1247f, - 0x13000, 0x1342f, - 0x16800, 0x16a3f, - 0x16f00, 0x16fff, - 0x1b000, 0x1b00f, - 0x1d000, 0x1d7ff, - 0x1ee00, 0x1eeff, - 0x1f000, 0x1f77f, - 0x2f800, 0x2fa1f, - 0xe0000, 0xe01ff -); - - -$totaldata = 0; - -$tt=($#range+1) / 2; -@patarray = (); - - -# This should improve performance: put all the patterns like 0x11111111, 0x22222222 etc at the beginning of the table. -# Since there are a lot of blocks with the same category, we should be able to save a lot of time extracting the digits -for (0..15) { - $pattern = "0x".(sprintf("%X", $_) x 8); - $patarray[$_] = $pattern; - $pat{$pattern} = $_; -} - -$newidx = 0x10; - -for($t = 1; $t <= $tt; $t++) -{ - $tl = $range[($t-1) * 2]; - $th = $range[($t-1) * 2 + 1]; - $ts = ( $th - $tl ) >> 3; - $totaldata += $ts + 1; - printf OUT "static PRUint8 gBidiCatIdx%d[%d] = {\n", $t, $ts + 1; - for($i = ($tl >> 3); $i <= ($th >> 3) ; $i ++ ) - { - $data = 0; - - for($j = 0; $j < 8 ; $j++) - { - #defaults for unassigned characters - #see http://www.unicode.org/Public/UNIDATA/extracted/DerivedBidiClass.txt - #and http://www.unicode.org/Public/UNIDATA/Blocks.txt - $test = ($i << 3) + $j; - if ((($test >= 0x0590) && ($test <= 0x5FF)) || - (($test >= 0x07C0) && ($test <= 0x89F)) || - (($test >= 0xFB1D) && ($test <= 0xFB4F)) || - (($test >= 0x10800) && ($test <=0x10FFF)) || - (($test >= 0x1E800) && ($test <=0x1EDFF)) || - (($test >= 0x1EF00) && ($test <=0x1EFFF))) - { - $default = $map{"R"}; - } elsif ((($test >= 0x0600) && ($test <= 0x7BF)) || - (($test >= 0x08A0) && ($test <= 0x08FF)) || - (($test >= 0xFB50) && ($test <= 0xFDFF)) || - (($test >= 0xFE70) && ($test <= 0xFEFE)) || - (($test >= 0x1EE00) && ($test <= 0x1EEFF))) - { - $default = $map{"AL"}; - } else - { - $default = $map{"L"}; - } - $k = sprintf("%04X", (($i << 3) + $j)); - - $cat = $bidicategory{$k}; - if( $cat eq "") - { - $data = $data + ($default << (4*$j)); - } else { - $data = $data + ($map{$cat} << (4*$j)); - } - - } - $pattern = sprintf("0x%08X", $data); - - $idx = $pat{$pattern}; - unless( exists($pat{$pattern})){ - $idx = $newidx++; - $patarray[$idx] = $pattern; - $pat{$pattern} = $idx; - } - - printf OUT " %3d, /* U+%04X - U+%04X : %s */\n" , - $idx, ($i << 3),((($i +1)<< 3)-1), $pattern ; - - - } - printf OUT "};\n\n"; - - if($t ne $tt) - { - $tl = $range[($t-1) * 2 + 1] + 1; - $th = $range[$t * 2] - 1; - for($i = ($tl >> 3); $i <= ($th >> 3) ; $i ++ ) - { - $data = 0; - for($j = 0; $j < 8 ; $j++) - { - $k = sprintf("%04X", (($i << 3) + $j)); - - $cat = $bidicategory{$k}; - if( $cat ne "") - { - $data = $data + ($map{$cat} << (4*$j)); - } - } - $pattern = sprintf("0x%08X", $data); - if($data ne 0) - { - print "WARNING, Unicode Database now contain characters" . - "which we have not consider, change this program !!!\n\n"; - printf "Problem- U+%04X - U+%04X range\n", ($i << 3),((($i +1)<< 3)-1); - } - } - } -} - - -if($newidx > 255) -{ - die "We have more than 255 patterns !!! - $newidx\n\n" . - "This program is now broken!!!\n\n\n"; - -} -printf OUT "static PRUint32 gBidiCatPat[$newidx] = {\n"; -for($i = 0 ; $i < $newidx; $i++) -{ - printf OUT " %s, /* $i */\n", $patarray[$i] ; -} -printf OUT "};\n\n"; -$totaldata += $newidx * 4; - -printf OUT "static eBidiCategory GetBidiCat(PRUint32 u)\n{\n"; -printf OUT " PRUint32 pat;\n"; -printf OUT " PRUint16 patidx;\n\n"; - -@special = keys(%sh); -$sp = 0; -foreach $s ( sort(@special) ) { - # don't bother to define the special blocks unless they have a different - # value from the default they would be given if they were undefined - unless ($sc{$s} == $map{"L"}) { - unless ($sp++) { - %by_value = reverse %map; - printf OUT " /* Handle blocks which share the same category */\n\n"; - } - printf OUT " /* Handle %s block */\n", substr($s, 1); - printf OUT " if((((PRUint32)0x%s)<=u)&&(u<=((PRUint32)0x%s))) \n", $sl{$s}, $sh{$s}; - printf OUT " return eBidiCat_$by_value{$sc{$s}}; \n\n"; - } -} - -printf OUT " /* Handle blocks which use index table mapping */ \n\n"; -for($t = 1; $t <= $tt; $t++) -{ - $tl = $range[($t-1) * 2]; - $th = $range[($t-1) * 2 + 1]; - if ($tl == 0) { - printf OUT " /* Handle U+%04X to U+%04X */\n", $tl, $th; - printf OUT " if (u<=((PRUint32)0x%04X)) {\n", $th; - printf OUT " patidx = gBidiCatIdx%d [( u >> 3 )];\n", $t; - } else { - printf OUT " /* Handle U+%04X to U+%04X */\n", $tl, $th; - printf OUT " else if ((((PRUint32)0x%04X)<=u)&&(u<=((PRUint32)0x%04X))) {\n", $tl, $th; - printf OUT " patidx = gBidiCatIdx%d [( (u -(PRUint32) 0x%04X) >> 3 )];\n", $t, $tl; - } - printf OUT " }\n\n"; -} -printf OUT " else {\n"; -printf OUT " /* defaults for unassigned characters\n"; -printf OUT " * see http://www.unicode.org/Public/UNIDATA/extracted/DerivedBidiClass.txt\n"; -printf OUT " * and http://www.unicode.org/Public/UNIDATA/Blocks.txt\n"; -printf OUT " */\n"; -printf OUT " if (((u >= 0x0590) && (u <= 0x05FF)) ||\n"; -printf OUT " ((u >= 0x07C0) && (u <= 0x08FF)) ||\n"; -printf OUT " ((u >= 0xFB1D) && (u <= 0xFB4F)) ||\n"; -printf OUT " ((u >= 0x10800) && (u <=0x10FFF)))\n"; -printf OUT " return eBidiCat_R;\n"; -printf OUT " else if (((u >= 0x0600) && (u <= 0x07BF)) ||\n"; -printf OUT " ((u >= 0xFB50) && (u <= 0xFDFF)) ||\n"; -printf OUT " ((u >= 0xFE70) && (u <= 0xFEFE)))\n"; -printf OUT " return eBidiCat_AL;\n"; -printf OUT " else\n"; -printf OUT " return eBidiCat_L;\n"; -printf OUT " }\n\n"; - -printf OUT " if (patidx < 0x10)\n"; -printf OUT " return (eBidiCategory)patidx;\n"; -printf OUT " else {\n"; -printf OUT " pat = gBidiCatPat[patidx];\n"; -printf OUT " return (eBidiCategory)((pat >> ((u % 8) * 4)) & 0x0F);\n"; -printf OUT " }\n}\n\n"; - -printf OUT "/* total data size = $totaldata */\n"; -print "total = $totaldata\n"; - -###################################################################### -# -# Close files -# -###################################################################### -close(UNIDATA); -close(OUT); - diff --git a/intl/unicharutil/util/nsBidiUtils.cpp b/intl/unicharutil/util/nsBidiUtils.cpp index 34a3e3369e7..9bb240a3097 100644 --- a/intl/unicharutil/util/nsBidiUtils.cpp +++ b/intl/unicharutil/util/nsBidiUtils.cpp @@ -41,34 +41,8 @@ * * ***** END LICENSE BLOCK ***** */ #include "nsBidiUtils.h" -#include "bidicattable.h" #include "nsCharTraits.h" - -static nsCharType ebc2ucd[15] = { - eCharType_OtherNeutral, /* Placeholder -- there will never be a 0 index value */ - eCharType_LeftToRight, - eCharType_RightToLeft, - eCharType_RightToLeftArabic, - eCharType_ArabicNumber, - eCharType_EuropeanNumber, - eCharType_EuropeanNumberSeparator, - eCharType_EuropeanNumberTerminator, - eCharType_CommonNumberSeparator, - eCharType_OtherNeutral, - eCharType_DirNonSpacingMark, - eCharType_BoundaryNeutral, - eCharType_BlockSeparator, - eCharType_SegmentSeparator, - eCharType_WhiteSpaceNeutral -}; - -static nsCharType cc2ucd[5] = { - eCharType_LeftToRightEmbedding, - eCharType_RightToLeftEmbedding, - eCharType_PopDirectionalFormat, - eCharType_LeftToRightOverride, - eCharType_RightToLeftOverride -}; +#include "nsUnicodeProperties.h" #define ARABIC_TO_HINDI_DIGIT_INCREMENT (START_HINDI_DIGITS - START_ARABIC_DIGITS) #define PERSIAN_TO_HINDI_DIGIT_INCREMENT (START_HINDI_DIGITS - START_FARSI_DIGITS) @@ -148,12 +122,14 @@ nsresult HandleNumbers(PRUnichar* aBuffer, PRUint32 aSize, PRUint32 aNumFlag) } #define LRM_CHAR 0x200e +#define LRE_CHAR 0x202a +#define RLO_CHAR 0x202e bool IsBidiControl(PRUint32 aChar) { // This method is used when stripping Bidi control characters for - // display, so it will return TRUE for LRM and RLM as - // well as the characters with category eBidiCat_CC - return (eBidiCat_CC == GetBidiCat(aChar) || ((aChar)&0xfffffe)==LRM_CHAR); + // display, so it will return TRUE for LRM, RLM, LRE, RLE, PDF, LRO and RLO + return ((LRE_CHAR <= aChar && aChar <= RLO_CHAR) || + ((aChar)&0xfffffe)==LRM_CHAR); } bool HasRTLChars(const nsAString& aString) @@ -171,23 +147,3 @@ bool HasRTLChars(const nsAString& aString) } return false; } - -nsCharType GetCharType(PRUint32 aChar) -{ - nsCharType oResult; - eBidiCategory bCat = GetBidiCat(aChar); - if (eBidiCat_CC != bCat) { - NS_ASSERTION((PRUint32) bCat < (sizeof(ebc2ucd)/sizeof(nsCharType)), "size mismatch"); - if((PRUint32) bCat < (sizeof(ebc2ucd)/sizeof(nsCharType))) - oResult = ebc2ucd[bCat]; - else - oResult = ebc2ucd[0]; // something is very wrong, but we need to return a value - } else { - NS_ASSERTION((aChar-0x202a) < (sizeof(cc2ucd)/sizeof(nsCharType)), "size mismatch"); - if((aChar-0x202a) < (sizeof(cc2ucd)/sizeof(nsCharType))) - oResult = cc2ucd[aChar - 0x202a]; - else - oResult = ebc2ucd[0]; // something is very wrong, but we need to return a value - } - return oResult; -} diff --git a/intl/unicharutil/util/nsBidiUtils.h b/intl/unicharutil/util/nsBidiUtils.h index d404953ebe5..62d410215d0 100644 --- a/intl/unicharutil/util/nsBidiUtils.h +++ b/intl/unicharutil/util/nsBidiUtils.h @@ -49,35 +49,10 @@ * section BIDIRECTIONAL PROPERTIES * for the detailed definition of the following categories * - * The values here must match the equivalents in %map in - * mozilla/intl/unicharutil/tools/genbidicattable.pl + * The values here must match the equivalents in %bidicategorycode in + * mozilla/intl/unicharutil/tools/genUnicodePropertyData.pl */ -typedef enum { - eBidiCat_Undefined, - eBidiCat_L, /* Left-to-Right */ - eBidiCat_R, /* Right-to-Left */ - eBidiCat_AL, /* Right-to-Left Arabic */ - eBidiCat_AN, /* Arabic Number */ - eBidiCat_EN, /* European Number */ - eBidiCat_ES, /* European Number Separator */ - eBidiCat_ET, /* European Number Terminator */ - eBidiCat_CS, /* Common Number Separator */ - eBidiCat_ON, /* Other Neutrals */ - eBidiCat_NSM, /* Non-Spacing Mark */ - eBidiCat_BN, /* Boundary Neutral */ - eBidiCat_B, /* Paragraph Separator */ - eBidiCat_S, /* Segment Separator */ - eBidiCat_WS, /* Whitespace */ - eBidiCat_CC = 0xf, /* Control Code */ - /* (internal use only - will never be outputed) */ - eBidiCat_LRE = 0x2a, /* Left-to-Right Embedding */ - eBidiCat_RLE = 0x2b, /* Right-to-Left Embedding */ - eBidiCat_PDF = 0x2c, /* Pop Directional Formatting */ - eBidiCat_LRO = 0x2d, /* Left-to-Right Override */ - eBidiCat_RLO = 0x2e /* Right-to-Left Override */ -} eBidiCategory; - enum nsCharType { eCharType_LeftToRight = 0, eCharType_RightToLeft = 1, @@ -141,11 +116,6 @@ typedef enum nsCharType nsCharType; */ nsresult HandleNumbers(PRUnichar* aBuffer, PRUint32 aSize, PRUint32 aNumFlag); - /** - * Give a UTF-32 codepoint, return a nsCharType (compatible with ICU) - */ - nsCharType GetCharType(PRUint32 aChar); - /** * Give a UTF-32 codepoint * return true if the codepoint is a Bidi control character (LRE, RLE, PDF, LRO, RLO, LRM, RLM) diff --git a/layout/base/nsBidi.cpp b/layout/base/nsBidi.cpp index b291c98d23d..840a95f157f 100644 --- a/layout/base/nsBidi.cpp +++ b/layout/base/nsBidi.cpp @@ -40,9 +40,11 @@ #include "prmem.h" #include "nsBidi.h" -#include "nsBidiUtils.h" +#include "nsUnicodeProperties.h" #include "nsCRT.h" +using namespace mozilla::unicode; + // These are #defined in under Solaris 10 x86 #undef CS #undef ES @@ -460,11 +462,11 @@ void nsBidi::GetDirProps(const PRUnichar *aText) uchar=aText[i]; if(!IS_FIRST_SURROGATE(uchar) || i+1==length || !IS_SECOND_SURROGATE(aText[i+1])) { /* not a surrogate pair */ - flags|=DIRPROP_FLAG(dirProps[i]=dirProp=GetCharType((PRUint32)uchar)); + flags|=DIRPROP_FLAG(dirProps[i]=dirProp=GetBidiCat((PRUint32)uchar)); } else { /* a surrogate pair */ dirProps[i++]=BN; /* first surrogate in the pair gets the BN type */ - flags|=DIRPROP_FLAG(dirProps[i]=dirProp=GetCharType(GET_UTF_32(uchar, aText[i])))|DIRPROP_FLAG(BN); + flags|=DIRPROP_FLAG(dirProps[i]=dirProp=GetBidiCat(GET_UTF_32(uchar, aText[i])))|DIRPROP_FLAG(BN); } ++i; if(dirProp==L) { @@ -490,11 +492,11 @@ void nsBidi::GetDirProps(const PRUnichar *aText) uchar=aText[i]; if(!IS_FIRST_SURROGATE(uchar) || i+1==length || !IS_SECOND_SURROGATE(aText[i+1])) { /* not a surrogate pair */ - flags|=DIRPROP_FLAG(dirProps[i]=GetCharType((PRUint32)uchar)); + flags|=DIRPROP_FLAG(dirProps[i]=GetBidiCat((PRUint32)uchar)); } else { /* a surrogate pair */ dirProps[i++]=BN; /* second surrogate in the pair gets the BN type */ - flags|=DIRPROP_FLAG(dirProps[i]=GetCharType(GET_UTF_32(uchar, aText[i])))|DIRPROP_FLAG(BN); + flags|=DIRPROP_FLAG(dirProps[i]=GetBidiCat(GET_UTF_32(uchar, aText[i])))|DIRPROP_FLAG(BN); } ++i; } From c2722c9ee2952e91ec999be8d09dc170d7f806f4 Mon Sep 17 00:00:00 2001 From: Simon Montagu Date: Wed, 18 Apr 2012 21:54:54 -0700 Subject: [PATCH 016/182] bug 738101 - Use the new mozilla::unicode::GetIdentifierModification instead of the old ccmap in IsDefaultIgnorable. This is the last client for precompiled ccmaps, so remove the infrastructure for them at the same time. r=jfkthame --- content/base/src/nsContentUtils.cpp | 1 - gfx/thebes/gfxFont.cpp | 9 +- gfx/thebes/ignorable.x-ccmap | 4575 ------------------- intl/unicharutil/src/nsSaveAsCharset.cpp | 1 - intl/unicharutil/tools/ccmapbin.pl | 606 --- intl/unicharutil/tools/genignorable.pl | 66 - intl/unicharutil/util/Makefile.in | 1 - intl/unicharutil/util/nsCompressedCharMap.h | 328 -- 8 files changed, 4 insertions(+), 5583 deletions(-) delete mode 100644 gfx/thebes/ignorable.x-ccmap delete mode 100755 intl/unicharutil/tools/ccmapbin.pl delete mode 100644 intl/unicharutil/tools/genignorable.pl delete mode 100644 intl/unicharutil/util/nsCompressedCharMap.h diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp index b252ba0e629..c1b9fd51aeb 100644 --- a/content/base/src/nsContentUtils.cpp +++ b/content/base/src/nsContentUtils.cpp @@ -141,7 +141,6 @@ static NS_DEFINE_CID(kXTFServiceCID, NS_XTFSERVICE_CID); #include "nsIMEStateManager.h" #include "nsContentErrors.h" #include "nsUnicharUtilCIID.h" -#include "nsCompressedCharMap.h" #include "nsINativeKeyBindings.h" #include "nsIDOMNSEvent.h" #include "nsXULPopupManager.h" diff --git a/gfx/thebes/gfxFont.cpp b/gfx/thebes/gfxFont.cpp index 09237642ba5..244152f5b21 100644 --- a/gfx/thebes/gfxFont.cpp +++ b/gfx/thebes/gfxFont.cpp @@ -65,7 +65,6 @@ #include "nsMathUtils.h" #include "nsBidiUtils.h" #include "nsUnicodeRange.h" -#include "nsCompressedCharMap.h" #include "nsStyleConsts.h" #include "mozilla/Preferences.h" #include "mozilla/Services.h" @@ -4172,13 +4171,13 @@ gfxShapedWord::SetGlyphs(PRUint32 aIndex, CompressedGlyph aGlyph, mCharacterGlyphs[aIndex] = aGlyph; } -#include "ignorable.x-ccmap" -DEFINE_X_CCMAP(gIgnorableCCMapExt, const); - +#define ZWNJ 0x200C +#define ZWJ 0x200D static inline bool IsDefaultIgnorable(PRUint32 aChar) { - return CCMAP_HAS_CHAR_EXT(gIgnorableCCMapExt, aChar); + return GetIdentifierModification(aChar) == XIDMOD_DEFAULT_IGNORABLE || + aChar == ZWNJ || aChar == ZWJ; } void diff --git a/gfx/thebes/ignorable.x-ccmap b/gfx/thebes/ignorable.x-ccmap deleted file mode 100644 index a3e6cc8af3b..00000000000 --- a/gfx/thebes/ignorable.x-ccmap +++ /dev/null @@ -1,4575 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Masatoshi Kimura - * Portions created by the Initial Developer are Copyright (C) 2010 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - - /*======================================================== - This file contains a precompiled CCMap for a class of Unicode - characters (ignoreable) to be identified quickly by Mozilla. - It was generated by ccmapbin.pl which you can find under - mozilla/intl/unicharutil/tools. - - Enumerated below are characters included in the precompiled CCMap - which is human-readable but not so human-friendly. If you - needs to modify the list of characters belonging to "ignoreable", - you have to make a new file (with the name of your choice) - listing characters (one character per line) you want to put - into "ignoreable" in the format - - 0xuuuu // comment - - In addition, the input file can have the following optional lines that - read - - VARIABLE::gIgnorableCCMapExt - CLASS::ignoreable - DESCRIPTION:: description of a character class - FILE:: mozilla source file to include the output file - - - Then, run the following in the current directory. - - perl ccmapbin.pl input_file [gIgnorableCCMapExt [ignoreable]] - - which will generate ignoreable.ccmap (or ignoreable.x-ccmap if the ccmap - includes non-BMP characters.). gIgnorableCCMapExt is used as the prefix - in macros for the array initializer and the array size. - - (see bug 180266, bug 167136, and bug 224337) - - */ - - -/* - VARIABLE:: gIgnorableCCMapExt - CLASS:: ignoreable - - 0X0000AD : SOFT HYPHEN - 0X00034F : COMBINING GRAPHEME JOINER - 0X00115F : HANGUL CHOSEONG FILLER - 0X001160 : HANGUL JUNGSEONG FILLER - 0X0017B4 : KHMER VOWEL INHERENT AQ - 0X0017B5 : KHMER VOWEL INHERENT AA - 0X00180B : MONGOLIAN FREE VARIATION SELECTOR ONE - 0X00180C : MONGOLIAN FREE VARIATION SELECTOR TWO - 0X00180D : MONGOLIAN FREE VARIATION SELECTOR THREE - 0X00200B : ZERO WIDTH SPACE - 0X00200C : ZERO WIDTH NON-JOINER - 0X00200D : ZERO WIDTH JOINER - 0X00200E : LEFT-TO-RIGHT MARK - 0X00200F : RIGHT-TO-LEFT MARK - 0X00202A : LEFT-TO-RIGHT EMBEDDING - 0X00202B : RIGHT-TO-LEFT EMBEDDING - 0X00202C : POP DIRECTIONAL FORMATTING - 0X00202D : LEFT-TO-RIGHT OVERRIDE - 0X00202E : RIGHT-TO-LEFT OVERRIDE - 0X002060 : WORD JOINER - 0X002061 : FUNCTION APPLICATION - 0X002062 : INVISIBLE TIMES - 0X002063 : INVISIBLE SEPARATOR - 0X002064 : INVISIBLE PLUS - 0X002065 : - 0X002066 : - 0X002067 : - 0X002068 : - 0X002069 : - 0X00206A : INHIBIT SYMMETRIC SWAPPING - 0X00206B : ACTIVATE SYMMETRIC SWAPPING - 0X00206C : INHIBIT ARABIC FORM SHAPING - 0X00206D : ACTIVATE ARABIC FORM SHAPING - 0X00206E : NATIONAL DIGIT SHAPES - 0X00206F : NOMINAL DIGIT SHAPES - 0X003164 : HANGUL FILLER - 0X00FE00 : VARIATION SELECTOR-1 - 0X00FE01 : VARIATION SELECTOR-2 - 0X00FE02 : VARIATION SELECTOR-3 - 0X00FE03 : VARIATION SELECTOR-4 - 0X00FE04 : VARIATION SELECTOR-5 - 0X00FE05 : VARIATION SELECTOR-6 - 0X00FE06 : VARIATION SELECTOR-7 - 0X00FE07 : VARIATION SELECTOR-8 - 0X00FE08 : VARIATION SELECTOR-9 - 0X00FE09 : VARIATION SELECTOR-10 - 0X00FE0A : VARIATION SELECTOR-11 - 0X00FE0B : VARIATION SELECTOR-12 - 0X00FE0C : VARIATION SELECTOR-13 - 0X00FE0D : VARIATION SELECTOR-14 - 0X00FE0E : VARIATION SELECTOR-15 - 0X00FE0F : VARIATION SELECTOR-16 - 0X00FEFF : ZERO WIDTH NO-BREAK SPACE - 0X00FFA0 : HALFWIDTH HANGUL FILLER - 0X00FFF0 : - 0X00FFF1 : - 0X00FFF2 : - 0X00FFF3 : - 0X00FFF4 : - 0X00FFF5 : - 0X00FFF6 : - 0X00FFF7 : - 0X00FFF8 : - 0X01D173 : MUSICAL SYMBOL BEGIN BEAM - 0X01D174 : MUSICAL SYMBOL END BEAM - 0X01D175 : MUSICAL SYMBOL BEGIN TIE - 0X01D176 : MUSICAL SYMBOL END TIE - 0X01D177 : MUSICAL SYMBOL BEGIN SLUR - 0X01D178 : MUSICAL SYMBOL END SLUR - 0X01D179 : MUSICAL SYMBOL BEGIN PHRASE - 0X01D17A : MUSICAL SYMBOL END PHRASE - 0X0E0000 : - 0X0E0001 : LANGUAGE TAG - 0X0E0002 : - 0X0E0003 : - 0X0E0004 : - 0X0E0005 : - 0X0E0006 : - 0X0E0007 : - 0X0E0008 : - 0X0E0009 : - 0X0E000A : - 0X0E000B : - 0X0E000C : - 0X0E000D : - 0X0E000E : - 0X0E000F : - 0X0E0010 : - 0X0E0011 : - 0X0E0012 : - 0X0E0013 : - 0X0E0014 : - 0X0E0015 : - 0X0E0016 : - 0X0E0017 : - 0X0E0018 : - 0X0E0019 : - 0X0E001A : - 0X0E001B : - 0X0E001C : - 0X0E001D : - 0X0E001E : - 0X0E001F : - 0X0E0020 : TAG SPACE - 0X0E0021 : TAG EXCLAMATION MARK - 0X0E0022 : TAG QUOTATION MARK - 0X0E0023 : TAG NUMBER SIGN - 0X0E0024 : TAG DOLLAR SIGN - 0X0E0025 : TAG PERCENT SIGN - 0X0E0026 : TAG AMPERSAND - 0X0E0027 : TAG APOSTROPHE - 0X0E0028 : TAG LEFT PARENTHESIS - 0X0E0029 : TAG RIGHT PARENTHESIS - 0X0E002A : TAG ASTERISK - 0X0E002B : TAG PLUS SIGN - 0X0E002C : TAG COMMA - 0X0E002D : TAG HYPHEN-MINUS - 0X0E002E : TAG FULL STOP - 0X0E002F : TAG SOLIDUS - 0X0E0030 : TAG DIGIT ZERO - 0X0E0031 : TAG DIGIT ONE - 0X0E0032 : TAG DIGIT TWO - 0X0E0033 : TAG DIGIT THREE - 0X0E0034 : TAG DIGIT FOUR - 0X0E0035 : TAG DIGIT FIVE - 0X0E0036 : TAG DIGIT SIX - 0X0E0037 : TAG DIGIT SEVEN - 0X0E0038 : TAG DIGIT EIGHT - 0X0E0039 : TAG DIGIT NINE - 0X0E003A : TAG COLON - 0X0E003B : TAG SEMICOLON - 0X0E003C : TAG LESS-THAN SIGN - 0X0E003D : TAG EQUALS SIGN - 0X0E003E : TAG GREATER-THAN SIGN - 0X0E003F : TAG QUESTION MARK - 0X0E0040 : TAG COMMERCIAL AT - 0X0E0041 : TAG LATIN CAPITAL LETTER A - 0X0E0042 : TAG LATIN CAPITAL LETTER B - 0X0E0043 : TAG LATIN CAPITAL LETTER C - 0X0E0044 : TAG LATIN CAPITAL LETTER D - 0X0E0045 : TAG LATIN CAPITAL LETTER E - 0X0E0046 : TAG LATIN CAPITAL LETTER F - 0X0E0047 : TAG LATIN CAPITAL LETTER G - 0X0E0048 : TAG LATIN CAPITAL LETTER H - 0X0E0049 : TAG LATIN CAPITAL LETTER I - 0X0E004A : TAG LATIN CAPITAL LETTER J - 0X0E004B : TAG LATIN CAPITAL LETTER K - 0X0E004C : TAG LATIN CAPITAL LETTER L - 0X0E004D : TAG LATIN CAPITAL LETTER M - 0X0E004E : TAG LATIN CAPITAL LETTER N - 0X0E004F : TAG LATIN CAPITAL LETTER O - 0X0E0050 : TAG LATIN CAPITAL LETTER P - 0X0E0051 : TAG LATIN CAPITAL LETTER Q - 0X0E0052 : TAG LATIN CAPITAL LETTER R - 0X0E0053 : TAG LATIN CAPITAL LETTER S - 0X0E0054 : TAG LATIN CAPITAL LETTER T - 0X0E0055 : TAG LATIN CAPITAL LETTER U - 0X0E0056 : TAG LATIN CAPITAL LETTER V - 0X0E0057 : TAG LATIN CAPITAL LETTER W - 0X0E0058 : TAG LATIN CAPITAL LETTER X - 0X0E0059 : TAG LATIN CAPITAL LETTER Y - 0X0E005A : TAG LATIN CAPITAL LETTER Z - 0X0E005B : TAG LEFT SQUARE BRACKET - 0X0E005C : TAG REVERSE SOLIDUS - 0X0E005D : TAG RIGHT SQUARE BRACKET - 0X0E005E : TAG CIRCUMFLEX ACCENT - 0X0E005F : TAG LOW LINE - 0X0E0060 : TAG GRAVE ACCENT - 0X0E0061 : TAG LATIN SMALL LETTER A - 0X0E0062 : TAG LATIN SMALL LETTER B - 0X0E0063 : TAG LATIN SMALL LETTER C - 0X0E0064 : TAG LATIN SMALL LETTER D - 0X0E0065 : TAG LATIN SMALL LETTER E - 0X0E0066 : TAG LATIN SMALL LETTER F - 0X0E0067 : TAG LATIN SMALL LETTER G - 0X0E0068 : TAG LATIN SMALL LETTER H - 0X0E0069 : TAG LATIN SMALL LETTER I - 0X0E006A : TAG LATIN SMALL LETTER J - 0X0E006B : TAG LATIN SMALL LETTER K - 0X0E006C : TAG LATIN SMALL LETTER L - 0X0E006D : TAG LATIN SMALL LETTER M - 0X0E006E : TAG LATIN SMALL LETTER N - 0X0E006F : TAG LATIN SMALL LETTER O - 0X0E0070 : TAG LATIN SMALL LETTER P - 0X0E0071 : TAG LATIN SMALL LETTER Q - 0X0E0072 : TAG LATIN SMALL LETTER R - 0X0E0073 : TAG LATIN SMALL LETTER S - 0X0E0074 : TAG LATIN SMALL LETTER T - 0X0E0075 : TAG LATIN SMALL LETTER U - 0X0E0076 : TAG LATIN SMALL LETTER V - 0X0E0077 : TAG LATIN SMALL LETTER W - 0X0E0078 : TAG LATIN SMALL LETTER X - 0X0E0079 : TAG LATIN SMALL LETTER Y - 0X0E007A : TAG LATIN SMALL LETTER Z - 0X0E007B : TAG LEFT CURLY BRACKET - 0X0E007C : TAG VERTICAL LINE - 0X0E007D : TAG RIGHT CURLY BRACKET - 0X0E007E : TAG TILDE - 0X0E007F : CANCEL TAG - 0X0E0080 : - 0X0E0081 : - 0X0E0082 : - 0X0E0083 : - 0X0E0084 : - 0X0E0085 : - 0X0E0086 : - 0X0E0087 : - 0X0E0088 : - 0X0E0089 : - 0X0E008A : - 0X0E008B : - 0X0E008C : - 0X0E008D : - 0X0E008E : - 0X0E008F : - 0X0E0090 : - 0X0E0091 : - 0X0E0092 : - 0X0E0093 : - 0X0E0094 : - 0X0E0095 : - 0X0E0096 : - 0X0E0097 : - 0X0E0098 : - 0X0E0099 : - 0X0E009A : - 0X0E009B : - 0X0E009C : - 0X0E009D : - 0X0E009E : - 0X0E009F : - 0X0E00A0 : - 0X0E00A1 : - 0X0E00A2 : - 0X0E00A3 : - 0X0E00A4 : - 0X0E00A5 : - 0X0E00A6 : - 0X0E00A7 : - 0X0E00A8 : - 0X0E00A9 : - 0X0E00AA : - 0X0E00AB : - 0X0E00AC : - 0X0E00AD : - 0X0E00AE : - 0X0E00AF : - 0X0E00B0 : - 0X0E00B1 : - 0X0E00B2 : - 0X0E00B3 : - 0X0E00B4 : - 0X0E00B5 : - 0X0E00B6 : - 0X0E00B7 : - 0X0E00B8 : - 0X0E00B9 : - 0X0E00BA : - 0X0E00BB : - 0X0E00BC : - 0X0E00BD : - 0X0E00BE : - 0X0E00BF : - 0X0E00C0 : - 0X0E00C1 : - 0X0E00C2 : - 0X0E00C3 : - 0X0E00C4 : - 0X0E00C5 : - 0X0E00C6 : - 0X0E00C7 : - 0X0E00C8 : - 0X0E00C9 : - 0X0E00CA : - 0X0E00CB : - 0X0E00CC : - 0X0E00CD : - 0X0E00CE : - 0X0E00CF : - 0X0E00D0 : - 0X0E00D1 : - 0X0E00D2 : - 0X0E00D3 : - 0X0E00D4 : - 0X0E00D5 : - 0X0E00D6 : - 0X0E00D7 : - 0X0E00D8 : - 0X0E00D9 : - 0X0E00DA : - 0X0E00DB : - 0X0E00DC : - 0X0E00DD : - 0X0E00DE : - 0X0E00DF : - 0X0E00E0 : - 0X0E00E1 : - 0X0E00E2 : - 0X0E00E3 : - 0X0E00E4 : - 0X0E00E5 : - 0X0E00E6 : - 0X0E00E7 : - 0X0E00E8 : - 0X0E00E9 : - 0X0E00EA : - 0X0E00EB : - 0X0E00EC : - 0X0E00ED : - 0X0E00EE : - 0X0E00EF : - 0X0E00F0 : - 0X0E00F1 : - 0X0E00F2 : - 0X0E00F3 : - 0X0E00F4 : - 0X0E00F5 : - 0X0E00F6 : - 0X0E00F7 : - 0X0E00F8 : - 0X0E00F9 : - 0X0E00FA : - 0X0E00FB : - 0X0E00FC : - 0X0E00FD : - 0X0E00FE : - 0X0E00FF : - 0X0E0100 : VARIATION SELECTOR-17 - 0X0E0101 : VARIATION SELECTOR-18 - 0X0E0102 : VARIATION SELECTOR-19 - 0X0E0103 : VARIATION SELECTOR-20 - 0X0E0104 : VARIATION SELECTOR-21 - 0X0E0105 : VARIATION SELECTOR-22 - 0X0E0106 : VARIATION SELECTOR-23 - 0X0E0107 : VARIATION SELECTOR-24 - 0X0E0108 : VARIATION SELECTOR-25 - 0X0E0109 : VARIATION SELECTOR-26 - 0X0E010A : VARIATION SELECTOR-27 - 0X0E010B : VARIATION SELECTOR-28 - 0X0E010C : VARIATION SELECTOR-29 - 0X0E010D : VARIATION SELECTOR-30 - 0X0E010E : VARIATION SELECTOR-31 - 0X0E010F : VARIATION SELECTOR-32 - 0X0E0110 : VARIATION SELECTOR-33 - 0X0E0111 : VARIATION SELECTOR-34 - 0X0E0112 : VARIATION SELECTOR-35 - 0X0E0113 : VARIATION SELECTOR-36 - 0X0E0114 : VARIATION SELECTOR-37 - 0X0E0115 : VARIATION SELECTOR-38 - 0X0E0116 : VARIATION SELECTOR-39 - 0X0E0117 : VARIATION SELECTOR-40 - 0X0E0118 : VARIATION SELECTOR-41 - 0X0E0119 : VARIATION SELECTOR-42 - 0X0E011A : VARIATION SELECTOR-43 - 0X0E011B : VARIATION SELECTOR-44 - 0X0E011C : VARIATION SELECTOR-45 - 0X0E011D : VARIATION SELECTOR-46 - 0X0E011E : VARIATION SELECTOR-47 - 0X0E011F : VARIATION SELECTOR-48 - 0X0E0120 : VARIATION SELECTOR-49 - 0X0E0121 : VARIATION SELECTOR-50 - 0X0E0122 : VARIATION SELECTOR-51 - 0X0E0123 : VARIATION SELECTOR-52 - 0X0E0124 : VARIATION SELECTOR-53 - 0X0E0125 : VARIATION SELECTOR-54 - 0X0E0126 : VARIATION SELECTOR-55 - 0X0E0127 : VARIATION SELECTOR-56 - 0X0E0128 : VARIATION SELECTOR-57 - 0X0E0129 : VARIATION SELECTOR-58 - 0X0E012A : VARIATION SELECTOR-59 - 0X0E012B : VARIATION SELECTOR-60 - 0X0E012C : VARIATION SELECTOR-61 - 0X0E012D : VARIATION SELECTOR-62 - 0X0E012E : VARIATION SELECTOR-63 - 0X0E012F : VARIATION SELECTOR-64 - 0X0E0130 : VARIATION SELECTOR-65 - 0X0E0131 : VARIATION SELECTOR-66 - 0X0E0132 : VARIATION SELECTOR-67 - 0X0E0133 : VARIATION SELECTOR-68 - 0X0E0134 : VARIATION SELECTOR-69 - 0X0E0135 : VARIATION SELECTOR-70 - 0X0E0136 : VARIATION SELECTOR-71 - 0X0E0137 : VARIATION SELECTOR-72 - 0X0E0138 : VARIATION SELECTOR-73 - 0X0E0139 : VARIATION SELECTOR-74 - 0X0E013A : VARIATION SELECTOR-75 - 0X0E013B : VARIATION SELECTOR-76 - 0X0E013C : VARIATION SELECTOR-77 - 0X0E013D : VARIATION SELECTOR-78 - 0X0E013E : VARIATION SELECTOR-79 - 0X0E013F : VARIATION SELECTOR-80 - 0X0E0140 : VARIATION SELECTOR-81 - 0X0E0141 : VARIATION SELECTOR-82 - 0X0E0142 : VARIATION SELECTOR-83 - 0X0E0143 : VARIATION SELECTOR-84 - 0X0E0144 : VARIATION SELECTOR-85 - 0X0E0145 : VARIATION SELECTOR-86 - 0X0E0146 : VARIATION SELECTOR-87 - 0X0E0147 : VARIATION SELECTOR-88 - 0X0E0148 : VARIATION SELECTOR-89 - 0X0E0149 : VARIATION SELECTOR-90 - 0X0E014A : VARIATION SELECTOR-91 - 0X0E014B : VARIATION SELECTOR-92 - 0X0E014C : VARIATION SELECTOR-93 - 0X0E014D : VARIATION SELECTOR-94 - 0X0E014E : VARIATION SELECTOR-95 - 0X0E014F : VARIATION SELECTOR-96 - 0X0E0150 : VARIATION SELECTOR-97 - 0X0E0151 : VARIATION SELECTOR-98 - 0X0E0152 : VARIATION SELECTOR-99 - 0X0E0153 : VARIATION SELECTOR-100 - 0X0E0154 : VARIATION SELECTOR-101 - 0X0E0155 : VARIATION SELECTOR-102 - 0X0E0156 : VARIATION SELECTOR-103 - 0X0E0157 : VARIATION SELECTOR-104 - 0X0E0158 : VARIATION SELECTOR-105 - 0X0E0159 : VARIATION SELECTOR-106 - 0X0E015A : VARIATION SELECTOR-107 - 0X0E015B : VARIATION SELECTOR-108 - 0X0E015C : VARIATION SELECTOR-109 - 0X0E015D : VARIATION SELECTOR-110 - 0X0E015E : VARIATION SELECTOR-111 - 0X0E015F : VARIATION SELECTOR-112 - 0X0E0160 : VARIATION SELECTOR-113 - 0X0E0161 : VARIATION SELECTOR-114 - 0X0E0162 : VARIATION SELECTOR-115 - 0X0E0163 : VARIATION SELECTOR-116 - 0X0E0164 : VARIATION SELECTOR-117 - 0X0E0165 : VARIATION SELECTOR-118 - 0X0E0166 : VARIATION SELECTOR-119 - 0X0E0167 : VARIATION SELECTOR-120 - 0X0E0168 : VARIATION SELECTOR-121 - 0X0E0169 : VARIATION SELECTOR-122 - 0X0E016A : VARIATION SELECTOR-123 - 0X0E016B : VARIATION SELECTOR-124 - 0X0E016C : VARIATION SELECTOR-125 - 0X0E016D : VARIATION SELECTOR-126 - 0X0E016E : VARIATION SELECTOR-127 - 0X0E016F : VARIATION SELECTOR-128 - 0X0E0170 : VARIATION SELECTOR-129 - 0X0E0171 : VARIATION SELECTOR-130 - 0X0E0172 : VARIATION SELECTOR-131 - 0X0E0173 : VARIATION SELECTOR-132 - 0X0E0174 : VARIATION SELECTOR-133 - 0X0E0175 : VARIATION SELECTOR-134 - 0X0E0176 : VARIATION SELECTOR-135 - 0X0E0177 : VARIATION SELECTOR-136 - 0X0E0178 : VARIATION SELECTOR-137 - 0X0E0179 : VARIATION SELECTOR-138 - 0X0E017A : VARIATION SELECTOR-139 - 0X0E017B : VARIATION SELECTOR-140 - 0X0E017C : VARIATION SELECTOR-141 - 0X0E017D : VARIATION SELECTOR-142 - 0X0E017E : VARIATION SELECTOR-143 - 0X0E017F : VARIATION SELECTOR-144 - 0X0E0180 : VARIATION SELECTOR-145 - 0X0E0181 : VARIATION SELECTOR-146 - 0X0E0182 : VARIATION SELECTOR-147 - 0X0E0183 : VARIATION SELECTOR-148 - 0X0E0184 : VARIATION SELECTOR-149 - 0X0E0185 : VARIATION SELECTOR-150 - 0X0E0186 : VARIATION SELECTOR-151 - 0X0E0187 : VARIATION SELECTOR-152 - 0X0E0188 : VARIATION SELECTOR-153 - 0X0E0189 : VARIATION SELECTOR-154 - 0X0E018A : VARIATION SELECTOR-155 - 0X0E018B : VARIATION SELECTOR-156 - 0X0E018C : VARIATION SELECTOR-157 - 0X0E018D : VARIATION SELECTOR-158 - 0X0E018E : VARIATION SELECTOR-159 - 0X0E018F : VARIATION SELECTOR-160 - 0X0E0190 : VARIATION SELECTOR-161 - 0X0E0191 : VARIATION SELECTOR-162 - 0X0E0192 : VARIATION SELECTOR-163 - 0X0E0193 : VARIATION SELECTOR-164 - 0X0E0194 : VARIATION SELECTOR-165 - 0X0E0195 : VARIATION SELECTOR-166 - 0X0E0196 : VARIATION SELECTOR-167 - 0X0E0197 : VARIATION SELECTOR-168 - 0X0E0198 : VARIATION SELECTOR-169 - 0X0E0199 : VARIATION SELECTOR-170 - 0X0E019A : VARIATION SELECTOR-171 - 0X0E019B : VARIATION SELECTOR-172 - 0X0E019C : VARIATION SELECTOR-173 - 0X0E019D : VARIATION SELECTOR-174 - 0X0E019E : VARIATION SELECTOR-175 - 0X0E019F : VARIATION SELECTOR-176 - 0X0E01A0 : VARIATION SELECTOR-177 - 0X0E01A1 : VARIATION SELECTOR-178 - 0X0E01A2 : VARIATION SELECTOR-179 - 0X0E01A3 : VARIATION SELECTOR-180 - 0X0E01A4 : VARIATION SELECTOR-181 - 0X0E01A5 : VARIATION SELECTOR-182 - 0X0E01A6 : VARIATION SELECTOR-183 - 0X0E01A7 : VARIATION SELECTOR-184 - 0X0E01A8 : VARIATION SELECTOR-185 - 0X0E01A9 : VARIATION SELECTOR-186 - 0X0E01AA : VARIATION SELECTOR-187 - 0X0E01AB : VARIATION SELECTOR-188 - 0X0E01AC : VARIATION SELECTOR-189 - 0X0E01AD : VARIATION SELECTOR-190 - 0X0E01AE : VARIATION SELECTOR-191 - 0X0E01AF : VARIATION SELECTOR-192 - 0X0E01B0 : VARIATION SELECTOR-193 - 0X0E01B1 : VARIATION SELECTOR-194 - 0X0E01B2 : VARIATION SELECTOR-195 - 0X0E01B3 : VARIATION SELECTOR-196 - 0X0E01B4 : VARIATION SELECTOR-197 - 0X0E01B5 : VARIATION SELECTOR-198 - 0X0E01B6 : VARIATION SELECTOR-199 - 0X0E01B7 : VARIATION SELECTOR-200 - 0X0E01B8 : VARIATION SELECTOR-201 - 0X0E01B9 : VARIATION SELECTOR-202 - 0X0E01BA : VARIATION SELECTOR-203 - 0X0E01BB : VARIATION SELECTOR-204 - 0X0E01BC : VARIATION SELECTOR-205 - 0X0E01BD : VARIATION SELECTOR-206 - 0X0E01BE : VARIATION SELECTOR-207 - 0X0E01BF : VARIATION SELECTOR-208 - 0X0E01C0 : VARIATION SELECTOR-209 - 0X0E01C1 : VARIATION SELECTOR-210 - 0X0E01C2 : VARIATION SELECTOR-211 - 0X0E01C3 : VARIATION SELECTOR-212 - 0X0E01C4 : VARIATION SELECTOR-213 - 0X0E01C5 : VARIATION SELECTOR-214 - 0X0E01C6 : VARIATION SELECTOR-215 - 0X0E01C7 : VARIATION SELECTOR-216 - 0X0E01C8 : VARIATION SELECTOR-217 - 0X0E01C9 : VARIATION SELECTOR-218 - 0X0E01CA : VARIATION SELECTOR-219 - 0X0E01CB : VARIATION SELECTOR-220 - 0X0E01CC : VARIATION SELECTOR-221 - 0X0E01CD : VARIATION SELECTOR-222 - 0X0E01CE : VARIATION SELECTOR-223 - 0X0E01CF : VARIATION SELECTOR-224 - 0X0E01D0 : VARIATION SELECTOR-225 - 0X0E01D1 : VARIATION SELECTOR-226 - 0X0E01D2 : VARIATION SELECTOR-227 - 0X0E01D3 : VARIATION SELECTOR-228 - 0X0E01D4 : VARIATION SELECTOR-229 - 0X0E01D5 : VARIATION SELECTOR-230 - 0X0E01D6 : VARIATION SELECTOR-231 - 0X0E01D7 : VARIATION SELECTOR-232 - 0X0E01D8 : VARIATION SELECTOR-233 - 0X0E01D9 : VARIATION SELECTOR-234 - 0X0E01DA : VARIATION SELECTOR-235 - 0X0E01DB : VARIATION SELECTOR-236 - 0X0E01DC : VARIATION SELECTOR-237 - 0X0E01DD : VARIATION SELECTOR-238 - 0X0E01DE : VARIATION SELECTOR-239 - 0X0E01DF : VARIATION SELECTOR-240 - 0X0E01E0 : VARIATION SELECTOR-241 - 0X0E01E1 : VARIATION SELECTOR-242 - 0X0E01E2 : VARIATION SELECTOR-243 - 0X0E01E3 : VARIATION SELECTOR-244 - 0X0E01E4 : VARIATION SELECTOR-245 - 0X0E01E5 : VARIATION SELECTOR-246 - 0X0E01E6 : VARIATION SELECTOR-247 - 0X0E01E7 : VARIATION SELECTOR-248 - 0X0E01E8 : VARIATION SELECTOR-249 - 0X0E01E9 : VARIATION SELECTOR-250 - 0X0E01EA : VARIATION SELECTOR-251 - 0X0E01EB : VARIATION SELECTOR-252 - 0X0E01EC : VARIATION SELECTOR-253 - 0X0E01ED : VARIATION SELECTOR-254 - 0X0E01EE : VARIATION SELECTOR-255 - 0X0E01EF : VARIATION SELECTOR-256 - 0X0E01F0 : - 0X0E01F1 : - 0X0E01F2 : - 0X0E01F3 : - 0X0E01F4 : - 0X0E01F5 : - 0X0E01F6 : - 0X0E01F7 : - 0X0E01F8 : - 0X0E01F9 : - 0X0E01FA : - 0X0E01FB : - 0X0E01FC : - 0X0E01FD : - 0X0E01FE : - 0X0E01FF : - 0X0E0200 : - 0X0E0201 : - 0X0E0202 : - 0X0E0203 : - 0X0E0204 : - 0X0E0205 : - 0X0E0206 : - 0X0E0207 : - 0X0E0208 : - 0X0E0209 : - 0X0E020A : - 0X0E020B : - 0X0E020C : - 0X0E020D : - 0X0E020E : - 0X0E020F : - 0X0E0210 : - 0X0E0211 : - 0X0E0212 : - 0X0E0213 : - 0X0E0214 : - 0X0E0215 : - 0X0E0216 : - 0X0E0217 : - 0X0E0218 : - 0X0E0219 : - 0X0E021A : - 0X0E021B : - 0X0E021C : - 0X0E021D : - 0X0E021E : - 0X0E021F : - 0X0E0220 : - 0X0E0221 : - 0X0E0222 : - 0X0E0223 : - 0X0E0224 : - 0X0E0225 : - 0X0E0226 : - 0X0E0227 : - 0X0E0228 : - 0X0E0229 : - 0X0E022A : - 0X0E022B : - 0X0E022C : - 0X0E022D : - 0X0E022E : - 0X0E022F : - 0X0E0230 : - 0X0E0231 : - 0X0E0232 : - 0X0E0233 : - 0X0E0234 : - 0X0E0235 : - 0X0E0236 : - 0X0E0237 : - 0X0E0238 : - 0X0E0239 : - 0X0E023A : - 0X0E023B : - 0X0E023C : - 0X0E023D : - 0X0E023E : - 0X0E023F : - 0X0E0240 : - 0X0E0241 : - 0X0E0242 : - 0X0E0243 : - 0X0E0244 : - 0X0E0245 : - 0X0E0246 : - 0X0E0247 : - 0X0E0248 : - 0X0E0249 : - 0X0E024A : - 0X0E024B : - 0X0E024C : - 0X0E024D : - 0X0E024E : - 0X0E024F : - 0X0E0250 : - 0X0E0251 : - 0X0E0252 : - 0X0E0253 : - 0X0E0254 : - 0X0E0255 : - 0X0E0256 : - 0X0E0257 : - 0X0E0258 : - 0X0E0259 : - 0X0E025A : - 0X0E025B : - 0X0E025C : - 0X0E025D : - 0X0E025E : - 0X0E025F : - 0X0E0260 : - 0X0E0261 : - 0X0E0262 : - 0X0E0263 : - 0X0E0264 : - 0X0E0265 : - 0X0E0266 : - 0X0E0267 : - 0X0E0268 : - 0X0E0269 : - 0X0E026A : - 0X0E026B : - 0X0E026C : - 0X0E026D : - 0X0E026E : - 0X0E026F : - 0X0E0270 : - 0X0E0271 : - 0X0E0272 : - 0X0E0273 : - 0X0E0274 : - 0X0E0275 : - 0X0E0276 : - 0X0E0277 : - 0X0E0278 : - 0X0E0279 : - 0X0E027A : - 0X0E027B : - 0X0E027C : - 0X0E027D : - 0X0E027E : - 0X0E027F : - 0X0E0280 : - 0X0E0281 : - 0X0E0282 : - 0X0E0283 : - 0X0E0284 : - 0X0E0285 : - 0X0E0286 : - 0X0E0287 : - 0X0E0288 : - 0X0E0289 : - 0X0E028A : - 0X0E028B : - 0X0E028C : - 0X0E028D : - 0X0E028E : - 0X0E028F : - 0X0E0290 : - 0X0E0291 : - 0X0E0292 : - 0X0E0293 : - 0X0E0294 : - 0X0E0295 : - 0X0E0296 : - 0X0E0297 : - 0X0E0298 : - 0X0E0299 : - 0X0E029A : - 0X0E029B : - 0X0E029C : - 0X0E029D : - 0X0E029E : - 0X0E029F : - 0X0E02A0 : - 0X0E02A1 : - 0X0E02A2 : - 0X0E02A3 : - 0X0E02A4 : - 0X0E02A5 : - 0X0E02A6 : - 0X0E02A7 : - 0X0E02A8 : - 0X0E02A9 : - 0X0E02AA : - 0X0E02AB : - 0X0E02AC : - 0X0E02AD : - 0X0E02AE : - 0X0E02AF : - 0X0E02B0 : - 0X0E02B1 : - 0X0E02B2 : - 0X0E02B3 : - 0X0E02B4 : - 0X0E02B5 : - 0X0E02B6 : - 0X0E02B7 : - 0X0E02B8 : - 0X0E02B9 : - 0X0E02BA : - 0X0E02BB : - 0X0E02BC : - 0X0E02BD : - 0X0E02BE : - 0X0E02BF : - 0X0E02C0 : - 0X0E02C1 : - 0X0E02C2 : - 0X0E02C3 : - 0X0E02C4 : - 0X0E02C5 : - 0X0E02C6 : - 0X0E02C7 : - 0X0E02C8 : - 0X0E02C9 : - 0X0E02CA : - 0X0E02CB : - 0X0E02CC : - 0X0E02CD : - 0X0E02CE : - 0X0E02CF : - 0X0E02D0 : - 0X0E02D1 : - 0X0E02D2 : - 0X0E02D3 : - 0X0E02D4 : - 0X0E02D5 : - 0X0E02D6 : - 0X0E02D7 : - 0X0E02D8 : - 0X0E02D9 : - 0X0E02DA : - 0X0E02DB : - 0X0E02DC : - 0X0E02DD : - 0X0E02DE : - 0X0E02DF : - 0X0E02E0 : - 0X0E02E1 : - 0X0E02E2 : - 0X0E02E3 : - 0X0E02E4 : - 0X0E02E5 : - 0X0E02E6 : - 0X0E02E7 : - 0X0E02E8 : - 0X0E02E9 : - 0X0E02EA : - 0X0E02EB : - 0X0E02EC : - 0X0E02ED : - 0X0E02EE : - 0X0E02EF : - 0X0E02F0 : - 0X0E02F1 : - 0X0E02F2 : - 0X0E02F3 : - 0X0E02F4 : - 0X0E02F5 : - 0X0E02F6 : - 0X0E02F7 : - 0X0E02F8 : - 0X0E02F9 : - 0X0E02FA : - 0X0E02FB : - 0X0E02FC : - 0X0E02FD : - 0X0E02FE : - 0X0E02FF : - 0X0E0300 : - 0X0E0301 : - 0X0E0302 : - 0X0E0303 : - 0X0E0304 : - 0X0E0305 : - 0X0E0306 : - 0X0E0307 : - 0X0E0308 : - 0X0E0309 : - 0X0E030A : - 0X0E030B : - 0X0E030C : - 0X0E030D : - 0X0E030E : - 0X0E030F : - 0X0E0310 : - 0X0E0311 : - 0X0E0312 : - 0X0E0313 : - 0X0E0314 : - 0X0E0315 : - 0X0E0316 : - 0X0E0317 : - 0X0E0318 : - 0X0E0319 : - 0X0E031A : - 0X0E031B : - 0X0E031C : - 0X0E031D : - 0X0E031E : - 0X0E031F : - 0X0E0320 : - 0X0E0321 : - 0X0E0322 : - 0X0E0323 : - 0X0E0324 : - 0X0E0325 : - 0X0E0326 : - 0X0E0327 : - 0X0E0328 : - 0X0E0329 : - 0X0E032A : - 0X0E032B : - 0X0E032C : - 0X0E032D : - 0X0E032E : - 0X0E032F : - 0X0E0330 : - 0X0E0331 : - 0X0E0332 : - 0X0E0333 : - 0X0E0334 : - 0X0E0335 : - 0X0E0336 : - 0X0E0337 : - 0X0E0338 : - 0X0E0339 : - 0X0E033A : - 0X0E033B : - 0X0E033C : - 0X0E033D : - 0X0E033E : - 0X0E033F : - 0X0E0340 : - 0X0E0341 : - 0X0E0342 : - 0X0E0343 : - 0X0E0344 : - 0X0E0345 : - 0X0E0346 : - 0X0E0347 : - 0X0E0348 : - 0X0E0349 : - 0X0E034A : - 0X0E034B : - 0X0E034C : - 0X0E034D : - 0X0E034E : - 0X0E034F : - 0X0E0350 : - 0X0E0351 : - 0X0E0352 : - 0X0E0353 : - 0X0E0354 : - 0X0E0355 : - 0X0E0356 : - 0X0E0357 : - 0X0E0358 : - 0X0E0359 : - 0X0E035A : - 0X0E035B : - 0X0E035C : - 0X0E035D : - 0X0E035E : - 0X0E035F : - 0X0E0360 : - 0X0E0361 : - 0X0E0362 : - 0X0E0363 : - 0X0E0364 : - 0X0E0365 : - 0X0E0366 : - 0X0E0367 : - 0X0E0368 : - 0X0E0369 : - 0X0E036A : - 0X0E036B : - 0X0E036C : - 0X0E036D : - 0X0E036E : - 0X0E036F : - 0X0E0370 : - 0X0E0371 : - 0X0E0372 : - 0X0E0373 : - 0X0E0374 : - 0X0E0375 : - 0X0E0376 : - 0X0E0377 : - 0X0E0378 : - 0X0E0379 : - 0X0E037A : - 0X0E037B : - 0X0E037C : - 0X0E037D : - 0X0E037E : - 0X0E037F : - 0X0E0380 : - 0X0E0381 : - 0X0E0382 : - 0X0E0383 : - 0X0E0384 : - 0X0E0385 : - 0X0E0386 : - 0X0E0387 : - 0X0E0388 : - 0X0E0389 : - 0X0E038A : - 0X0E038B : - 0X0E038C : - 0X0E038D : - 0X0E038E : - 0X0E038F : - 0X0E0390 : - 0X0E0391 : - 0X0E0392 : - 0X0E0393 : - 0X0E0394 : - 0X0E0395 : - 0X0E0396 : - 0X0E0397 : - 0X0E0398 : - 0X0E0399 : - 0X0E039A : - 0X0E039B : - 0X0E039C : - 0X0E039D : - 0X0E039E : - 0X0E039F : - 0X0E03A0 : - 0X0E03A1 : - 0X0E03A2 : - 0X0E03A3 : - 0X0E03A4 : - 0X0E03A5 : - 0X0E03A6 : - 0X0E03A7 : - 0X0E03A8 : - 0X0E03A9 : - 0X0E03AA : - 0X0E03AB : - 0X0E03AC : - 0X0E03AD : - 0X0E03AE : - 0X0E03AF : - 0X0E03B0 : - 0X0E03B1 : - 0X0E03B2 : - 0X0E03B3 : - 0X0E03B4 : - 0X0E03B5 : - 0X0E03B6 : - 0X0E03B7 : - 0X0E03B8 : - 0X0E03B9 : - 0X0E03BA : - 0X0E03BB : - 0X0E03BC : - 0X0E03BD : - 0X0E03BE : - 0X0E03BF : - 0X0E03C0 : - 0X0E03C1 : - 0X0E03C2 : - 0X0E03C3 : - 0X0E03C4 : - 0X0E03C5 : - 0X0E03C6 : - 0X0E03C7 : - 0X0E03C8 : - 0X0E03C9 : - 0X0E03CA : - 0X0E03CB : - 0X0E03CC : - 0X0E03CD : - 0X0E03CE : - 0X0E03CF : - 0X0E03D0 : - 0X0E03D1 : - 0X0E03D2 : - 0X0E03D3 : - 0X0E03D4 : - 0X0E03D5 : - 0X0E03D6 : - 0X0E03D7 : - 0X0E03D8 : - 0X0E03D9 : - 0X0E03DA : - 0X0E03DB : - 0X0E03DC : - 0X0E03DD : - 0X0E03DE : - 0X0E03DF : - 0X0E03E0 : - 0X0E03E1 : - 0X0E03E2 : - 0X0E03E3 : - 0X0E03E4 : - 0X0E03E5 : - 0X0E03E6 : - 0X0E03E7 : - 0X0E03E8 : - 0X0E03E9 : - 0X0E03EA : - 0X0E03EB : - 0X0E03EC : - 0X0E03ED : - 0X0E03EE : - 0X0E03EF : - 0X0E03F0 : - 0X0E03F1 : - 0X0E03F2 : - 0X0E03F3 : - 0X0E03F4 : - 0X0E03F5 : - 0X0E03F6 : - 0X0E03F7 : - 0X0E03F8 : - 0X0E03F9 : - 0X0E03FA : - 0X0E03FB : - 0X0E03FC : - 0X0E03FD : - 0X0E03FE : - 0X0E03FF : - 0X0E0400 : - 0X0E0401 : - 0X0E0402 : - 0X0E0403 : - 0X0E0404 : - 0X0E0405 : - 0X0E0406 : - 0X0E0407 : - 0X0E0408 : - 0X0E0409 : - 0X0E040A : - 0X0E040B : - 0X0E040C : - 0X0E040D : - 0X0E040E : - 0X0E040F : - 0X0E0410 : - 0X0E0411 : - 0X0E0412 : - 0X0E0413 : - 0X0E0414 : - 0X0E0415 : - 0X0E0416 : - 0X0E0417 : - 0X0E0418 : - 0X0E0419 : - 0X0E041A : - 0X0E041B : - 0X0E041C : - 0X0E041D : - 0X0E041E : - 0X0E041F : - 0X0E0420 : - 0X0E0421 : - 0X0E0422 : - 0X0E0423 : - 0X0E0424 : - 0X0E0425 : - 0X0E0426 : - 0X0E0427 : - 0X0E0428 : - 0X0E0429 : - 0X0E042A : - 0X0E042B : - 0X0E042C : - 0X0E042D : - 0X0E042E : - 0X0E042F : - 0X0E0430 : - 0X0E0431 : - 0X0E0432 : - 0X0E0433 : - 0X0E0434 : - 0X0E0435 : - 0X0E0436 : - 0X0E0437 : - 0X0E0438 : - 0X0E0439 : - 0X0E043A : - 0X0E043B : - 0X0E043C : - 0X0E043D : - 0X0E043E : - 0X0E043F : - 0X0E0440 : - 0X0E0441 : - 0X0E0442 : - 0X0E0443 : - 0X0E0444 : - 0X0E0445 : - 0X0E0446 : - 0X0E0447 : - 0X0E0448 : - 0X0E0449 : - 0X0E044A : - 0X0E044B : - 0X0E044C : - 0X0E044D : - 0X0E044E : - 0X0E044F : - 0X0E0450 : - 0X0E0451 : - 0X0E0452 : - 0X0E0453 : - 0X0E0454 : - 0X0E0455 : - 0X0E0456 : - 0X0E0457 : - 0X0E0458 : - 0X0E0459 : - 0X0E045A : - 0X0E045B : - 0X0E045C : - 0X0E045D : - 0X0E045E : - 0X0E045F : - 0X0E0460 : - 0X0E0461 : - 0X0E0462 : - 0X0E0463 : - 0X0E0464 : - 0X0E0465 : - 0X0E0466 : - 0X0E0467 : - 0X0E0468 : - 0X0E0469 : - 0X0E046A : - 0X0E046B : - 0X0E046C : - 0X0E046D : - 0X0E046E : - 0X0E046F : - 0X0E0470 : - 0X0E0471 : - 0X0E0472 : - 0X0E0473 : - 0X0E0474 : - 0X0E0475 : - 0X0E0476 : - 0X0E0477 : - 0X0E0478 : - 0X0E0479 : - 0X0E047A : - 0X0E047B : - 0X0E047C : - 0X0E047D : - 0X0E047E : - 0X0E047F : - 0X0E0480 : - 0X0E0481 : - 0X0E0482 : - 0X0E0483 : - 0X0E0484 : - 0X0E0485 : - 0X0E0486 : - 0X0E0487 : - 0X0E0488 : - 0X0E0489 : - 0X0E048A : - 0X0E048B : - 0X0E048C : - 0X0E048D : - 0X0E048E : - 0X0E048F : - 0X0E0490 : - 0X0E0491 : - 0X0E0492 : - 0X0E0493 : - 0X0E0494 : - 0X0E0495 : - 0X0E0496 : - 0X0E0497 : - 0X0E0498 : - 0X0E0499 : - 0X0E049A : - 0X0E049B : - 0X0E049C : - 0X0E049D : - 0X0E049E : - 0X0E049F : - 0X0E04A0 : - 0X0E04A1 : - 0X0E04A2 : - 0X0E04A3 : - 0X0E04A4 : - 0X0E04A5 : - 0X0E04A6 : - 0X0E04A7 : - 0X0E04A8 : - 0X0E04A9 : - 0X0E04AA : - 0X0E04AB : - 0X0E04AC : - 0X0E04AD : - 0X0E04AE : - 0X0E04AF : - 0X0E04B0 : - 0X0E04B1 : - 0X0E04B2 : - 0X0E04B3 : - 0X0E04B4 : - 0X0E04B5 : - 0X0E04B6 : - 0X0E04B7 : - 0X0E04B8 : - 0X0E04B9 : - 0X0E04BA : - 0X0E04BB : - 0X0E04BC : - 0X0E04BD : - 0X0E04BE : - 0X0E04BF : - 0X0E04C0 : - 0X0E04C1 : - 0X0E04C2 : - 0X0E04C3 : - 0X0E04C4 : - 0X0E04C5 : - 0X0E04C6 : - 0X0E04C7 : - 0X0E04C8 : - 0X0E04C9 : - 0X0E04CA : - 0X0E04CB : - 0X0E04CC : - 0X0E04CD : - 0X0E04CE : - 0X0E04CF : - 0X0E04D0 : - 0X0E04D1 : - 0X0E04D2 : - 0X0E04D3 : - 0X0E04D4 : - 0X0E04D5 : - 0X0E04D6 : - 0X0E04D7 : - 0X0E04D8 : - 0X0E04D9 : - 0X0E04DA : - 0X0E04DB : - 0X0E04DC : - 0X0E04DD : - 0X0E04DE : - 0X0E04DF : - 0X0E04E0 : - 0X0E04E1 : - 0X0E04E2 : - 0X0E04E3 : - 0X0E04E4 : - 0X0E04E5 : - 0X0E04E6 : - 0X0E04E7 : - 0X0E04E8 : - 0X0E04E9 : - 0X0E04EA : - 0X0E04EB : - 0X0E04EC : - 0X0E04ED : - 0X0E04EE : - 0X0E04EF : - 0X0E04F0 : - 0X0E04F1 : - 0X0E04F2 : - 0X0E04F3 : - 0X0E04F4 : - 0X0E04F5 : - 0X0E04F6 : - 0X0E04F7 : - 0X0E04F8 : - 0X0E04F9 : - 0X0E04FA : - 0X0E04FB : - 0X0E04FC : - 0X0E04FD : - 0X0E04FE : - 0X0E04FF : - 0X0E0500 : - 0X0E0501 : - 0X0E0502 : - 0X0E0503 : - 0X0E0504 : - 0X0E0505 : - 0X0E0506 : - 0X0E0507 : - 0X0E0508 : - 0X0E0509 : - 0X0E050A : - 0X0E050B : - 0X0E050C : - 0X0E050D : - 0X0E050E : - 0X0E050F : - 0X0E0510 : - 0X0E0511 : - 0X0E0512 : - 0X0E0513 : - 0X0E0514 : - 0X0E0515 : - 0X0E0516 : - 0X0E0517 : - 0X0E0518 : - 0X0E0519 : - 0X0E051A : - 0X0E051B : - 0X0E051C : - 0X0E051D : - 0X0E051E : - 0X0E051F : - 0X0E0520 : - 0X0E0521 : - 0X0E0522 : - 0X0E0523 : - 0X0E0524 : - 0X0E0525 : - 0X0E0526 : - 0X0E0527 : - 0X0E0528 : - 0X0E0529 : - 0X0E052A : - 0X0E052B : - 0X0E052C : - 0X0E052D : - 0X0E052E : - 0X0E052F : - 0X0E0530 : - 0X0E0531 : - 0X0E0532 : - 0X0E0533 : - 0X0E0534 : - 0X0E0535 : - 0X0E0536 : - 0X0E0537 : - 0X0E0538 : - 0X0E0539 : - 0X0E053A : - 0X0E053B : - 0X0E053C : - 0X0E053D : - 0X0E053E : - 0X0E053F : - 0X0E0540 : - 0X0E0541 : - 0X0E0542 : - 0X0E0543 : - 0X0E0544 : - 0X0E0545 : - 0X0E0546 : - 0X0E0547 : - 0X0E0548 : - 0X0E0549 : - 0X0E054A : - 0X0E054B : - 0X0E054C : - 0X0E054D : - 0X0E054E : - 0X0E054F : - 0X0E0550 : - 0X0E0551 : - 0X0E0552 : - 0X0E0553 : - 0X0E0554 : - 0X0E0555 : - 0X0E0556 : - 0X0E0557 : - 0X0E0558 : - 0X0E0559 : - 0X0E055A : - 0X0E055B : - 0X0E055C : - 0X0E055D : - 0X0E055E : - 0X0E055F : - 0X0E0560 : - 0X0E0561 : - 0X0E0562 : - 0X0E0563 : - 0X0E0564 : - 0X0E0565 : - 0X0E0566 : - 0X0E0567 : - 0X0E0568 : - 0X0E0569 : - 0X0E056A : - 0X0E056B : - 0X0E056C : - 0X0E056D : - 0X0E056E : - 0X0E056F : - 0X0E0570 : - 0X0E0571 : - 0X0E0572 : - 0X0E0573 : - 0X0E0574 : - 0X0E0575 : - 0X0E0576 : - 0X0E0577 : - 0X0E0578 : - 0X0E0579 : - 0X0E057A : - 0X0E057B : - 0X0E057C : - 0X0E057D : - 0X0E057E : - 0X0E057F : - 0X0E0580 : - 0X0E0581 : - 0X0E0582 : - 0X0E0583 : - 0X0E0584 : - 0X0E0585 : - 0X0E0586 : - 0X0E0587 : - 0X0E0588 : - 0X0E0589 : - 0X0E058A : - 0X0E058B : - 0X0E058C : - 0X0E058D : - 0X0E058E : - 0X0E058F : - 0X0E0590 : - 0X0E0591 : - 0X0E0592 : - 0X0E0593 : - 0X0E0594 : - 0X0E0595 : - 0X0E0596 : - 0X0E0597 : - 0X0E0598 : - 0X0E0599 : - 0X0E059A : - 0X0E059B : - 0X0E059C : - 0X0E059D : - 0X0E059E : - 0X0E059F : - 0X0E05A0 : - 0X0E05A1 : - 0X0E05A2 : - 0X0E05A3 : - 0X0E05A4 : - 0X0E05A5 : - 0X0E05A6 : - 0X0E05A7 : - 0X0E05A8 : - 0X0E05A9 : - 0X0E05AA : - 0X0E05AB : - 0X0E05AC : - 0X0E05AD : - 0X0E05AE : - 0X0E05AF : - 0X0E05B0 : - 0X0E05B1 : - 0X0E05B2 : - 0X0E05B3 : - 0X0E05B4 : - 0X0E05B5 : - 0X0E05B6 : - 0X0E05B7 : - 0X0E05B8 : - 0X0E05B9 : - 0X0E05BA : - 0X0E05BB : - 0X0E05BC : - 0X0E05BD : - 0X0E05BE : - 0X0E05BF : - 0X0E05C0 : - 0X0E05C1 : - 0X0E05C2 : - 0X0E05C3 : - 0X0E05C4 : - 0X0E05C5 : - 0X0E05C6 : - 0X0E05C7 : - 0X0E05C8 : - 0X0E05C9 : - 0X0E05CA : - 0X0E05CB : - 0X0E05CC : - 0X0E05CD : - 0X0E05CE : - 0X0E05CF : - 0X0E05D0 : - 0X0E05D1 : - 0X0E05D2 : - 0X0E05D3 : - 0X0E05D4 : - 0X0E05D5 : - 0X0E05D6 : - 0X0E05D7 : - 0X0E05D8 : - 0X0E05D9 : - 0X0E05DA : - 0X0E05DB : - 0X0E05DC : - 0X0E05DD : - 0X0E05DE : - 0X0E05DF : - 0X0E05E0 : - 0X0E05E1 : - 0X0E05E2 : - 0X0E05E3 : - 0X0E05E4 : - 0X0E05E5 : - 0X0E05E6 : - 0X0E05E7 : - 0X0E05E8 : - 0X0E05E9 : - 0X0E05EA : - 0X0E05EB : - 0X0E05EC : - 0X0E05ED : - 0X0E05EE : - 0X0E05EF : - 0X0E05F0 : - 0X0E05F1 : - 0X0E05F2 : - 0X0E05F3 : - 0X0E05F4 : - 0X0E05F5 : - 0X0E05F6 : - 0X0E05F7 : - 0X0E05F8 : - 0X0E05F9 : - 0X0E05FA : - 0X0E05FB : - 0X0E05FC : - 0X0E05FD : - 0X0E05FE : - 0X0E05FF : - 0X0E0600 : - 0X0E0601 : - 0X0E0602 : - 0X0E0603 : - 0X0E0604 : - 0X0E0605 : - 0X0E0606 : - 0X0E0607 : - 0X0E0608 : - 0X0E0609 : - 0X0E060A : - 0X0E060B : - 0X0E060C : - 0X0E060D : - 0X0E060E : - 0X0E060F : - 0X0E0610 : - 0X0E0611 : - 0X0E0612 : - 0X0E0613 : - 0X0E0614 : - 0X0E0615 : - 0X0E0616 : - 0X0E0617 : - 0X0E0618 : - 0X0E0619 : - 0X0E061A : - 0X0E061B : - 0X0E061C : - 0X0E061D : - 0X0E061E : - 0X0E061F : - 0X0E0620 : - 0X0E0621 : - 0X0E0622 : - 0X0E0623 : - 0X0E0624 : - 0X0E0625 : - 0X0E0626 : - 0X0E0627 : - 0X0E0628 : - 0X0E0629 : - 0X0E062A : - 0X0E062B : - 0X0E062C : - 0X0E062D : - 0X0E062E : - 0X0E062F : - 0X0E0630 : - 0X0E0631 : - 0X0E0632 : - 0X0E0633 : - 0X0E0634 : - 0X0E0635 : - 0X0E0636 : - 0X0E0637 : - 0X0E0638 : - 0X0E0639 : - 0X0E063A : - 0X0E063B : - 0X0E063C : - 0X0E063D : - 0X0E063E : - 0X0E063F : - 0X0E0640 : - 0X0E0641 : - 0X0E0642 : - 0X0E0643 : - 0X0E0644 : - 0X0E0645 : - 0X0E0646 : - 0X0E0647 : - 0X0E0648 : - 0X0E0649 : - 0X0E064A : - 0X0E064B : - 0X0E064C : - 0X0E064D : - 0X0E064E : - 0X0E064F : - 0X0E0650 : - 0X0E0651 : - 0X0E0652 : - 0X0E0653 : - 0X0E0654 : - 0X0E0655 : - 0X0E0656 : - 0X0E0657 : - 0X0E0658 : - 0X0E0659 : - 0X0E065A : - 0X0E065B : - 0X0E065C : - 0X0E065D : - 0X0E065E : - 0X0E065F : - 0X0E0660 : - 0X0E0661 : - 0X0E0662 : - 0X0E0663 : - 0X0E0664 : - 0X0E0665 : - 0X0E0666 : - 0X0E0667 : - 0X0E0668 : - 0X0E0669 : - 0X0E066A : - 0X0E066B : - 0X0E066C : - 0X0E066D : - 0X0E066E : - 0X0E066F : - 0X0E0670 : - 0X0E0671 : - 0X0E0672 : - 0X0E0673 : - 0X0E0674 : - 0X0E0675 : - 0X0E0676 : - 0X0E0677 : - 0X0E0678 : - 0X0E0679 : - 0X0E067A : - 0X0E067B : - 0X0E067C : - 0X0E067D : - 0X0E067E : - 0X0E067F : - 0X0E0680 : - 0X0E0681 : - 0X0E0682 : - 0X0E0683 : - 0X0E0684 : - 0X0E0685 : - 0X0E0686 : - 0X0E0687 : - 0X0E0688 : - 0X0E0689 : - 0X0E068A : - 0X0E068B : - 0X0E068C : - 0X0E068D : - 0X0E068E : - 0X0E068F : - 0X0E0690 : - 0X0E0691 : - 0X0E0692 : - 0X0E0693 : - 0X0E0694 : - 0X0E0695 : - 0X0E0696 : - 0X0E0697 : - 0X0E0698 : - 0X0E0699 : - 0X0E069A : - 0X0E069B : - 0X0E069C : - 0X0E069D : - 0X0E069E : - 0X0E069F : - 0X0E06A0 : - 0X0E06A1 : - 0X0E06A2 : - 0X0E06A3 : - 0X0E06A4 : - 0X0E06A5 : - 0X0E06A6 : - 0X0E06A7 : - 0X0E06A8 : - 0X0E06A9 : - 0X0E06AA : - 0X0E06AB : - 0X0E06AC : - 0X0E06AD : - 0X0E06AE : - 0X0E06AF : - 0X0E06B0 : - 0X0E06B1 : - 0X0E06B2 : - 0X0E06B3 : - 0X0E06B4 : - 0X0E06B5 : - 0X0E06B6 : - 0X0E06B7 : - 0X0E06B8 : - 0X0E06B9 : - 0X0E06BA : - 0X0E06BB : - 0X0E06BC : - 0X0E06BD : - 0X0E06BE : - 0X0E06BF : - 0X0E06C0 : - 0X0E06C1 : - 0X0E06C2 : - 0X0E06C3 : - 0X0E06C4 : - 0X0E06C5 : - 0X0E06C6 : - 0X0E06C7 : - 0X0E06C8 : - 0X0E06C9 : - 0X0E06CA : - 0X0E06CB : - 0X0E06CC : - 0X0E06CD : - 0X0E06CE : - 0X0E06CF : - 0X0E06D0 : - 0X0E06D1 : - 0X0E06D2 : - 0X0E06D3 : - 0X0E06D4 : - 0X0E06D5 : - 0X0E06D6 : - 0X0E06D7 : - 0X0E06D8 : - 0X0E06D9 : - 0X0E06DA : - 0X0E06DB : - 0X0E06DC : - 0X0E06DD : - 0X0E06DE : - 0X0E06DF : - 0X0E06E0 : - 0X0E06E1 : - 0X0E06E2 : - 0X0E06E3 : - 0X0E06E4 : - 0X0E06E5 : - 0X0E06E6 : - 0X0E06E7 : - 0X0E06E8 : - 0X0E06E9 : - 0X0E06EA : - 0X0E06EB : - 0X0E06EC : - 0X0E06ED : - 0X0E06EE : - 0X0E06EF : - 0X0E06F0 : - 0X0E06F1 : - 0X0E06F2 : - 0X0E06F3 : - 0X0E06F4 : - 0X0E06F5 : - 0X0E06F6 : - 0X0E06F7 : - 0X0E06F8 : - 0X0E06F9 : - 0X0E06FA : - 0X0E06FB : - 0X0E06FC : - 0X0E06FD : - 0X0E06FE : - 0X0E06FF : - 0X0E0700 : - 0X0E0701 : - 0X0E0702 : - 0X0E0703 : - 0X0E0704 : - 0X0E0705 : - 0X0E0706 : - 0X0E0707 : - 0X0E0708 : - 0X0E0709 : - 0X0E070A : - 0X0E070B : - 0X0E070C : - 0X0E070D : - 0X0E070E : - 0X0E070F : - 0X0E0710 : - 0X0E0711 : - 0X0E0712 : - 0X0E0713 : - 0X0E0714 : - 0X0E0715 : - 0X0E0716 : - 0X0E0717 : - 0X0E0718 : - 0X0E0719 : - 0X0E071A : - 0X0E071B : - 0X0E071C : - 0X0E071D : - 0X0E071E : - 0X0E071F : - 0X0E0720 : - 0X0E0721 : - 0X0E0722 : - 0X0E0723 : - 0X0E0724 : - 0X0E0725 : - 0X0E0726 : - 0X0E0727 : - 0X0E0728 : - 0X0E0729 : - 0X0E072A : - 0X0E072B : - 0X0E072C : - 0X0E072D : - 0X0E072E : - 0X0E072F : - 0X0E0730 : - 0X0E0731 : - 0X0E0732 : - 0X0E0733 : - 0X0E0734 : - 0X0E0735 : - 0X0E0736 : - 0X0E0737 : - 0X0E0738 : - 0X0E0739 : - 0X0E073A : - 0X0E073B : - 0X0E073C : - 0X0E073D : - 0X0E073E : - 0X0E073F : - 0X0E0740 : - 0X0E0741 : - 0X0E0742 : - 0X0E0743 : - 0X0E0744 : - 0X0E0745 : - 0X0E0746 : - 0X0E0747 : - 0X0E0748 : - 0X0E0749 : - 0X0E074A : - 0X0E074B : - 0X0E074C : - 0X0E074D : - 0X0E074E : - 0X0E074F : - 0X0E0750 : - 0X0E0751 : - 0X0E0752 : - 0X0E0753 : - 0X0E0754 : - 0X0E0755 : - 0X0E0756 : - 0X0E0757 : - 0X0E0758 : - 0X0E0759 : - 0X0E075A : - 0X0E075B : - 0X0E075C : - 0X0E075D : - 0X0E075E : - 0X0E075F : - 0X0E0760 : - 0X0E0761 : - 0X0E0762 : - 0X0E0763 : - 0X0E0764 : - 0X0E0765 : - 0X0E0766 : - 0X0E0767 : - 0X0E0768 : - 0X0E0769 : - 0X0E076A : - 0X0E076B : - 0X0E076C : - 0X0E076D : - 0X0E076E : - 0X0E076F : - 0X0E0770 : - 0X0E0771 : - 0X0E0772 : - 0X0E0773 : - 0X0E0774 : - 0X0E0775 : - 0X0E0776 : - 0X0E0777 : - 0X0E0778 : - 0X0E0779 : - 0X0E077A : - 0X0E077B : - 0X0E077C : - 0X0E077D : - 0X0E077E : - 0X0E077F : - 0X0E0780 : - 0X0E0781 : - 0X0E0782 : - 0X0E0783 : - 0X0E0784 : - 0X0E0785 : - 0X0E0786 : - 0X0E0787 : - 0X0E0788 : - 0X0E0789 : - 0X0E078A : - 0X0E078B : - 0X0E078C : - 0X0E078D : - 0X0E078E : - 0X0E078F : - 0X0E0790 : - 0X0E0791 : - 0X0E0792 : - 0X0E0793 : - 0X0E0794 : - 0X0E0795 : - 0X0E0796 : - 0X0E0797 : - 0X0E0798 : - 0X0E0799 : - 0X0E079A : - 0X0E079B : - 0X0E079C : - 0X0E079D : - 0X0E079E : - 0X0E079F : - 0X0E07A0 : - 0X0E07A1 : - 0X0E07A2 : - 0X0E07A3 : - 0X0E07A4 : - 0X0E07A5 : - 0X0E07A6 : - 0X0E07A7 : - 0X0E07A8 : - 0X0E07A9 : - 0X0E07AA : - 0X0E07AB : - 0X0E07AC : - 0X0E07AD : - 0X0E07AE : - 0X0E07AF : - 0X0E07B0 : - 0X0E07B1 : - 0X0E07B2 : - 0X0E07B3 : - 0X0E07B4 : - 0X0E07B5 : - 0X0E07B6 : - 0X0E07B7 : - 0X0E07B8 : - 0X0E07B9 : - 0X0E07BA : - 0X0E07BB : - 0X0E07BC : - 0X0E07BD : - 0X0E07BE : - 0X0E07BF : - 0X0E07C0 : - 0X0E07C1 : - 0X0E07C2 : - 0X0E07C3 : - 0X0E07C4 : - 0X0E07C5 : - 0X0E07C6 : - 0X0E07C7 : - 0X0E07C8 : - 0X0E07C9 : - 0X0E07CA : - 0X0E07CB : - 0X0E07CC : - 0X0E07CD : - 0X0E07CE : - 0X0E07CF : - 0X0E07D0 : - 0X0E07D1 : - 0X0E07D2 : - 0X0E07D3 : - 0X0E07D4 : - 0X0E07D5 : - 0X0E07D6 : - 0X0E07D7 : - 0X0E07D8 : - 0X0E07D9 : - 0X0E07DA : - 0X0E07DB : - 0X0E07DC : - 0X0E07DD : - 0X0E07DE : - 0X0E07DF : - 0X0E07E0 : - 0X0E07E1 : - 0X0E07E2 : - 0X0E07E3 : - 0X0E07E4 : - 0X0E07E5 : - 0X0E07E6 : - 0X0E07E7 : - 0X0E07E8 : - 0X0E07E9 : - 0X0E07EA : - 0X0E07EB : - 0X0E07EC : - 0X0E07ED : - 0X0E07EE : - 0X0E07EF : - 0X0E07F0 : - 0X0E07F1 : - 0X0E07F2 : - 0X0E07F3 : - 0X0E07F4 : - 0X0E07F5 : - 0X0E07F6 : - 0X0E07F7 : - 0X0E07F8 : - 0X0E07F9 : - 0X0E07FA : - 0X0E07FB : - 0X0E07FC : - 0X0E07FD : - 0X0E07FE : - 0X0E07FF : - 0X0E0800 : - 0X0E0801 : - 0X0E0802 : - 0X0E0803 : - 0X0E0804 : - 0X0E0805 : - 0X0E0806 : - 0X0E0807 : - 0X0E0808 : - 0X0E0809 : - 0X0E080A : - 0X0E080B : - 0X0E080C : - 0X0E080D : - 0X0E080E : - 0X0E080F : - 0X0E0810 : - 0X0E0811 : - 0X0E0812 : - 0X0E0813 : - 0X0E0814 : - 0X0E0815 : - 0X0E0816 : - 0X0E0817 : - 0X0E0818 : - 0X0E0819 : - 0X0E081A : - 0X0E081B : - 0X0E081C : - 0X0E081D : - 0X0E081E : - 0X0E081F : - 0X0E0820 : - 0X0E0821 : - 0X0E0822 : - 0X0E0823 : - 0X0E0824 : - 0X0E0825 : - 0X0E0826 : - 0X0E0827 : - 0X0E0828 : - 0X0E0829 : - 0X0E082A : - 0X0E082B : - 0X0E082C : - 0X0E082D : - 0X0E082E : - 0X0E082F : - 0X0E0830 : - 0X0E0831 : - 0X0E0832 : - 0X0E0833 : - 0X0E0834 : - 0X0E0835 : - 0X0E0836 : - 0X0E0837 : - 0X0E0838 : - 0X0E0839 : - 0X0E083A : - 0X0E083B : - 0X0E083C : - 0X0E083D : - 0X0E083E : - 0X0E083F : - 0X0E0840 : - 0X0E0841 : - 0X0E0842 : - 0X0E0843 : - 0X0E0844 : - 0X0E0845 : - 0X0E0846 : - 0X0E0847 : - 0X0E0848 : - 0X0E0849 : - 0X0E084A : - 0X0E084B : - 0X0E084C : - 0X0E084D : - 0X0E084E : - 0X0E084F : - 0X0E0850 : - 0X0E0851 : - 0X0E0852 : - 0X0E0853 : - 0X0E0854 : - 0X0E0855 : - 0X0E0856 : - 0X0E0857 : - 0X0E0858 : - 0X0E0859 : - 0X0E085A : - 0X0E085B : - 0X0E085C : - 0X0E085D : - 0X0E085E : - 0X0E085F : - 0X0E0860 : - 0X0E0861 : - 0X0E0862 : - 0X0E0863 : - 0X0E0864 : - 0X0E0865 : - 0X0E0866 : - 0X0E0867 : - 0X0E0868 : - 0X0E0869 : - 0X0E086A : - 0X0E086B : - 0X0E086C : - 0X0E086D : - 0X0E086E : - 0X0E086F : - 0X0E0870 : - 0X0E0871 : - 0X0E0872 : - 0X0E0873 : - 0X0E0874 : - 0X0E0875 : - 0X0E0876 : - 0X0E0877 : - 0X0E0878 : - 0X0E0879 : - 0X0E087A : - 0X0E087B : - 0X0E087C : - 0X0E087D : - 0X0E087E : - 0X0E087F : - 0X0E0880 : - 0X0E0881 : - 0X0E0882 : - 0X0E0883 : - 0X0E0884 : - 0X0E0885 : - 0X0E0886 : - 0X0E0887 : - 0X0E0888 : - 0X0E0889 : - 0X0E088A : - 0X0E088B : - 0X0E088C : - 0X0E088D : - 0X0E088E : - 0X0E088F : - 0X0E0890 : - 0X0E0891 : - 0X0E0892 : - 0X0E0893 : - 0X0E0894 : - 0X0E0895 : - 0X0E0896 : - 0X0E0897 : - 0X0E0898 : - 0X0E0899 : - 0X0E089A : - 0X0E089B : - 0X0E089C : - 0X0E089D : - 0X0E089E : - 0X0E089F : - 0X0E08A0 : - 0X0E08A1 : - 0X0E08A2 : - 0X0E08A3 : - 0X0E08A4 : - 0X0E08A5 : - 0X0E08A6 : - 0X0E08A7 : - 0X0E08A8 : - 0X0E08A9 : - 0X0E08AA : - 0X0E08AB : - 0X0E08AC : - 0X0E08AD : - 0X0E08AE : - 0X0E08AF : - 0X0E08B0 : - 0X0E08B1 : - 0X0E08B2 : - 0X0E08B3 : - 0X0E08B4 : - 0X0E08B5 : - 0X0E08B6 : - 0X0E08B7 : - 0X0E08B8 : - 0X0E08B9 : - 0X0E08BA : - 0X0E08BB : - 0X0E08BC : - 0X0E08BD : - 0X0E08BE : - 0X0E08BF : - 0X0E08C0 : - 0X0E08C1 : - 0X0E08C2 : - 0X0E08C3 : - 0X0E08C4 : - 0X0E08C5 : - 0X0E08C6 : - 0X0E08C7 : - 0X0E08C8 : - 0X0E08C9 : - 0X0E08CA : - 0X0E08CB : - 0X0E08CC : - 0X0E08CD : - 0X0E08CE : - 0X0E08CF : - 0X0E08D0 : - 0X0E08D1 : - 0X0E08D2 : - 0X0E08D3 : - 0X0E08D4 : - 0X0E08D5 : - 0X0E08D6 : - 0X0E08D7 : - 0X0E08D8 : - 0X0E08D9 : - 0X0E08DA : - 0X0E08DB : - 0X0E08DC : - 0X0E08DD : - 0X0E08DE : - 0X0E08DF : - 0X0E08E0 : - 0X0E08E1 : - 0X0E08E2 : - 0X0E08E3 : - 0X0E08E4 : - 0X0E08E5 : - 0X0E08E6 : - 0X0E08E7 : - 0X0E08E8 : - 0X0E08E9 : - 0X0E08EA : - 0X0E08EB : - 0X0E08EC : - 0X0E08ED : - 0X0E08EE : - 0X0E08EF : - 0X0E08F0 : - 0X0E08F1 : - 0X0E08F2 : - 0X0E08F3 : - 0X0E08F4 : - 0X0E08F5 : - 0X0E08F6 : - 0X0E08F7 : - 0X0E08F8 : - 0X0E08F9 : - 0X0E08FA : - 0X0E08FB : - 0X0E08FC : - 0X0E08FD : - 0X0E08FE : - 0X0E08FF : - 0X0E0900 : - 0X0E0901 : - 0X0E0902 : - 0X0E0903 : - 0X0E0904 : - 0X0E0905 : - 0X0E0906 : - 0X0E0907 : - 0X0E0908 : - 0X0E0909 : - 0X0E090A : - 0X0E090B : - 0X0E090C : - 0X0E090D : - 0X0E090E : - 0X0E090F : - 0X0E0910 : - 0X0E0911 : - 0X0E0912 : - 0X0E0913 : - 0X0E0914 : - 0X0E0915 : - 0X0E0916 : - 0X0E0917 : - 0X0E0918 : - 0X0E0919 : - 0X0E091A : - 0X0E091B : - 0X0E091C : - 0X0E091D : - 0X0E091E : - 0X0E091F : - 0X0E0920 : - 0X0E0921 : - 0X0E0922 : - 0X0E0923 : - 0X0E0924 : - 0X0E0925 : - 0X0E0926 : - 0X0E0927 : - 0X0E0928 : - 0X0E0929 : - 0X0E092A : - 0X0E092B : - 0X0E092C : - 0X0E092D : - 0X0E092E : - 0X0E092F : - 0X0E0930 : - 0X0E0931 : - 0X0E0932 : - 0X0E0933 : - 0X0E0934 : - 0X0E0935 : - 0X0E0936 : - 0X0E0937 : - 0X0E0938 : - 0X0E0939 : - 0X0E093A : - 0X0E093B : - 0X0E093C : - 0X0E093D : - 0X0E093E : - 0X0E093F : - 0X0E0940 : - 0X0E0941 : - 0X0E0942 : - 0X0E0943 : - 0X0E0944 : - 0X0E0945 : - 0X0E0946 : - 0X0E0947 : - 0X0E0948 : - 0X0E0949 : - 0X0E094A : - 0X0E094B : - 0X0E094C : - 0X0E094D : - 0X0E094E : - 0X0E094F : - 0X0E0950 : - 0X0E0951 : - 0X0E0952 : - 0X0E0953 : - 0X0E0954 : - 0X0E0955 : - 0X0E0956 : - 0X0E0957 : - 0X0E0958 : - 0X0E0959 : - 0X0E095A : - 0X0E095B : - 0X0E095C : - 0X0E095D : - 0X0E095E : - 0X0E095F : - 0X0E0960 : - 0X0E0961 : - 0X0E0962 : - 0X0E0963 : - 0X0E0964 : - 0X0E0965 : - 0X0E0966 : - 0X0E0967 : - 0X0E0968 : - 0X0E0969 : - 0X0E096A : - 0X0E096B : - 0X0E096C : - 0X0E096D : - 0X0E096E : - 0X0E096F : - 0X0E0970 : - 0X0E0971 : - 0X0E0972 : - 0X0E0973 : - 0X0E0974 : - 0X0E0975 : - 0X0E0976 : - 0X0E0977 : - 0X0E0978 : - 0X0E0979 : - 0X0E097A : - 0X0E097B : - 0X0E097C : - 0X0E097D : - 0X0E097E : - 0X0E097F : - 0X0E0980 : - 0X0E0981 : - 0X0E0982 : - 0X0E0983 : - 0X0E0984 : - 0X0E0985 : - 0X0E0986 : - 0X0E0987 : - 0X0E0988 : - 0X0E0989 : - 0X0E098A : - 0X0E098B : - 0X0E098C : - 0X0E098D : - 0X0E098E : - 0X0E098F : - 0X0E0990 : - 0X0E0991 : - 0X0E0992 : - 0X0E0993 : - 0X0E0994 : - 0X0E0995 : - 0X0E0996 : - 0X0E0997 : - 0X0E0998 : - 0X0E0999 : - 0X0E099A : - 0X0E099B : - 0X0E099C : - 0X0E099D : - 0X0E099E : - 0X0E099F : - 0X0E09A0 : - 0X0E09A1 : - 0X0E09A2 : - 0X0E09A3 : - 0X0E09A4 : - 0X0E09A5 : - 0X0E09A6 : - 0X0E09A7 : - 0X0E09A8 : - 0X0E09A9 : - 0X0E09AA : - 0X0E09AB : - 0X0E09AC : - 0X0E09AD : - 0X0E09AE : - 0X0E09AF : - 0X0E09B0 : - 0X0E09B1 : - 0X0E09B2 : - 0X0E09B3 : - 0X0E09B4 : - 0X0E09B5 : - 0X0E09B6 : - 0X0E09B7 : - 0X0E09B8 : - 0X0E09B9 : - 0X0E09BA : - 0X0E09BB : - 0X0E09BC : - 0X0E09BD : - 0X0E09BE : - 0X0E09BF : - 0X0E09C0 : - 0X0E09C1 : - 0X0E09C2 : - 0X0E09C3 : - 0X0E09C4 : - 0X0E09C5 : - 0X0E09C6 : - 0X0E09C7 : - 0X0E09C8 : - 0X0E09C9 : - 0X0E09CA : - 0X0E09CB : - 0X0E09CC : - 0X0E09CD : - 0X0E09CE : - 0X0E09CF : - 0X0E09D0 : - 0X0E09D1 : - 0X0E09D2 : - 0X0E09D3 : - 0X0E09D4 : - 0X0E09D5 : - 0X0E09D6 : - 0X0E09D7 : - 0X0E09D8 : - 0X0E09D9 : - 0X0E09DA : - 0X0E09DB : - 0X0E09DC : - 0X0E09DD : - 0X0E09DE : - 0X0E09DF : - 0X0E09E0 : - 0X0E09E1 : - 0X0E09E2 : - 0X0E09E3 : - 0X0E09E4 : - 0X0E09E5 : - 0X0E09E6 : - 0X0E09E7 : - 0X0E09E8 : - 0X0E09E9 : - 0X0E09EA : - 0X0E09EB : - 0X0E09EC : - 0X0E09ED : - 0X0E09EE : - 0X0E09EF : - 0X0E09F0 : - 0X0E09F1 : - 0X0E09F2 : - 0X0E09F3 : - 0X0E09F4 : - 0X0E09F5 : - 0X0E09F6 : - 0X0E09F7 : - 0X0E09F8 : - 0X0E09F9 : - 0X0E09FA : - 0X0E09FB : - 0X0E09FC : - 0X0E09FD : - 0X0E09FE : - 0X0E09FF : - 0X0E0A00 : - 0X0E0A01 : - 0X0E0A02 : - 0X0E0A03 : - 0X0E0A04 : - 0X0E0A05 : - 0X0E0A06 : - 0X0E0A07 : - 0X0E0A08 : - 0X0E0A09 : - 0X0E0A0A : - 0X0E0A0B : - 0X0E0A0C : - 0X0E0A0D : - 0X0E0A0E : - 0X0E0A0F : - 0X0E0A10 : - 0X0E0A11 : - 0X0E0A12 : - 0X0E0A13 : - 0X0E0A14 : - 0X0E0A15 : - 0X0E0A16 : - 0X0E0A17 : - 0X0E0A18 : - 0X0E0A19 : - 0X0E0A1A : - 0X0E0A1B : - 0X0E0A1C : - 0X0E0A1D : - 0X0E0A1E : - 0X0E0A1F : - 0X0E0A20 : - 0X0E0A21 : - 0X0E0A22 : - 0X0E0A23 : - 0X0E0A24 : - 0X0E0A25 : - 0X0E0A26 : - 0X0E0A27 : - 0X0E0A28 : - 0X0E0A29 : - 0X0E0A2A : - 0X0E0A2B : - 0X0E0A2C : - 0X0E0A2D : - 0X0E0A2E : - 0X0E0A2F : - 0X0E0A30 : - 0X0E0A31 : - 0X0E0A32 : - 0X0E0A33 : - 0X0E0A34 : - 0X0E0A35 : - 0X0E0A36 : - 0X0E0A37 : - 0X0E0A38 : - 0X0E0A39 : - 0X0E0A3A : - 0X0E0A3B : - 0X0E0A3C : - 0X0E0A3D : - 0X0E0A3E : - 0X0E0A3F : - 0X0E0A40 : - 0X0E0A41 : - 0X0E0A42 : - 0X0E0A43 : - 0X0E0A44 : - 0X0E0A45 : - 0X0E0A46 : - 0X0E0A47 : - 0X0E0A48 : - 0X0E0A49 : - 0X0E0A4A : - 0X0E0A4B : - 0X0E0A4C : - 0X0E0A4D : - 0X0E0A4E : - 0X0E0A4F : - 0X0E0A50 : - 0X0E0A51 : - 0X0E0A52 : - 0X0E0A53 : - 0X0E0A54 : - 0X0E0A55 : - 0X0E0A56 : - 0X0E0A57 : - 0X0E0A58 : - 0X0E0A59 : - 0X0E0A5A : - 0X0E0A5B : - 0X0E0A5C : - 0X0E0A5D : - 0X0E0A5E : - 0X0E0A5F : - 0X0E0A60 : - 0X0E0A61 : - 0X0E0A62 : - 0X0E0A63 : - 0X0E0A64 : - 0X0E0A65 : - 0X0E0A66 : - 0X0E0A67 : - 0X0E0A68 : - 0X0E0A69 : - 0X0E0A6A : - 0X0E0A6B : - 0X0E0A6C : - 0X0E0A6D : - 0X0E0A6E : - 0X0E0A6F : - 0X0E0A70 : - 0X0E0A71 : - 0X0E0A72 : - 0X0E0A73 : - 0X0E0A74 : - 0X0E0A75 : - 0X0E0A76 : - 0X0E0A77 : - 0X0E0A78 : - 0X0E0A79 : - 0X0E0A7A : - 0X0E0A7B : - 0X0E0A7C : - 0X0E0A7D : - 0X0E0A7E : - 0X0E0A7F : - 0X0E0A80 : - 0X0E0A81 : - 0X0E0A82 : - 0X0E0A83 : - 0X0E0A84 : - 0X0E0A85 : - 0X0E0A86 : - 0X0E0A87 : - 0X0E0A88 : - 0X0E0A89 : - 0X0E0A8A : - 0X0E0A8B : - 0X0E0A8C : - 0X0E0A8D : - 0X0E0A8E : - 0X0E0A8F : - 0X0E0A90 : - 0X0E0A91 : - 0X0E0A92 : - 0X0E0A93 : - 0X0E0A94 : - 0X0E0A95 : - 0X0E0A96 : - 0X0E0A97 : - 0X0E0A98 : - 0X0E0A99 : - 0X0E0A9A : - 0X0E0A9B : - 0X0E0A9C : - 0X0E0A9D : - 0X0E0A9E : - 0X0E0A9F : - 0X0E0AA0 : - 0X0E0AA1 : - 0X0E0AA2 : - 0X0E0AA3 : - 0X0E0AA4 : - 0X0E0AA5 : - 0X0E0AA6 : - 0X0E0AA7 : - 0X0E0AA8 : - 0X0E0AA9 : - 0X0E0AAA : - 0X0E0AAB : - 0X0E0AAC : - 0X0E0AAD : - 0X0E0AAE : - 0X0E0AAF : - 0X0E0AB0 : - 0X0E0AB1 : - 0X0E0AB2 : - 0X0E0AB3 : - 0X0E0AB4 : - 0X0E0AB5 : - 0X0E0AB6 : - 0X0E0AB7 : - 0X0E0AB8 : - 0X0E0AB9 : - 0X0E0ABA : - 0X0E0ABB : - 0X0E0ABC : - 0X0E0ABD : - 0X0E0ABE : - 0X0E0ABF : - 0X0E0AC0 : - 0X0E0AC1 : - 0X0E0AC2 : - 0X0E0AC3 : - 0X0E0AC4 : - 0X0E0AC5 : - 0X0E0AC6 : - 0X0E0AC7 : - 0X0E0AC8 : - 0X0E0AC9 : - 0X0E0ACA : - 0X0E0ACB : - 0X0E0ACC : - 0X0E0ACD : - 0X0E0ACE : - 0X0E0ACF : - 0X0E0AD0 : - 0X0E0AD1 : - 0X0E0AD2 : - 0X0E0AD3 : - 0X0E0AD4 : - 0X0E0AD5 : - 0X0E0AD6 : - 0X0E0AD7 : - 0X0E0AD8 : - 0X0E0AD9 : - 0X0E0ADA : - 0X0E0ADB : - 0X0E0ADC : - 0X0E0ADD : - 0X0E0ADE : - 0X0E0ADF : - 0X0E0AE0 : - 0X0E0AE1 : - 0X0E0AE2 : - 0X0E0AE3 : - 0X0E0AE4 : - 0X0E0AE5 : - 0X0E0AE6 : - 0X0E0AE7 : - 0X0E0AE8 : - 0X0E0AE9 : - 0X0E0AEA : - 0X0E0AEB : - 0X0E0AEC : - 0X0E0AED : - 0X0E0AEE : - 0X0E0AEF : - 0X0E0AF0 : - 0X0E0AF1 : - 0X0E0AF2 : - 0X0E0AF3 : - 0X0E0AF4 : - 0X0E0AF5 : - 0X0E0AF6 : - 0X0E0AF7 : - 0X0E0AF8 : - 0X0E0AF9 : - 0X0E0AFA : - 0X0E0AFB : - 0X0E0AFC : - 0X0E0AFD : - 0X0E0AFE : - 0X0E0AFF : - 0X0E0B00 : - 0X0E0B01 : - 0X0E0B02 : - 0X0E0B03 : - 0X0E0B04 : - 0X0E0B05 : - 0X0E0B06 : - 0X0E0B07 : - 0X0E0B08 : - 0X0E0B09 : - 0X0E0B0A : - 0X0E0B0B : - 0X0E0B0C : - 0X0E0B0D : - 0X0E0B0E : - 0X0E0B0F : - 0X0E0B10 : - 0X0E0B11 : - 0X0E0B12 : - 0X0E0B13 : - 0X0E0B14 : - 0X0E0B15 : - 0X0E0B16 : - 0X0E0B17 : - 0X0E0B18 : - 0X0E0B19 : - 0X0E0B1A : - 0X0E0B1B : - 0X0E0B1C : - 0X0E0B1D : - 0X0E0B1E : - 0X0E0B1F : - 0X0E0B20 : - 0X0E0B21 : - 0X0E0B22 : - 0X0E0B23 : - 0X0E0B24 : - 0X0E0B25 : - 0X0E0B26 : - 0X0E0B27 : - 0X0E0B28 : - 0X0E0B29 : - 0X0E0B2A : - 0X0E0B2B : - 0X0E0B2C : - 0X0E0B2D : - 0X0E0B2E : - 0X0E0B2F : - 0X0E0B30 : - 0X0E0B31 : - 0X0E0B32 : - 0X0E0B33 : - 0X0E0B34 : - 0X0E0B35 : - 0X0E0B36 : - 0X0E0B37 : - 0X0E0B38 : - 0X0E0B39 : - 0X0E0B3A : - 0X0E0B3B : - 0X0E0B3C : - 0X0E0B3D : - 0X0E0B3E : - 0X0E0B3F : - 0X0E0B40 : - 0X0E0B41 : - 0X0E0B42 : - 0X0E0B43 : - 0X0E0B44 : - 0X0E0B45 : - 0X0E0B46 : - 0X0E0B47 : - 0X0E0B48 : - 0X0E0B49 : - 0X0E0B4A : - 0X0E0B4B : - 0X0E0B4C : - 0X0E0B4D : - 0X0E0B4E : - 0X0E0B4F : - 0X0E0B50 : - 0X0E0B51 : - 0X0E0B52 : - 0X0E0B53 : - 0X0E0B54 : - 0X0E0B55 : - 0X0E0B56 : - 0X0E0B57 : - 0X0E0B58 : - 0X0E0B59 : - 0X0E0B5A : - 0X0E0B5B : - 0X0E0B5C : - 0X0E0B5D : - 0X0E0B5E : - 0X0E0B5F : - 0X0E0B60 : - 0X0E0B61 : - 0X0E0B62 : - 0X0E0B63 : - 0X0E0B64 : - 0X0E0B65 : - 0X0E0B66 : - 0X0E0B67 : - 0X0E0B68 : - 0X0E0B69 : - 0X0E0B6A : - 0X0E0B6B : - 0X0E0B6C : - 0X0E0B6D : - 0X0E0B6E : - 0X0E0B6F : - 0X0E0B70 : - 0X0E0B71 : - 0X0E0B72 : - 0X0E0B73 : - 0X0E0B74 : - 0X0E0B75 : - 0X0E0B76 : - 0X0E0B77 : - 0X0E0B78 : - 0X0E0B79 : - 0X0E0B7A : - 0X0E0B7B : - 0X0E0B7C : - 0X0E0B7D : - 0X0E0B7E : - 0X0E0B7F : - 0X0E0B80 : - 0X0E0B81 : - 0X0E0B82 : - 0X0E0B83 : - 0X0E0B84 : - 0X0E0B85 : - 0X0E0B86 : - 0X0E0B87 : - 0X0E0B88 : - 0X0E0B89 : - 0X0E0B8A : - 0X0E0B8B : - 0X0E0B8C : - 0X0E0B8D : - 0X0E0B8E : - 0X0E0B8F : - 0X0E0B90 : - 0X0E0B91 : - 0X0E0B92 : - 0X0E0B93 : - 0X0E0B94 : - 0X0E0B95 : - 0X0E0B96 : - 0X0E0B97 : - 0X0E0B98 : - 0X0E0B99 : - 0X0E0B9A : - 0X0E0B9B : - 0X0E0B9C : - 0X0E0B9D : - 0X0E0B9E : - 0X0E0B9F : - 0X0E0BA0 : - 0X0E0BA1 : - 0X0E0BA2 : - 0X0E0BA3 : - 0X0E0BA4 : - 0X0E0BA5 : - 0X0E0BA6 : - 0X0E0BA7 : - 0X0E0BA8 : - 0X0E0BA9 : - 0X0E0BAA : - 0X0E0BAB : - 0X0E0BAC : - 0X0E0BAD : - 0X0E0BAE : - 0X0E0BAF : - 0X0E0BB0 : - 0X0E0BB1 : - 0X0E0BB2 : - 0X0E0BB3 : - 0X0E0BB4 : - 0X0E0BB5 : - 0X0E0BB6 : - 0X0E0BB7 : - 0X0E0BB8 : - 0X0E0BB9 : - 0X0E0BBA : - 0X0E0BBB : - 0X0E0BBC : - 0X0E0BBD : - 0X0E0BBE : - 0X0E0BBF : - 0X0E0BC0 : - 0X0E0BC1 : - 0X0E0BC2 : - 0X0E0BC3 : - 0X0E0BC4 : - 0X0E0BC5 : - 0X0E0BC6 : - 0X0E0BC7 : - 0X0E0BC8 : - 0X0E0BC9 : - 0X0E0BCA : - 0X0E0BCB : - 0X0E0BCC : - 0X0E0BCD : - 0X0E0BCE : - 0X0E0BCF : - 0X0E0BD0 : - 0X0E0BD1 : - 0X0E0BD2 : - 0X0E0BD3 : - 0X0E0BD4 : - 0X0E0BD5 : - 0X0E0BD6 : - 0X0E0BD7 : - 0X0E0BD8 : - 0X0E0BD9 : - 0X0E0BDA : - 0X0E0BDB : - 0X0E0BDC : - 0X0E0BDD : - 0X0E0BDE : - 0X0E0BDF : - 0X0E0BE0 : - 0X0E0BE1 : - 0X0E0BE2 : - 0X0E0BE3 : - 0X0E0BE4 : - 0X0E0BE5 : - 0X0E0BE6 : - 0X0E0BE7 : - 0X0E0BE8 : - 0X0E0BE9 : - 0X0E0BEA : - 0X0E0BEB : - 0X0E0BEC : - 0X0E0BED : - 0X0E0BEE : - 0X0E0BEF : - 0X0E0BF0 : - 0X0E0BF1 : - 0X0E0BF2 : - 0X0E0BF3 : - 0X0E0BF4 : - 0X0E0BF5 : - 0X0E0BF6 : - 0X0E0BF7 : - 0X0E0BF8 : - 0X0E0BF9 : - 0X0E0BFA : - 0X0E0BFB : - 0X0E0BFC : - 0X0E0BFD : - 0X0E0BFE : - 0X0E0BFF : - 0X0E0C00 : - 0X0E0C01 : - 0X0E0C02 : - 0X0E0C03 : - 0X0E0C04 : - 0X0E0C05 : - 0X0E0C06 : - 0X0E0C07 : - 0X0E0C08 : - 0X0E0C09 : - 0X0E0C0A : - 0X0E0C0B : - 0X0E0C0C : - 0X0E0C0D : - 0X0E0C0E : - 0X0E0C0F : - 0X0E0C10 : - 0X0E0C11 : - 0X0E0C12 : - 0X0E0C13 : - 0X0E0C14 : - 0X0E0C15 : - 0X0E0C16 : - 0X0E0C17 : - 0X0E0C18 : - 0X0E0C19 : - 0X0E0C1A : - 0X0E0C1B : - 0X0E0C1C : - 0X0E0C1D : - 0X0E0C1E : - 0X0E0C1F : - 0X0E0C20 : - 0X0E0C21 : - 0X0E0C22 : - 0X0E0C23 : - 0X0E0C24 : - 0X0E0C25 : - 0X0E0C26 : - 0X0E0C27 : - 0X0E0C28 : - 0X0E0C29 : - 0X0E0C2A : - 0X0E0C2B : - 0X0E0C2C : - 0X0E0C2D : - 0X0E0C2E : - 0X0E0C2F : - 0X0E0C30 : - 0X0E0C31 : - 0X0E0C32 : - 0X0E0C33 : - 0X0E0C34 : - 0X0E0C35 : - 0X0E0C36 : - 0X0E0C37 : - 0X0E0C38 : - 0X0E0C39 : - 0X0E0C3A : - 0X0E0C3B : - 0X0E0C3C : - 0X0E0C3D : - 0X0E0C3E : - 0X0E0C3F : - 0X0E0C40 : - 0X0E0C41 : - 0X0E0C42 : - 0X0E0C43 : - 0X0E0C44 : - 0X0E0C45 : - 0X0E0C46 : - 0X0E0C47 : - 0X0E0C48 : - 0X0E0C49 : - 0X0E0C4A : - 0X0E0C4B : - 0X0E0C4C : - 0X0E0C4D : - 0X0E0C4E : - 0X0E0C4F : - 0X0E0C50 : - 0X0E0C51 : - 0X0E0C52 : - 0X0E0C53 : - 0X0E0C54 : - 0X0E0C55 : - 0X0E0C56 : - 0X0E0C57 : - 0X0E0C58 : - 0X0E0C59 : - 0X0E0C5A : - 0X0E0C5B : - 0X0E0C5C : - 0X0E0C5D : - 0X0E0C5E : - 0X0E0C5F : - 0X0E0C60 : - 0X0E0C61 : - 0X0E0C62 : - 0X0E0C63 : - 0X0E0C64 : - 0X0E0C65 : - 0X0E0C66 : - 0X0E0C67 : - 0X0E0C68 : - 0X0E0C69 : - 0X0E0C6A : - 0X0E0C6B : - 0X0E0C6C : - 0X0E0C6D : - 0X0E0C6E : - 0X0E0C6F : - 0X0E0C70 : - 0X0E0C71 : - 0X0E0C72 : - 0X0E0C73 : - 0X0E0C74 : - 0X0E0C75 : - 0X0E0C76 : - 0X0E0C77 : - 0X0E0C78 : - 0X0E0C79 : - 0X0E0C7A : - 0X0E0C7B : - 0X0E0C7C : - 0X0E0C7D : - 0X0E0C7E : - 0X0E0C7F : - 0X0E0C80 : - 0X0E0C81 : - 0X0E0C82 : - 0X0E0C83 : - 0X0E0C84 : - 0X0E0C85 : - 0X0E0C86 : - 0X0E0C87 : - 0X0E0C88 : - 0X0E0C89 : - 0X0E0C8A : - 0X0E0C8B : - 0X0E0C8C : - 0X0E0C8D : - 0X0E0C8E : - 0X0E0C8F : - 0X0E0C90 : - 0X0E0C91 : - 0X0E0C92 : - 0X0E0C93 : - 0X0E0C94 : - 0X0E0C95 : - 0X0E0C96 : - 0X0E0C97 : - 0X0E0C98 : - 0X0E0C99 : - 0X0E0C9A : - 0X0E0C9B : - 0X0E0C9C : - 0X0E0C9D : - 0X0E0C9E : - 0X0E0C9F : - 0X0E0CA0 : - 0X0E0CA1 : - 0X0E0CA2 : - 0X0E0CA3 : - 0X0E0CA4 : - 0X0E0CA5 : - 0X0E0CA6 : - 0X0E0CA7 : - 0X0E0CA8 : - 0X0E0CA9 : - 0X0E0CAA : - 0X0E0CAB : - 0X0E0CAC : - 0X0E0CAD : - 0X0E0CAE : - 0X0E0CAF : - 0X0E0CB0 : - 0X0E0CB1 : - 0X0E0CB2 : - 0X0E0CB3 : - 0X0E0CB4 : - 0X0E0CB5 : - 0X0E0CB6 : - 0X0E0CB7 : - 0X0E0CB8 : - 0X0E0CB9 : - 0X0E0CBA : - 0X0E0CBB : - 0X0E0CBC : - 0X0E0CBD : - 0X0E0CBE : - 0X0E0CBF : - 0X0E0CC0 : - 0X0E0CC1 : - 0X0E0CC2 : - 0X0E0CC3 : - 0X0E0CC4 : - 0X0E0CC5 : - 0X0E0CC6 : - 0X0E0CC7 : - 0X0E0CC8 : - 0X0E0CC9 : - 0X0E0CCA : - 0X0E0CCB : - 0X0E0CCC : - 0X0E0CCD : - 0X0E0CCE : - 0X0E0CCF : - 0X0E0CD0 : - 0X0E0CD1 : - 0X0E0CD2 : - 0X0E0CD3 : - 0X0E0CD4 : - 0X0E0CD5 : - 0X0E0CD6 : - 0X0E0CD7 : - 0X0E0CD8 : - 0X0E0CD9 : - 0X0E0CDA : - 0X0E0CDB : - 0X0E0CDC : - 0X0E0CDD : - 0X0E0CDE : - 0X0E0CDF : - 0X0E0CE0 : - 0X0E0CE1 : - 0X0E0CE2 : - 0X0E0CE3 : - 0X0E0CE4 : - 0X0E0CE5 : - 0X0E0CE6 : - 0X0E0CE7 : - 0X0E0CE8 : - 0X0E0CE9 : - 0X0E0CEA : - 0X0E0CEB : - 0X0E0CEC : - 0X0E0CED : - 0X0E0CEE : - 0X0E0CEF : - 0X0E0CF0 : - 0X0E0CF1 : - 0X0E0CF2 : - 0X0E0CF3 : - 0X0E0CF4 : - 0X0E0CF5 : - 0X0E0CF6 : - 0X0E0CF7 : - 0X0E0CF8 : - 0X0E0CF9 : - 0X0E0CFA : - 0X0E0CFB : - 0X0E0CFC : - 0X0E0CFD : - 0X0E0CFE : - 0X0E0CFF : - 0X0E0D00 : - 0X0E0D01 : - 0X0E0D02 : - 0X0E0D03 : - 0X0E0D04 : - 0X0E0D05 : - 0X0E0D06 : - 0X0E0D07 : - 0X0E0D08 : - 0X0E0D09 : - 0X0E0D0A : - 0X0E0D0B : - 0X0E0D0C : - 0X0E0D0D : - 0X0E0D0E : - 0X0E0D0F : - 0X0E0D10 : - 0X0E0D11 : - 0X0E0D12 : - 0X0E0D13 : - 0X0E0D14 : - 0X0E0D15 : - 0X0E0D16 : - 0X0E0D17 : - 0X0E0D18 : - 0X0E0D19 : - 0X0E0D1A : - 0X0E0D1B : - 0X0E0D1C : - 0X0E0D1D : - 0X0E0D1E : - 0X0E0D1F : - 0X0E0D20 : - 0X0E0D21 : - 0X0E0D22 : - 0X0E0D23 : - 0X0E0D24 : - 0X0E0D25 : - 0X0E0D26 : - 0X0E0D27 : - 0X0E0D28 : - 0X0E0D29 : - 0X0E0D2A : - 0X0E0D2B : - 0X0E0D2C : - 0X0E0D2D : - 0X0E0D2E : - 0X0E0D2F : - 0X0E0D30 : - 0X0E0D31 : - 0X0E0D32 : - 0X0E0D33 : - 0X0E0D34 : - 0X0E0D35 : - 0X0E0D36 : - 0X0E0D37 : - 0X0E0D38 : - 0X0E0D39 : - 0X0E0D3A : - 0X0E0D3B : - 0X0E0D3C : - 0X0E0D3D : - 0X0E0D3E : - 0X0E0D3F : - 0X0E0D40 : - 0X0E0D41 : - 0X0E0D42 : - 0X0E0D43 : - 0X0E0D44 : - 0X0E0D45 : - 0X0E0D46 : - 0X0E0D47 : - 0X0E0D48 : - 0X0E0D49 : - 0X0E0D4A : - 0X0E0D4B : - 0X0E0D4C : - 0X0E0D4D : - 0X0E0D4E : - 0X0E0D4F : - 0X0E0D50 : - 0X0E0D51 : - 0X0E0D52 : - 0X0E0D53 : - 0X0E0D54 : - 0X0E0D55 : - 0X0E0D56 : - 0X0E0D57 : - 0X0E0D58 : - 0X0E0D59 : - 0X0E0D5A : - 0X0E0D5B : - 0X0E0D5C : - 0X0E0D5D : - 0X0E0D5E : - 0X0E0D5F : - 0X0E0D60 : - 0X0E0D61 : - 0X0E0D62 : - 0X0E0D63 : - 0X0E0D64 : - 0X0E0D65 : - 0X0E0D66 : - 0X0E0D67 : - 0X0E0D68 : - 0X0E0D69 : - 0X0E0D6A : - 0X0E0D6B : - 0X0E0D6C : - 0X0E0D6D : - 0X0E0D6E : - 0X0E0D6F : - 0X0E0D70 : - 0X0E0D71 : - 0X0E0D72 : - 0X0E0D73 : - 0X0E0D74 : - 0X0E0D75 : - 0X0E0D76 : - 0X0E0D77 : - 0X0E0D78 : - 0X0E0D79 : - 0X0E0D7A : - 0X0E0D7B : - 0X0E0D7C : - 0X0E0D7D : - 0X0E0D7E : - 0X0E0D7F : - 0X0E0D80 : - 0X0E0D81 : - 0X0E0D82 : - 0X0E0D83 : - 0X0E0D84 : - 0X0E0D85 : - 0X0E0D86 : - 0X0E0D87 : - 0X0E0D88 : - 0X0E0D89 : - 0X0E0D8A : - 0X0E0D8B : - 0X0E0D8C : - 0X0E0D8D : - 0X0E0D8E : - 0X0E0D8F : - 0X0E0D90 : - 0X0E0D91 : - 0X0E0D92 : - 0X0E0D93 : - 0X0E0D94 : - 0X0E0D95 : - 0X0E0D96 : - 0X0E0D97 : - 0X0E0D98 : - 0X0E0D99 : - 0X0E0D9A : - 0X0E0D9B : - 0X0E0D9C : - 0X0E0D9D : - 0X0E0D9E : - 0X0E0D9F : - 0X0E0DA0 : - 0X0E0DA1 : - 0X0E0DA2 : - 0X0E0DA3 : - 0X0E0DA4 : - 0X0E0DA5 : - 0X0E0DA6 : - 0X0E0DA7 : - 0X0E0DA8 : - 0X0E0DA9 : - 0X0E0DAA : - 0X0E0DAB : - 0X0E0DAC : - 0X0E0DAD : - 0X0E0DAE : - 0X0E0DAF : - 0X0E0DB0 : - 0X0E0DB1 : - 0X0E0DB2 : - 0X0E0DB3 : - 0X0E0DB4 : - 0X0E0DB5 : - 0X0E0DB6 : - 0X0E0DB7 : - 0X0E0DB8 : - 0X0E0DB9 : - 0X0E0DBA : - 0X0E0DBB : - 0X0E0DBC : - 0X0E0DBD : - 0X0E0DBE : - 0X0E0DBF : - 0X0E0DC0 : - 0X0E0DC1 : - 0X0E0DC2 : - 0X0E0DC3 : - 0X0E0DC4 : - 0X0E0DC5 : - 0X0E0DC6 : - 0X0E0DC7 : - 0X0E0DC8 : - 0X0E0DC9 : - 0X0E0DCA : - 0X0E0DCB : - 0X0E0DCC : - 0X0E0DCD : - 0X0E0DCE : - 0X0E0DCF : - 0X0E0DD0 : - 0X0E0DD1 : - 0X0E0DD2 : - 0X0E0DD3 : - 0X0E0DD4 : - 0X0E0DD5 : - 0X0E0DD6 : - 0X0E0DD7 : - 0X0E0DD8 : - 0X0E0DD9 : - 0X0E0DDA : - 0X0E0DDB : - 0X0E0DDC : - 0X0E0DDD : - 0X0E0DDE : - 0X0E0DDF : - 0X0E0DE0 : - 0X0E0DE1 : - 0X0E0DE2 : - 0X0E0DE3 : - 0X0E0DE4 : - 0X0E0DE5 : - 0X0E0DE6 : - 0X0E0DE7 : - 0X0E0DE8 : - 0X0E0DE9 : - 0X0E0DEA : - 0X0E0DEB : - 0X0E0DEC : - 0X0E0DED : - 0X0E0DEE : - 0X0E0DEF : - 0X0E0DF0 : - 0X0E0DF1 : - 0X0E0DF2 : - 0X0E0DF3 : - 0X0E0DF4 : - 0X0E0DF5 : - 0X0E0DF6 : - 0X0E0DF7 : - 0X0E0DF8 : - 0X0E0DF9 : - 0X0E0DFA : - 0X0E0DFB : - 0X0E0DFC : - 0X0E0DFD : - 0X0E0DFE : - 0X0E0DFF : - 0X0E0E00 : - 0X0E0E01 : - 0X0E0E02 : - 0X0E0E03 : - 0X0E0E04 : - 0X0E0E05 : - 0X0E0E06 : - 0X0E0E07 : - 0X0E0E08 : - 0X0E0E09 : - 0X0E0E0A : - 0X0E0E0B : - 0X0E0E0C : - 0X0E0E0D : - 0X0E0E0E : - 0X0E0E0F : - 0X0E0E10 : - 0X0E0E11 : - 0X0E0E12 : - 0X0E0E13 : - 0X0E0E14 : - 0X0E0E15 : - 0X0E0E16 : - 0X0E0E17 : - 0X0E0E18 : - 0X0E0E19 : - 0X0E0E1A : - 0X0E0E1B : - 0X0E0E1C : - 0X0E0E1D : - 0X0E0E1E : - 0X0E0E1F : - 0X0E0E20 : - 0X0E0E21 : - 0X0E0E22 : - 0X0E0E23 : - 0X0E0E24 : - 0X0E0E25 : - 0X0E0E26 : - 0X0E0E27 : - 0X0E0E28 : - 0X0E0E29 : - 0X0E0E2A : - 0X0E0E2B : - 0X0E0E2C : - 0X0E0E2D : - 0X0E0E2E : - 0X0E0E2F : - 0X0E0E30 : - 0X0E0E31 : - 0X0E0E32 : - 0X0E0E33 : - 0X0E0E34 : - 0X0E0E35 : - 0X0E0E36 : - 0X0E0E37 : - 0X0E0E38 : - 0X0E0E39 : - 0X0E0E3A : - 0X0E0E3B : - 0X0E0E3C : - 0X0E0E3D : - 0X0E0E3E : - 0X0E0E3F : - 0X0E0E40 : - 0X0E0E41 : - 0X0E0E42 : - 0X0E0E43 : - 0X0E0E44 : - 0X0E0E45 : - 0X0E0E46 : - 0X0E0E47 : - 0X0E0E48 : - 0X0E0E49 : - 0X0E0E4A : - 0X0E0E4B : - 0X0E0E4C : - 0X0E0E4D : - 0X0E0E4E : - 0X0E0E4F : - 0X0E0E50 : - 0X0E0E51 : - 0X0E0E52 : - 0X0E0E53 : - 0X0E0E54 : - 0X0E0E55 : - 0X0E0E56 : - 0X0E0E57 : - 0X0E0E58 : - 0X0E0E59 : - 0X0E0E5A : - 0X0E0E5B : - 0X0E0E5C : - 0X0E0E5D : - 0X0E0E5E : - 0X0E0E5F : - 0X0E0E60 : - 0X0E0E61 : - 0X0E0E62 : - 0X0E0E63 : - 0X0E0E64 : - 0X0E0E65 : - 0X0E0E66 : - 0X0E0E67 : - 0X0E0E68 : - 0X0E0E69 : - 0X0E0E6A : - 0X0E0E6B : - 0X0E0E6C : - 0X0E0E6D : - 0X0E0E6E : - 0X0E0E6F : - 0X0E0E70 : - 0X0E0E71 : - 0X0E0E72 : - 0X0E0E73 : - 0X0E0E74 : - 0X0E0E75 : - 0X0E0E76 : - 0X0E0E77 : - 0X0E0E78 : - 0X0E0E79 : - 0X0E0E7A : - 0X0E0E7B : - 0X0E0E7C : - 0X0E0E7D : - 0X0E0E7E : - 0X0E0E7F : - 0X0E0E80 : - 0X0E0E81 : - 0X0E0E82 : - 0X0E0E83 : - 0X0E0E84 : - 0X0E0E85 : - 0X0E0E86 : - 0X0E0E87 : - 0X0E0E88 : - 0X0E0E89 : - 0X0E0E8A : - 0X0E0E8B : - 0X0E0E8C : - 0X0E0E8D : - 0X0E0E8E : - 0X0E0E8F : - 0X0E0E90 : - 0X0E0E91 : - 0X0E0E92 : - 0X0E0E93 : - 0X0E0E94 : - 0X0E0E95 : - 0X0E0E96 : - 0X0E0E97 : - 0X0E0E98 : - 0X0E0E99 : - 0X0E0E9A : - 0X0E0E9B : - 0X0E0E9C : - 0X0E0E9D : - 0X0E0E9E : - 0X0E0E9F : - 0X0E0EA0 : - 0X0E0EA1 : - 0X0E0EA2 : - 0X0E0EA3 : - 0X0E0EA4 : - 0X0E0EA5 : - 0X0E0EA6 : - 0X0E0EA7 : - 0X0E0EA8 : - 0X0E0EA9 : - 0X0E0EAA : - 0X0E0EAB : - 0X0E0EAC : - 0X0E0EAD : - 0X0E0EAE : - 0X0E0EAF : - 0X0E0EB0 : - 0X0E0EB1 : - 0X0E0EB2 : - 0X0E0EB3 : - 0X0E0EB4 : - 0X0E0EB5 : - 0X0E0EB6 : - 0X0E0EB7 : - 0X0E0EB8 : - 0X0E0EB9 : - 0X0E0EBA : - 0X0E0EBB : - 0X0E0EBC : - 0X0E0EBD : - 0X0E0EBE : - 0X0E0EBF : - 0X0E0EC0 : - 0X0E0EC1 : - 0X0E0EC2 : - 0X0E0EC3 : - 0X0E0EC4 : - 0X0E0EC5 : - 0X0E0EC6 : - 0X0E0EC7 : - 0X0E0EC8 : - 0X0E0EC9 : - 0X0E0ECA : - 0X0E0ECB : - 0X0E0ECC : - 0X0E0ECD : - 0X0E0ECE : - 0X0E0ECF : - 0X0E0ED0 : - 0X0E0ED1 : - 0X0E0ED2 : - 0X0E0ED3 : - 0X0E0ED4 : - 0X0E0ED5 : - 0X0E0ED6 : - 0X0E0ED7 : - 0X0E0ED8 : - 0X0E0ED9 : - 0X0E0EDA : - 0X0E0EDB : - 0X0E0EDC : - 0X0E0EDD : - 0X0E0EDE : - 0X0E0EDF : - 0X0E0EE0 : - 0X0E0EE1 : - 0X0E0EE2 : - 0X0E0EE3 : - 0X0E0EE4 : - 0X0E0EE5 : - 0X0E0EE6 : - 0X0E0EE7 : - 0X0E0EE8 : - 0X0E0EE9 : - 0X0E0EEA : - 0X0E0EEB : - 0X0E0EEC : - 0X0E0EED : - 0X0E0EEE : - 0X0E0EEF : - 0X0E0EF0 : - 0X0E0EF1 : - 0X0E0EF2 : - 0X0E0EF3 : - 0X0E0EF4 : - 0X0E0EF5 : - 0X0E0EF6 : - 0X0E0EF7 : - 0X0E0EF8 : - 0X0E0EF9 : - 0X0E0EFA : - 0X0E0EFB : - 0X0E0EFC : - 0X0E0EFD : - 0X0E0EFE : - 0X0E0EFF : - 0X0E0F00 : - 0X0E0F01 : - 0X0E0F02 : - 0X0E0F03 : - 0X0E0F04 : - 0X0E0F05 : - 0X0E0F06 : - 0X0E0F07 : - 0X0E0F08 : - 0X0E0F09 : - 0X0E0F0A : - 0X0E0F0B : - 0X0E0F0C : - 0X0E0F0D : - 0X0E0F0E : - 0X0E0F0F : - 0X0E0F10 : - 0X0E0F11 : - 0X0E0F12 : - 0X0E0F13 : - 0X0E0F14 : - 0X0E0F15 : - 0X0E0F16 : - 0X0E0F17 : - 0X0E0F18 : - 0X0E0F19 : - 0X0E0F1A : - 0X0E0F1B : - 0X0E0F1C : - 0X0E0F1D : - 0X0E0F1E : - 0X0E0F1F : - 0X0E0F20 : - 0X0E0F21 : - 0X0E0F22 : - 0X0E0F23 : - 0X0E0F24 : - 0X0E0F25 : - 0X0E0F26 : - 0X0E0F27 : - 0X0E0F28 : - 0X0E0F29 : - 0X0E0F2A : - 0X0E0F2B : - 0X0E0F2C : - 0X0E0F2D : - 0X0E0F2E : - 0X0E0F2F : - 0X0E0F30 : - 0X0E0F31 : - 0X0E0F32 : - 0X0E0F33 : - 0X0E0F34 : - 0X0E0F35 : - 0X0E0F36 : - 0X0E0F37 : - 0X0E0F38 : - 0X0E0F39 : - 0X0E0F3A : - 0X0E0F3B : - 0X0E0F3C : - 0X0E0F3D : - 0X0E0F3E : - 0X0E0F3F : - 0X0E0F40 : - 0X0E0F41 : - 0X0E0F42 : - 0X0E0F43 : - 0X0E0F44 : - 0X0E0F45 : - 0X0E0F46 : - 0X0E0F47 : - 0X0E0F48 : - 0X0E0F49 : - 0X0E0F4A : - 0X0E0F4B : - 0X0E0F4C : - 0X0E0F4D : - 0X0E0F4E : - 0X0E0F4F : - 0X0E0F50 : - 0X0E0F51 : - 0X0E0F52 : - 0X0E0F53 : - 0X0E0F54 : - 0X0E0F55 : - 0X0E0F56 : - 0X0E0F57 : - 0X0E0F58 : - 0X0E0F59 : - 0X0E0F5A : - 0X0E0F5B : - 0X0E0F5C : - 0X0E0F5D : - 0X0E0F5E : - 0X0E0F5F : - 0X0E0F60 : - 0X0E0F61 : - 0X0E0F62 : - 0X0E0F63 : - 0X0E0F64 : - 0X0E0F65 : - 0X0E0F66 : - 0X0E0F67 : - 0X0E0F68 : - 0X0E0F69 : - 0X0E0F6A : - 0X0E0F6B : - 0X0E0F6C : - 0X0E0F6D : - 0X0E0F6E : - 0X0E0F6F : - 0X0E0F70 : - 0X0E0F71 : - 0X0E0F72 : - 0X0E0F73 : - 0X0E0F74 : - 0X0E0F75 : - 0X0E0F76 : - 0X0E0F77 : - 0X0E0F78 : - 0X0E0F79 : - 0X0E0F7A : - 0X0E0F7B : - 0X0E0F7C : - 0X0E0F7D : - 0X0E0F7E : - 0X0E0F7F : - 0X0E0F80 : - 0X0E0F81 : - 0X0E0F82 : - 0X0E0F83 : - 0X0E0F84 : - 0X0E0F85 : - 0X0E0F86 : - 0X0E0F87 : - 0X0E0F88 : - 0X0E0F89 : - 0X0E0F8A : - 0X0E0F8B : - 0X0E0F8C : - 0X0E0F8D : - 0X0E0F8E : - 0X0E0F8F : - 0X0E0F90 : - 0X0E0F91 : - 0X0E0F92 : - 0X0E0F93 : - 0X0E0F94 : - 0X0E0F95 : - 0X0E0F96 : - 0X0E0F97 : - 0X0E0F98 : - 0X0E0F99 : - 0X0E0F9A : - 0X0E0F9B : - 0X0E0F9C : - 0X0E0F9D : - 0X0E0F9E : - 0X0E0F9F : - 0X0E0FA0 : - 0X0E0FA1 : - 0X0E0FA2 : - 0X0E0FA3 : - 0X0E0FA4 : - 0X0E0FA5 : - 0X0E0FA6 : - 0X0E0FA7 : - 0X0E0FA8 : - 0X0E0FA9 : - 0X0E0FAA : - 0X0E0FAB : - 0X0E0FAC : - 0X0E0FAD : - 0X0E0FAE : - 0X0E0FAF : - 0X0E0FB0 : - 0X0E0FB1 : - 0X0E0FB2 : - 0X0E0FB3 : - 0X0E0FB4 : - 0X0E0FB5 : - 0X0E0FB6 : - 0X0E0FB7 : - 0X0E0FB8 : - 0X0E0FB9 : - 0X0E0FBA : - 0X0E0FBB : - 0X0E0FBC : - 0X0E0FBD : - 0X0E0FBE : - 0X0E0FBF : - 0X0E0FC0 : - 0X0E0FC1 : - 0X0E0FC2 : - 0X0E0FC3 : - 0X0E0FC4 : - 0X0E0FC5 : - 0X0E0FC6 : - 0X0E0FC7 : - 0X0E0FC8 : - 0X0E0FC9 : - 0X0E0FCA : - 0X0E0FCB : - 0X0E0FCC : - 0X0E0FCD : - 0X0E0FCE : - 0X0E0FCF : - 0X0E0FD0 : - 0X0E0FD1 : - 0X0E0FD2 : - 0X0E0FD3 : - 0X0E0FD4 : - 0X0E0FD5 : - 0X0E0FD6 : - 0X0E0FD7 : - 0X0E0FD8 : - 0X0E0FD9 : - 0X0E0FDA : - 0X0E0FDB : - 0X0E0FDC : - 0X0E0FDD : - 0X0E0FDE : - 0X0E0FDF : - 0X0E0FE0 : - 0X0E0FE1 : - 0X0E0FE2 : - 0X0E0FE3 : - 0X0E0FE4 : - 0X0E0FE5 : - 0X0E0FE6 : - 0X0E0FE7 : - 0X0E0FE8 : - 0X0E0FE9 : - 0X0E0FEA : - 0X0E0FEB : - 0X0E0FEC : - 0X0E0FED : - 0X0E0FEE : - 0X0E0FEF : - 0X0E0FF0 : - 0X0E0FF1 : - 0X0E0FF2 : - 0X0E0FF3 : - 0X0E0FF4 : - 0X0E0FF5 : - 0X0E0FF6 : - 0X0E0FF7 : - 0X0E0FF8 : - 0X0E0FF9 : - 0X0E0FFA : - 0X0E0FFB : - 0X0E0FFC : - 0X0E0FFD : - 0X0E0FFE : - 0X0E0FFF : -*/ - -#if (defined(IS_LITTLE_ENDIAN) && ALU_SIZE == 64) -// Precompiled CCMap for Little Endian(64bit) -#define gIgnorableCCMapExt_SIZE 484 -#define gIgnorableCCMapExt_INITIALIZER \ -/* EXTFLG */ 0x0000,0x0000,0x0001,0x0110, \ -/* 000000 */ 0x0030,0x0060,0x00A0,0x00C0,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x00E0, \ -/* 000010 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000020 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000030 */ 0x0040,0x0020,0x0020,0x0050,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000040 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000050 */ 0x0000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000060 */ 0x0020,0x0070,0x0020,0x0020,0x0020,0x0020,0x0020,0x0080, \ - 0x0090,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000070 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x8000,0x0001,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000080 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0030,0x0000,0x0000,0x0000,0x0000, \ -/* 000090 */ 0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000a0 */ 0x00B0,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0000b0 */ 0xF800,0x0000,0x7C00,0x0000,0x0000,0x0000,0xFFFF,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000c0 */ 0x0020,0x00D0,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0000d0 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0010,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000e0 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x00F0,0x0100, \ -/* 0000f0 */ 0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8000, \ -/* 000100 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0001,0x0000,0x0000,0x0000,0x0000,0x01FF, \ -/* 000110 */ 0x0140,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130,0x0000, \ - 0x0130,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130,0x0000, \ -/* 000120 */ 0x0130,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130,0x0000, \ - 0x0130,0x0000,0x0190,0x0000,0x0130,0x0000,0x0130,0x0000, \ -/* 000130 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000140 */ 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0030,0x0010,0x0010, \ -/* 000150 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000160 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000170 */ 0x0020,0x0040,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000180 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07F8, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000190 */ 0x0040,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ -/* 0001a0 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0001b0 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0001c0 */ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, \ - 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, \ -/* 0001d0 */ 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, \ - 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, -#elif defined(IS_LITTLE_ENDIAN) -// Precompiled CCMap for Little Endian(16/32bit) -#define gIgnorableCCMapExt_SIZE 482 -#define gIgnorableCCMapExt_INITIALIZER \ -/* EXTFLG */ 0x0001,0x0110, \ -/* 000000 */ 0x0030,0x0060,0x00A0,0x00C0,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x00E0, \ -/* 000010 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000020 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000030 */ 0x0040,0x0020,0x0020,0x0050,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000040 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000050 */ 0x0000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000060 */ 0x0020,0x0070,0x0020,0x0020,0x0020,0x0020,0x0020,0x0080, \ - 0x0090,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000070 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x8000,0x0001,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000080 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0030,0x0000,0x0000,0x0000,0x0000, \ -/* 000090 */ 0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000a0 */ 0x00B0,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0000b0 */ 0xF800,0x0000,0x7C00,0x0000,0x0000,0x0000,0xFFFF,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000c0 */ 0x0020,0x00D0,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0000d0 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0010,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000e0 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x00F0,0x0100, \ -/* 0000f0 */ 0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8000, \ -/* 000100 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0001,0x0000,0x0000,0x0000,0x0000,0x01FF, \ -/* 000110 */ 0x0140,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130,0x0000, \ - 0x0130,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130,0x0000, \ -/* 000120 */ 0x0130,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130,0x0000, \ - 0x0130,0x0000,0x0190,0x0000,0x0130,0x0000,0x0130,0x0000, \ -/* 000130 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000140 */ 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0030,0x0010,0x0010, \ -/* 000150 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000160 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000170 */ 0x0020,0x0040,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000180 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07F8, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000190 */ 0x0040,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ -/* 0001a0 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0001b0 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0001c0 */ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, \ - 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, \ -/* 0001d0 */ 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, \ - 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, -#elif (ALU_SIZE == 16) -// Precompiled CCMap for Big Endian(16bit) -#define gIgnorableCCMapExt_SIZE 482 -#define gIgnorableCCMapExt_INITIALIZER \ -/* EXTFLG */ 0x0001,0x0110, \ -/* 000000 */ 0x0030,0x0060,0x00A0,0x00C0,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x00E0, \ -/* 000010 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000020 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000030 */ 0x0040,0x0020,0x0020,0x0050,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000040 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000050 */ 0x0000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000060 */ 0x0020,0x0070,0x0020,0x0020,0x0020,0x0020,0x0020,0x0080, \ - 0x0090,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000070 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x8000,0x0001,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000080 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0030,0x0000,0x0000,0x0000,0x0000, \ -/* 000090 */ 0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000a0 */ 0x00B0,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0000b0 */ 0xF800,0x0000,0x7C00,0x0000,0x0000,0x0000,0xFFFF,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000c0 */ 0x0020,0x00D0,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0000d0 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0010,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000e0 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x00F0,0x0100, \ -/* 0000f0 */ 0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8000, \ -/* 000100 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0001,0x0000,0x0000,0x0000,0x0000,0x01FF, \ -/* 000110 */ 0x0000,0x0140,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130, \ - 0x0000,0x0130,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130, \ -/* 000120 */ 0x0000,0x0130,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130, \ - 0x0000,0x0130,0x0000,0x0190,0x0000,0x0130,0x0000,0x0130, \ -/* 000130 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000140 */ 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0030,0x0010,0x0010, \ -/* 000150 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000160 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000170 */ 0x0020,0x0040,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000180 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07F8, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000190 */ 0x0040,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ -/* 0001a0 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0001b0 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0001c0 */ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, \ - 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, \ -/* 0001d0 */ 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, \ - 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, -#elif (ALU_SIZE == 32) -// Precompiled CCMap for Big Endian(32bit) -#define gIgnorableCCMapExt_SIZE 482 -#define gIgnorableCCMapExt_INITIALIZER \ -/* EXTFLG */ 0x0001,0x0110, \ -/* 000000 */ 0x0030,0x0060,0x00A0,0x00C0,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x00E0, \ -/* 000010 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000020 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000030 */ 0x0040,0x0020,0x0020,0x0050,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000040 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x2000,0x0000,0x0000,0x0000,0x0000, \ -/* 000050 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000060 */ 0x0020,0x0070,0x0020,0x0020,0x0020,0x0020,0x0020,0x0080, \ - 0x0090,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000070 */ 0x0000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000,0x0001, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000080 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0030,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000090 */ 0x0000,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000a0 */ 0x00B0,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0000b0 */ 0x0000,0xF800,0x0000,0x7C00,0x0000,0x0000,0x0000,0xFFFF, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000c0 */ 0x0020,0x00D0,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0000d0 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0010, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000e0 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x00F0,0x0100, \ -/* 0000f0 */ 0x0000,0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8000,0x0000, \ -/* 000100 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0001,0x0000,0x0000,0x01FF,0x0000, \ -/* 000110 */ 0x0000,0x0140,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130, \ - 0x0000,0x0130,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130, \ -/* 000120 */ 0x0000,0x0130,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130, \ - 0x0000,0x0130,0x0000,0x0190,0x0000,0x0130,0x0000,0x0130, \ -/* 000130 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000140 */ 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0030,0x0010,0x0010, \ -/* 000150 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000160 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000170 */ 0x0020,0x0040,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000180 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07F8,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000190 */ 0x0040,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ -/* 0001a0 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0001b0 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0001c0 */ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, \ - 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, \ -/* 0001d0 */ 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, \ - 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, -#elif (ALU_SIZE == 64) -// Precompiled CCMap for Big Endian(64bit) -#define gIgnorableCCMapExt_SIZE 484 -#define gIgnorableCCMapExt_INITIALIZER \ -/* EXTFLG */ 0x0000,0x0000,0x0001,0x0110, \ -/* 000000 */ 0x0030,0x0060,0x00A0,0x00C0,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x00E0, \ -/* 000010 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000020 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000030 */ 0x0040,0x0020,0x0020,0x0050,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000040 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000050 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000060 */ 0x0020,0x0070,0x0020,0x0020,0x0020,0x0020,0x0020,0x0080, \ - 0x0090,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000070 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x8000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000080 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0030,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000090 */ 0x0000,0x0000,0x0000,0x3800,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000a0 */ 0x00B0,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0000b0 */ 0x0000,0x7C00,0x0000,0xF800,0x0000,0xFFFF,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000c0 */ 0x0020,0x00D0,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0000d0 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0010,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0000e0 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x00F0,0x0100, \ -/* 0000f0 */ 0x0000,0x0000,0x0000,0xFFFF,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x8000,0x0000,0x0000,0x0000, \ -/* 000100 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0001,0x0000,0x0000,0x01FF,0x0000,0x0000,0x0000, \ -/* 000110 */ 0x0000,0x0140,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130, \ - 0x0000,0x0130,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130, \ -/* 000120 */ 0x0000,0x0130,0x0000,0x0130,0x0000,0x0130,0x0000,0x0130, \ - 0x0000,0x0130,0x0000,0x0190,0x0000,0x0130,0x0000,0x0130, \ -/* 000130 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000140 */ 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0030,0x0010,0x0010, \ -/* 000150 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000160 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000170 */ 0x0020,0x0040,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 000180 */ 0x0000,0x0000,0x0000,0x0000,0x07F8,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 000190 */ 0x0040,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ - 0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, \ -/* 0001a0 */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ - 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020, \ -/* 0001b0 */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ - 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, \ -/* 0001c0 */ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, \ - 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, \ -/* 0001d0 */ 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, \ - 0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030, -#else -#error "We don't support this architecture." -#endif - diff --git a/intl/unicharutil/src/nsSaveAsCharset.cpp b/intl/unicharutil/src/nsSaveAsCharset.cpp index 5423db827a1..d8cdb60c918 100644 --- a/intl/unicharutil/src/nsSaveAsCharset.cpp +++ b/intl/unicharutil/src/nsSaveAsCharset.cpp @@ -45,7 +45,6 @@ #include "nsSaveAsCharset.h" #include "nsCRT.h" #include "nsUnicharUtils.h" -#include "nsCompressedCharMap.h" #include "nsReadableUtils.h" #include "nsWhitespaceTokenizer.h" diff --git a/intl/unicharutil/tools/ccmapbin.pl b/intl/unicharutil/tools/ccmapbin.pl deleted file mode 100755 index a2c9fec75bd..00000000000 --- a/intl/unicharutil/tools/ccmapbin.pl +++ /dev/null @@ -1,606 +0,0 @@ -#!/usr/bin/perl -w -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is Mozilla Communicator. -# -# The Initial Developer of the Original Code is -# Jungshik Shin . -# Portions created by the Initial Developer are Copyright (C) 2002, 2003 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** - -# This script is used to generate precompiled CCMap files. -# See bug 180266 for details. -# -# Revised to support extended CCMaps for non-BMP characters : 2003-09-19 (bug 205387) -# Revised to support the automatic generation of a macro defining the size -# of a CCMap in terms of PRUint16 : 2003-12-11 (bug 224337) - -use strict; - - -use vars qw($fill_fmt $fu_sz); -use vars qw($e_mid_offset $e_pg_offset); - -(@ARGV < 1 ) and usage(); - -my $ifn = $ARGV[0]; - -my ($ifh, $variable, $class); -open $ifh , "< $ifn" or die "Cannot open $ifn"; - -if (@ARGV >= 2) { - $variable = $ARGV[1]; - printf STDERR - "$0:\n\t VARIABLE $variable is specified in the command line.\n" . - "\t The variable name spec. in the input file will be ignored.\n"; -} - -if (@ARGV >= 3) { - $class = $ARGV[2]; - printf STDERR - "$0:\n\t CLASS $class is specified in the command line.\n" . - "\t The class spec. in the input file will be ignored.\n"; -} - -use constant N_PLANES => 17; # BMP + 16 non-BMP planes -use constant PLANE_SZ => 0x10000; -use constant MID_SZ => PLANE_SZ / 16; -use constant PG_SZ => MID_SZ / 16; - -# Unlike FillInfo() method in Mozilla, let's use 16bit integer -# to pack the character coverage/representability. This way, -# we can just copy fillinfo to fill up page maps later. -use constant { - FILL_SZ => PLANE_SZ / 16, - MID_FILL_SZ => MID_SZ / 16, - PG_FILL_SZ => PG_SZ / 16 -}; - - - -# network byte order short. actually, byte order doesn't matter. -$fill_fmt = "n1"; -$fu_sz = length(pack $fill_fmt, 0); # fillinfo unit size in byte (size of short) - -$e_mid_offset = 16; -$e_pg_offset = 32; - -my @ccmap = (); -my %pg_flags = (); -my @fillinfo = (); -my %comments = (); - -my $planes = &read_input(\@fillinfo,$ifh,\%comments); - -if (!defined($variable) && !defined($comments{'VARIABLE'})) -{ - printf STDERR "Variable name is not specified in the cmd line. " . - "Neither is it found in the input file.\n\n" ; - usage(); -} - -$variable = $comments{'VARIABLE'} if (! defined($variable)); - -if (!defined($class) && !defined($comments{'CLASS'})) -{ - printf STDERR "Class name is not specified in the cmd line. " . - "Neither is it found in the input file.\n\n" ; - usage(); -} - -$class = $comments{'CLASS'} if (! defined($class)); - -my $have_non_bmp = 0; - -# add the non_bmp flag and the bmp ccmap size (default to 0) -# at the very beginning if there are non-bmp characters. -if ($planes & 0x1fe) { - push @ccmap, (1, 0); - $have_non_bmp = 1; -} - -my $plane_idx_offset; -foreach my $plane (0 .. ($have_non_bmp ? 16 : 0)) -{ - my @plane_ccmap = add_plane(\@ccmap, \@fillinfo, $plane); - my $size = @plane_ccmap; - push @ccmap, @plane_ccmap; - if ($plane == 0 && $have_non_bmp) { - $ccmap[1] = $size; - # add 2 for non-BMP flag and BMP plane size - # that have negative indices in C++. - $plane_idx_offset = $size + 2; - - # 'Flag' the offset as holding the plane indices (any negative - # number would do) - $pg_flags{$plane_idx_offset} = -1; - $pg_flags{$plane_idx_offset + 16} = -1; - - # plane indices are 16 PRUint32's(not 16 PRUint16's). - # In Perl, we assign each PRUint32 two slots in @ccmap (in BE order) - my $e_plane_offset = $size + 16 * 2; - - # set plane indices to the empty plane by default - foreach my $i (1 .. 16) { - # split PRUint32 into two PRUint16's in BE - push @ccmap, $e_plane_offset >> 16; - push @ccmap, $e_plane_offset & 0xffff; - } - # add 'the' empty plane; - push @ccmap, (0) x 16; - } - if ($plane > 0) { - if ($size > 0) { - # split PRUint32 into two PRUint16's in BE. - # subtract 2 for non-BMP flag and BMP plane size - # that have negative indices in C++. - $ccmap[$plane_idx_offset + ($plane - 1) * 2] = (@ccmap - $size - 2) >> 16; - $ccmap[$plane_idx_offset + ($plane - 1) * 2 + 1] = (@ccmap - $size -2) & 0xffff; - } - } -} - -&print_ccmap(\@ccmap, \%pg_flags, $variable, $class, \%comments, $have_non_bmp); - -exit 0; - -# END of Main - -sub usage -{ - print STDERR <) - { - $lc++; - chomp; - /^\s*VARIABLE::\s*([a-zA-Z][a-zA-Z0-9_]*)$/ and - $comments_p->{'VARIABLE'} = $1, - next; - /^\s*CLASS::/ and - ($comments_p->{'CLASS'} = $_) =~ s/^\s*CLASS::\s*([a-zA-Z0-9_]+).*$/$1/, - next; - /^\s*DESCRIPTION::/ and - ($comments_p->{'DESC'} = $_) =~ s/^\s*DESCRIPTION::\s*//, next; - /^\s*FILE::/ and - ($comments_p->{'FILE'} = $_) =~ s/^\s*FILE::\s*//, next; - - next unless /^\s*0[Xx][0-9A-Fa-f]{4}/; - - /^\s*(.*)\s*$/; - my ($u, $comment) = split /\s+/, $1, 2; - $u =~ s/,//g; - $u =~ tr/A-Z/a-z/; - next if $u =~ /^0x.*[^0-9a-f]+.*/; - - my $usv = oct $u; - if ( 0xd800 <= $usv && $usv <= 0xdfff || # surrogate code points - $usv > 0x10ffff ) { - printf STDERR "Invalid input $u at %4d\n", $lc; - next; - } - $fillinfo_p->[($usv >> 4)] |= (1 << ($usv & 0x0f)); -# printf STDERR "input %s(%04x) \@line %d : put %04x @ %04x\n", -# $u,$usv, $lc, (1 << ($usv & 0x0f)), ($usv >> 4) & 0xfff; - - # turn on plane flags - $planes |= (1 << ($usv >> 16)); - - my $key = sprintf("0X%06X", $usv); - $comments_p->{$key} = ""; - -# Remove '/*' and '*/' (C style comment) or '//' (C++ style comment) -# or ':' and store only the textual content of the comment. - if (defined($comment)) { - ($comments_p->{$key} = $comment) - =~ s ! - (?:/\*|//|:)? # '/*', '//' or ':' or NULL. Do not store. - \s* # zero or more of white space(s) - ([^*]+) # one or more of non-white space(s).Store it - # in $1 for the reference in replace part. - \s* # zero or more of white space(s) - (?:\*/)? # '*/' or NONE. Do not store - !$1!sx # replace the whole match with $1 stored above. - } - } - - return $planes; -} - -sub add_full_mid -{ - my($ccmap_p, $f_pg_offset) = @_; - # add a full page if not yet added. - if (! $f_pg_offset) { - $f_pg_offset = @$ccmap_p; - push @$ccmap_p, (0xffff) x 16; - } -# add the full mid-pointer array with all the pointers pointing to the full page. - my $f_mid_offset = @$ccmap_p; - push @$ccmap_p, ($f_pg_offset) x 16; - return ($f_mid_offset, $f_pg_offset); -} - -sub add_new_mid -{ - my($ccmap_p, $mid) = @_; - my $mid_offset = @$ccmap_p; - $ccmap_p->[$mid] = $mid_offset; - #by default, all mid-pointers point to the empty page. - push @$ccmap_p, ($e_pg_offset) x 16; - return $mid_offset; -} - -sub add_plane -{ - my ($full_ccmap_p, $fillinfo_p, $plane) = @_; -# my @ccmap = @$ccmap_p; - my @ccmap = (); # plane ccmap - my(@fillinfo) = splice @$fillinfo_p, 0, FILL_SZ; - # convert 4096(FILL_SZ) 16bit integers to a string of 4096 * $fu_sz - # characters. - my($plane_str) = pack $fill_fmt x FILL_SZ, @fillinfo; - - # empty plane - if ($plane_str eq "\0" x ($fu_sz * FILL_SZ)) { - # for non-BMP plane, the default empty plane ccmap would work. - # for BMP, we need 'self-referring' folded CCMap (the smallest CCMap) - push @ccmap, (0) x 16 if (!$plane); - return @ccmap; - } - - #get all upper pointers to point at empty mid pointers - push @ccmap, ($e_mid_offset) x 16; - #get all mid-pointers to point at empty page. - push @ccmap, ($e_pg_offset) x 16; - push @ccmap, (0) x 16; # empty pg - - my $f_mid_offset = 0; - my $f_pg_offset; - - foreach my $mid (0 .. 15) - { - my(@mid_fill) = splice @fillinfo, 0, MID_FILL_SZ; - # convert 256(MID_FILL_SZ) 16bit integers to a string of 256 * $fu_sz - # characters. - my($mid_str) = pack $fill_fmt x MID_FILL_SZ, @mid_fill; - - # for an empty mid, upper-pointer is already pointing to the empty mid. - next if ($mid_str eq "\0" x ($fu_sz * MID_FILL_SZ)); - - # for a full mid, add full mid if necessary. - if ($mid_str eq "\xff" x ($fu_sz * MID_FILL_SZ)) { - ($f_mid_offset, $f_pg_offset) = - add_full_mid(\@ccmap, $f_pg_offset) unless ($f_mid_offset); - $ccmap[$mid] = $f_mid_offset; - next; - } - - my $mid_offset = add_new_mid(\@ccmap,$mid); - - foreach my $pg (0 .. 15) { - my(@pg_fill) = splice @mid_fill, 0, PG_FILL_SZ; - my($pg_str) = pack $fill_fmt x PG_FILL_SZ, @pg_fill; - - # for an empty pg, mid-pointer is already pointing to the empty page. - next if ($pg_str eq "\x0" x ($fu_sz * PG_FILL_SZ)); - - # for a full pg, add the full pg if necessary. - # and set the mid-pointer to the full pg offset. - if ($pg_str eq "\xff" x ($fu_sz * PG_FILL_SZ)) { - if (! $f_pg_offset) { - $f_pg_offset = @ccmap; - #for the full pg, endianess and ALU size are immaterial. - push @ccmap, (0xffff) x 16; - } - $ccmap[$mid_offset + $pg] = $f_pg_offset; - next; - } - - $ccmap[$mid_offset + $pg] = @ccmap; - - # 'Flag' the offset as the beginning of a page with actual data as - # opposed to pointer sections. - $pg_flags{(scalar @$full_ccmap_p) + (scalar @ccmap)} = @ccmap; - - push @ccmap, @pg_fill; - } - } - return @ccmap; -} - -sub print_ccmap -{ - my($ccmap_p,$pg_flags_p, $variable, $class, $comments_p, $is_ext) = @_; - - - my $ofn = $class . ($is_ext ? ".x-ccmap" : ".ccmap"); - - open OUT, "> $ofn" or - die "cannot open $ofn for output\n"; - - print OUT print_preamble($variable, $class); - - print OUT "\n/*\n"; -# defined ($comments_p->{'CLASS'}) and -# print OUT " CLASS:: $comments_p->{'CLASS'}\n"; - print OUT " VARIABLE:: $variable\n"; - print OUT " CLASS:: $class\n"; - defined ($comments_p->{'DESC'}) and - print OUT " DESCRIPTION:: $comments_p->{'DESC'}\n"; - defined ($comments_p->{'FILE'}) and - print OUT " FILE:: $comments_p->{'FILE'}\n"; - - print OUT "\n"; - - for my $key (sort keys %$comments_p) { - next if ($key !~ /^0X/); - printf OUT " %s : %s\n", $key, $comments_p->{$key}; - } - - printf OUT "*/\n\n"; - - - my(@idxlist, @int16toint32); - -# When CCMap is accessed, (PRUint16 *) is cast to -# the pointer type of the ALU of a machine. -# For little endian machines, the size of the ALU -# doesn't matter (16, 32, 64). For Big endian -# machines with 32/64 bit ALU, two/four 16bit words -# have to be rearranged to be interpreted correctly -# as 32bit or 64bit integers with the 16bit word -# at the lowest address taking the highest place value. -# This shuffling is NOT necessary for the upper pointer section -# and mid-pointer sections. - -# If non-BMP characters are present, 16 plane indices -# (32bit integers stored in two 16bit shorts in -# BE order) have to be treated differently based on the -# the endianness as well. - -# For BMP-only CCMap, 16BE CCMap is identical to LE CCMaps. -# With non-BMP characters present, to avoid the misalignment on 64bit -# machines, we add two 16-bit units of 0-padding before the ccmap flag -# (indicating whether the map is extended or not) and the BMP map size -# (bug 225340, bug 445626). - my @fmts = $is_ext ? ("64LE", "LE", "16BE", "32BE", "64BE") : ("LE", "32BE", "64BE") ; - foreach my $fmt (@fmts) - { - - my($offset) = 0; - for ($fmt) { - /64LE/ and do { - @idxlist = (0, 1, 2, 3); - @int16toint32 = (1, 0, 3, 2); - print OUT "#if (defined(IS_LITTLE_ENDIAN) && ALU_SIZE == 64)\n" . - "// Precompiled CCMap for Little Endian(64bit)\n"; - printf OUT "#define ${variable}_SIZE %d\n", scalar @$ccmap_p + 2; - printf OUT "#define ${variable}_INITIALIZER \\\n"; - printf OUT "/* EXTFLG */ 0x0000,0x0000,0x%04X,0x%04X, \\\n", - $ccmap_p->[0], $ccmap_p->[1]; - last; - }; - /LE/ and do { - @idxlist = (0, 1, 2, 3); - @int16toint32 = (1, 0, 3, 2); - print OUT $is_ext ? - "#elif defined(IS_LITTLE_ENDIAN)\n" . - "// Precompiled CCMap for Little Endian(16/32bit) \n" : - "#if (defined(IS_LITTLE_ENDIAN) || ALU_SIZE == 16)\n" . - "// Precompiled CCMap for Little Endian(16/32/64bit)\n" . - "// and Big Endian(16bit)\n"; - printf OUT "#define ${variable}_SIZE %d\n", scalar @$ccmap_p; - printf OUT "#define ${variable}_INITIALIZER \\\n"; - if ($is_ext) { - printf OUT "/* EXTFLG */ 0x%04X,0x%04X, \\\n", - $ccmap_p->[0], $ccmap_p->[1]; - } - last; - }; - /16BE/ and do { - @idxlist = (0, 1, 2, 3); - @int16toint32 = (0, 1, 2, 3); - print OUT "#elif (ALU_SIZE == 16)\n" . - "// Precompiled CCMap for Big Endian(16bit)\n"; - printf OUT "#define ${variable}_SIZE %d\n", scalar @$ccmap_p; - printf OUT "#define ${variable}_INITIALIZER \\\n"; - printf OUT "/* EXTFLG */ 0x%04X,0x%04X, \\\n", - $ccmap_p->[0], $ccmap_p->[1]; - last; - }; - /32BE/ and do { - @idxlist = (1, 0, 3, 2); - @int16toint32 = (0, 1, 2, 3); - print OUT "#elif (ALU_SIZE == 32)\n" . - "// Precompiled CCMap for Big Endian(32bit)\n"; - printf OUT "#define ${variable}_SIZE %d\n", scalar @$ccmap_p; - printf OUT "#define ${variable}_INITIALIZER \\\n"; - if ($is_ext) { - printf OUT "/* EXTFLG */ 0x%04X,0x%04X, \\\n", - $ccmap_p->[0], $ccmap_p->[1]; - } - last; - }; - /64BE/ and do { - @idxlist = (3, 2, 1, 0); - @int16toint32 = (0, 1, 2, 3); - print OUT "#elif (ALU_SIZE == 64)\n" . - "// Precompiled CCMap for Big Endian(64bit)\n"; - printf OUT "#define ${variable}_SIZE %d\n", scalar @$ccmap_p + - ($is_ext ? 2 : 0); - printf OUT "#define ${variable}_INITIALIZER \\\n"; - if ($is_ext) { - printf OUT "/* EXTFLG */ 0x0000,0x0000,0x%04X,0x%04X, \\\n", - $ccmap_p->[0], $ccmap_p->[1]; - } - last; - }; - } - - $offset = $is_ext ? 2 : 0; - - while ($offset < @$ccmap_p) { - printf OUT "/* %06x */ ", $offset - ($is_ext ? 2 : 0); - for my $i (0 .. 3) { - for my $j (defined($pg_flags_p->{$offset}) ? - ($pg_flags_p->{$offset} > 0 ? - @idxlist : @int16toint32) : (0,1,2,3)) { - printf OUT "0x%04X,", $ccmap_p->[$offset + $i * 4 + $j]; - } - print OUT " \\\n " if $i==1; - } - if ($offset + 16 < @$ccmap_p) {print OUT " \\\n"; } - $offset += 16; - } - print OUT "\n"; - } - - print OUT < - * Portions created by the Initial Developer are Copyright (C) 2003 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - - /*======================================================== - This file contains a precompiled CCMap for a class of Unicode - characters ($class) to be identified quickly by Mozilla. - It was generated by ccmapbin.pl which you can find under - mozilla/intl/unicharutil/tools. - - Enumerated below are characters included in the precompiled CCMap - which is human-readable but not so human-friendly. If you - needs to modify the list of characters belonging to "$class", - you have to make a new file (with the name of your choice) - listing characters (one character per line) you want to put - into "$class" in the format - - 0xuuuu // comment - - In addition, the input file can have the following optional lines that - read - - VARIABLE::$variable - CLASS::$class - DESCRIPTION:: description of a character class - FILE:: mozilla source file to include the output file - - - Then, run the following in the current directory. - - perl ccmapbin.pl input_file [$variable [$class]] - - which will generate $class.ccmap (or $class.x-ccmap if the ccmap - includes non-BMP characters.). $variable is used as the prefix - in macros for the array initializer and the array size. - - (see bug 180266, bug 167136, and bug 224337) - - */ - -PREAMBLE - -} - diff --git a/intl/unicharutil/tools/genignorable.pl b/intl/unicharutil/tools/genignorable.pl deleted file mode 100644 index 1e925c8fbb8..00000000000 --- a/intl/unicharutil/tools/genignorable.pl +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/perl - -open $f, 'UnicodeData-Latest.txt' or die $!; -while (<$f>) { - @columns = split(/;/); -# print "$columns[0] : $columns[1]\n"; - $names{hex($columns[0])} = $columns[1]; -} -close $f; - -open $f, 'DerivedCoreProperties.txt' or die $!; -$re = '['; -while (<$f>) { - next unless /Default_Ignorable_Code_Point/; - next unless /^([0-9A-F]{4,6})(?:\.\.([0-9A-F]{4,6}))?/; - - ($start, $end) = (hex($1), hex($2)); - $end = $start unless $end; - - for ($c = $start; $c <= $end; $c++) { - printf "0x%04X", $c; - printf " // $names{$c}" if $names{$c}; - print "\n"; - } - - if (!$prevend || $start > $prevend + 1) { - $re .= make_unicode_range($prevstart, $prevend) if $prevstart; - $prevstart = $start; - } - $prevend = $end; -} -$re .= make_unicode_range($prevstart, $prevend).']'; -print STDERR $re; -close $f; - -sub make_unicode_range -{ - my ($start, $end) = @_; - - if ($start > 0xffff) { - my $starths = ($start - 0x10000) >> 10 | 0xd800; - my $startls = ($start - 0x10000) & 0x3ff | 0xdc00; - my $endhs = ($end - 0x10000) >> 10 | 0xd800; - my $endls = ($end - 0x10000) & 0x3ff | 0xdc00; - if ($starths == $endhs) { - return sprintf("]|\\u%04x[\\u%04x-\\u%04x", $starths, $startls, $endls) - } - my $re = ''; - if ($startls > 0xdc00) { - $re .= sprintf("]|\\u%04x[\\u%04x-\\udfff", $starths, $startls); - $starths++; - } - if ($endhs > $starths) { - $endhs-- if ($endls < 0xdfff); - $re .= sprintf("]|[\\u%04x-\\u%04x][\\udc00-\\udfff", $starths, $endhs); - } - if ($endls < 0xdfff) { - $re .= sprintf("]|\\u%04x[\\udc00-\\u%04x", $endhs, $endls); - } - return $re; - } elsif ($start == $end) { - return sprintf("\\u%04x", $start); - } else { - return sprintf("\\u%04x-\\u%04x", $start, $end); - } -} diff --git a/intl/unicharutil/util/Makefile.in b/intl/unicharutil/util/Makefile.in index b931420f8de..6bd276a94aa 100644 --- a/intl/unicharutil/util/Makefile.in +++ b/intl/unicharutil/util/Makefile.in @@ -61,7 +61,6 @@ SDK_HEADERS = \ $(NULL) EXPORTS = \ - nsCompressedCharMap.h \ nsBidiUtils.h \ nsUnicodeProperties.h \ nsUnicodeScriptCodes.h \ diff --git a/intl/unicharutil/util/nsCompressedCharMap.h b/intl/unicharutil/util/nsCompressedCharMap.h deleted file mode 100644 index b5718f507dd..00000000000 --- a/intl/unicharutil/util/nsCompressedCharMap.h +++ /dev/null @@ -1,328 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Brian Stell - * - * Alternatively, the contents of this file may be used under the terms of - * either of the GNU General Public License Version 2 or later (the "GPL"), - * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef NSCOMPRESSEDCHARMAP_H -#define NSCOMPRESSEDCHARMAP_H -#include "prtypes.h" - -#define ALU_SIZE PR_BITS_PER_LONG -//#define ALU_SIZE 16 -//#define ALU_SIZE 32 -//#define ALU_SIZE 64 -#if (ALU_SIZE==32) -# define ALU_TYPE PRUint32 -# define CCMAP_POW2(n) (1L<<(n)) -# define CCMAP_BITS_PER_ALU_LOG2 5 -#elif (ALU_SIZE==64) -# define ALU_TYPE PRUint64 -# define CCMAP_POW2(n) (1L<<(n)) -# define CCMAP_BITS_PER_ALU_LOG2 6 -#else -# define ALU_TYPE PRUint16 -# define CCMAP_POW2(n) (1<<(n)) -# define CCMAP_BITS_PER_ALU_LOG2 4 -#endif - -// Note: nsCompressedCharMap.cpp along with class -// nsCompressedCharMap was removed in bug 559489. - -// -// nsCompressedCharMap -// -// A Compressed Char Map (CCMap) saves memory by folding all -// the empty portions of the map on top of each other. -// -// Building a Compressed Char Map (CCMap) is more complex than -// accessing it. We use the nsCompressedCharMap object to -// build the CCMap. Once nsCompressedCharMap has built the CCMap -// we get a copy of the CCMap and discard the nsCompressedCharMap -// object. The CCMap is an array of PRUint16 and is accessed by -// a macro. -// -// See "Character Map Compression" below for a discussion of -// what the array looks like. - -// -// The maximum size a CCMap: -// (16 upper pointers) + (16 empty mid pointers) + -// (16 empty page) + (16*16 max mid pointers) + -// (256*16 max pages) = 4400 PRUint16 -#define CCMAP_MAX_LEN (16+16+16+256+4096) - -// non-bmp unicode support extension -#define EXTENDED_UNICODE_PLANES 16 - -// -// Character Map Compression -// -// Each font requires its own 8k charmap. On a system with 200 -// fonts this would take: 200 * 8K = 1600K memory. -// -// Since most char maps are mostly empty a significant amount -// of memory can be saved by not allocating the unused sections. -// -// If the map has one or more levels of indirection then the -// the empty sections of the map can all be folded to a single -// common empty element. In this way only the non-empty sections -// need space. Because the empty sections actually point to a -// common empty section every entry in the map can be valid -// without requiring actually allocating space. -// Some larger CJK fonts have large sections where every bit -// is set. In the same way that the empty sections are folded -// onto one "empty page", the sections where all bits are set are -// folded on to one "all bits set page" . -// -// Break up the Unicode range bits 0x0000 - 0xFFFF -// into 3 bit ranges: -// -// upper bits: bit15 - bit12 -// mid bits: bit11 - bit8 -// page bits: bit7 - bit0 -// -// within a page, (assumming a 4 byte ALU) -// bits 7-5 select one of the 8 longs -// bits 4-0 select one of the 32 bits within the long -// -// There is exactly one upper "pointers" array. -// -// The upper pointers each point to a mid array. If there are no chars -// in an upper pointer's block that pointer points to the empty mid. -// Thus all upper pointers are "valid" even if they do not have space -// allocated; eg: the accessor macro does not need to test if the -// pointer is zero. -// -// Each mid pointer in the mid array points to a page. If there are no -// chars in a mid pointer's page that pointer points to the empty page. -// Thus all mid pointers are "valid" even if they do not have space -// allocated; eg: the accessor macro does not need to test if the -// pointer is zero. -// -// Since the array will be less than 5K PRUint16 the "pointers" can -// be implemented as 2 byte offsets from the base instead of -// real pointers. -// -// the format of the CCMap is -// the upper pointers (16 PRUint16) -// the empty mid pointers (16 PRUint16) -// the empty page (16 PRUint16) -// non-empty mid pointers and pages as needed - -// One minor note: for a completely empty map it is actually -// possible to fold the upper, empty mid, and empty page -// on top of each other and make a map of only 32 bytes. -#define CCMAP_EMPTY_SIZE_PER_INT16 16 - -// offsets to the empty mid and empty page -#define CCMAP_EMPTY_MID CCMAP_NUM_UPPER_POINTERS -#define CCMAP_EMPTY_PAGE CCMAP_EMPTY_MID+CCMAP_NUM_MID_POINTERS - -// -// Because the table is offset based the code can build the table in a -// temp space (max table size on the stack) and then do one alloc of -// the actual needed size and simply copy over the data. -// - -// -// Compressed Char map surrogate extension -// -// The design goal of surrogate support extension is to keep efficiency -// and compatibility of existing compressed charmap operations. Most of -// existing operation are untouched. For BMP support, very little memory -// overhead (4 bytes) is added. Runtime efficiency of BMP support is -// unchanged. -// -// structure of extended charmap: -// ccmap flag 1 PRUint16 (PRUint32) , indicates if this is extended or not -// bmp ccmap size 1 PRUint16 (PRUint32) , the size of BMP ccmap, -// BMP ccmap size varies, -// plane index 16 PRUint32, use to index ccmap for non-BMP plane -// empty ccmap 16 PRUint16, a total empty ccmap -// non-BMP ccmaps size varies, other non-empty, non-BMP ccmap -// -// Changes to basic ccmap -// 2 PRUint16 (PRUint32 on 64bit machines) are added in the very beginning. -// One is used to specify the size -// of the ccmap, the other is used as a flag. But these 2 fields are indexed -// negatively so that all other operation remain unchanged to keep efficiency. -// ccmap memory allocation is moved from nsCompressedCharMap::NewCCMap to -// MapToCCMap. -// -// Extended ccmap -// A 16*PRUint32 array was put at the end of basic ccmap, each PRUint32 either -// pointed to the empty ccmap or a independent plane ccmap. Directly after this -// array is a empty ccmap. All planes that has no character will share this ccmap. -// All non-empty plane will have a ccmap. -// "MapToCCMapExt" is added to created an extended ccmap, each plane ccmap is -// created the same as basic one, but without 2 additional fields. -// "HasGlyphExt" is used to access extended ccmap, it first need to locate the -// plane ccmap, and then operated the same way as "HasGlyph". -// -// Compatibility between old and new one -// Because extended ccmap include an exactly identical basic ccmap in its head, -// basic ccmap operation (HasGlyph) can be applied on extended ccmap without -// problem. -// Because basic ccmap is now have a flag to indicate if it is a extended one, -// Extended ccmap operation (HasGlyphExt) can check the flag before it does -// extended ccmap specific operation. So HasGlyphExt can be applied to basic ccmap -// too. -// - -// Page bits -// -#define CCMAP_BITS_PER_PAGE_LOG2 8 -#define CCMAP_BITS_PER_PAGE CCMAP_POW2(CCMAP_BITS_PER_PAGE_LOG2) -#define CCMAP_BIT_INDEX(c) ((c) & PR_BITMASK(CCMAP_BITS_PER_ALU_LOG2)) -#define CCMAP_ALU_INDEX(c) (((c)>>CCMAP_BITS_PER_ALU_LOG2) \ - & PR_BITMASK(CCMAP_BITS_PER_PAGE_LOG2 - CCMAP_BITS_PER_ALU_LOG2)) - -#define CCMAP_PAGE_MASK PR_BITMASK(CCMAP_BITS_PER_PAGE_LOG2) -#define CCMAP_NUM_PRUINT16S_PER_PAGE \ - (CCMAP_BITS_PER_PAGE/CCMAP_BITS_PER_PRUINT16) -// one bit per char -#define CCMAP_NUM_ALUS_PER_PAGE (CCMAP_BITS_PER_PAGE/CCMAP_BITS_PER_ALU) -#define CCMAP_NUM_UCHARS_PER_PAGE CCMAP_BITS_PER_PAGE - -// -// Mid bits -// -#define CCMAP_BITS_PER_MID_LOG2 4 -#define CCMAP_MID_INDEX(c) \ - (((c)>>CCMAP_BITS_PER_PAGE_LOG2) & PR_BITMASK(CCMAP_BITS_PER_MID_LOG2)) -#define CCMAP_NUM_MID_POINTERS CCMAP_POW2(CCMAP_BITS_PER_MID_LOG2) -#define CCMAP_NUM_UCHARS_PER_MID \ - CCMAP_POW2(CCMAP_BITS_PER_MID_LOG2+CCMAP_BITS_PER_PAGE_LOG2) - -// -// Upper bits -// -#define CCMAP_BITS_PER_UPPER_LOG2 4 -#define CCMAP_UPPER_INDEX(c) \ - (((c)>>(CCMAP_BITS_PER_MID_LOG2+CCMAP_BITS_PER_PAGE_LOG2)) \ - & PR_BITMASK(CCMAP_BITS_PER_UPPER_LOG2)) -#define CCMAP_NUM_UPPER_POINTERS CCMAP_POW2(CCMAP_BITS_PER_UPPER_LOG2) - -// -// Misc -// -#define CCMAP_BITS_PER_PRUINT16_LOG2 4 -#define CCMAP_BITS_PER_PRUINT32_LOG2 5 - -#define CCMAP_BITS_PER_PRUINT16 CCMAP_POW2(CCMAP_BITS_PER_PRUINT16_LOG2) -#define CCMAP_BITS_PER_PRUINT32 CCMAP_POW2(CCMAP_BITS_PER_PRUINT32_LOG2) -#define CCMAP_BITS_PER_ALU CCMAP_POW2(CCMAP_BITS_PER_ALU_LOG2) - -#define CCMAP_ALUS_PER_PRUINT32 (CCMAP_BITS_PER_PRUINT32/CCMAP_BITS_PER_ALU) -#define CCMAP_PRUINT32S_PER_ALU (CCMAP_BITS_PER_ALU/CCMAP_BITS_PER_PRUINT32) -#define CCMAP_PRUINT32S_PER_PAGE (CCMAP_BITS_PER_PAGE/CCMAP_BITS_PER_PRUINT32) - -#define CCMAP_ALU_MASK PR_BITMASK(CCMAP_BITS_PER_ALU_LOG2) -#define CCMAP_ALUS_PER_PAGE CCMAP_POW2(CCMAP_BITS_PER_PAGE_LOG2 \ - - CCMAP_BITS_PER_ALU_LOG2) -#define NUM_UNICODE_CHARS CCMAP_POW2(CCMAP_BITS_PER_UPPER_LOG2 \ - +CCMAP_BITS_PER_MID_LOG2 \ - +CCMAP_BITS_PER_PAGE_LOG2) -#define CCMAP_TOTAL_PAGES CCMAP_POW2(CCMAP_BITS_PER_UPPER_LOG2 \ - +CCMAP_BITS_PER_MID_LOG2) - -#define CCMAP_BEGIN_AT_START_OF_MAP 0xFFFFFFFF - -// -// Finally, build up the macro to test the bit for a given char -// - -// offset from base to mid array -#define CCMAP_TO_MID(m,c) ((m)[CCMAP_UPPER_INDEX(c)]) - -// offset from base to page -#define CCMAP_TO_PAGE(m,c) ((m)[CCMAP_TO_MID((m),(c)) + CCMAP_MID_INDEX(c)]) - -// offset from base to alu -#define CCMAP_TO_ALU(m,c) \ - (*((ALU_TYPE*)(&((m)[CCMAP_TO_PAGE((m),(c))])) + CCMAP_ALU_INDEX(c))) - -// test the bit -#define CCMAP_HAS_CHAR(m,c) (((CCMAP_TO_ALU(m,c))>>CCMAP_BIT_INDEX(c)) & 1) - -// unset the bit -#define CCMAP_UNSET_CHAR(m,c) (CCMAP_TO_ALU(m,c) &= ~(CCMAP_POW2(CCMAP_BIT_INDEX(c)))) - -#define CCMAP_SIZE(m) (*((m)-1)) -#define CCMAP_FLAG(m) (*((m)-2)) -#define CCMAP_EXTRA (sizeof(ALU_TYPE)/sizeof(PRUint16)>2? sizeof(ALU_TYPE)/sizeof(PRUint16): 2) -#define CCMAP_SURROGATE_FLAG 0x0001 -#define CCMAP_NONE_FLAG 0x0000 - -// get plane number from ccmap, bmp excluded, so plane 1's number is 0. -#define CCMAP_PLANE_FROM_SURROGATE(h) ((((PRUint16)(h) - (PRUint16)0xd800) >> 6) + 1) - -// same as above, but get plane number from a ucs4 char -#define CCMAP_PLANE(u) ((((PRUint32)(u))>>16)) - -// scalar value inside the plane -#define CCMAP_INPLANE_OFFSET(h, l) (((((PRUint16)(h) - (PRUint16)0xd800) & 0x3f) << 10) + ((PRUint16)(l) - (PRUint16)0xdc00)) - -// get ccmap for that plane -#define CCMAP_FOR_PLANE_EXT(m, i) ((m) + ((PRUint32*)((m) + CCMAP_SIZE(m)))[(i)-1]) - -// test the bit for surrogate pair -#define CCMAP_HAS_CHAR_EXT2(m, h, l) (CCMAP_FLAG(m) & CCMAP_SURROGATE_FLAG && \ - CCMAP_HAS_CHAR(CCMAP_FOR_PLANE_EXT((m), CCMAP_PLANE_FROM_SURROGATE(h)), CCMAP_INPLANE_OFFSET(h, l))) -// test the bit for a character in UCS4 -#define CCMAP_HAS_CHAR_EXT(m, ucs4) (((ucs4)&0xffff0000) ? \ - (CCMAP_FLAG(m) & CCMAP_SURROGATE_FLAG) && CCMAP_HAS_CHAR(CCMAP_FOR_PLANE_EXT((m), CCMAP_PLANE(ucs4)), (ucs4) & 0xffff) : \ - CCMAP_HAS_CHAR(m, (PRUnichar)(ucs4)) ) - -// macros to ensure that the array defining a pre-compiled CCMap starts -// at an ALU_TYPE boundary instead of just a PRUint16 boundary. -// When invoking the macro, 'typequal' should be either 'const' -// or empty (NULL). see bug 224337. - -#define DEFINE_ANY_CCMAP(var, extra, typequal) \ -static typequal union { \ - PRUint16 array[var ## _SIZE]; \ - ALU_TYPE align; \ -} var ## Union = \ -{ \ - { var ## _INITIALIZER } \ -}; \ -static typequal PRUint16* var = var ## Union.array + extra - -#define DEFINE_CCMAP(var, typequal) DEFINE_ANY_CCMAP(var, 0, typequal) -#define DEFINE_X_CCMAP(var, typequal) DEFINE_ANY_CCMAP(var, CCMAP_EXTRA, typequal) - -#endif // NSCOMPRESSEDCHARMAP_H From 8864a16d06d11865136c7e0aa2e4720024480afd Mon Sep 17 00:00:00 2001 From: Simon Montagu Date: Sun, 22 Apr 2012 13:47:06 +0300 Subject: [PATCH 017/182] bug 738101 - test for bidi mirroring. r=jfkthame --- layout/reftests/bidi/bidiMirroring-ref.svg | 14 ++++++++++++++ layout/reftests/bidi/bidiMirroring.svg | 14 ++++++++++++++ layout/reftests/bidi/reftest.list | 1 + 3 files changed, 29 insertions(+) create mode 100644 layout/reftests/bidi/bidiMirroring-ref.svg create mode 100644 layout/reftests/bidi/bidiMirroring.svg diff --git a/layout/reftests/bidi/bidiMirroring-ref.svg b/layout/reftests/bidi/bidiMirroring-ref.svg new file mode 100644 index 00000000000..f6f9b7fe58c --- /dev/null +++ b/layout/reftests/bidi/bidiMirroring-ref.svg @@ -0,0 +1,14 @@ + + ᚛᚜༼༽༺༻«»{}[]<>() + ₍₎⁽⁾⁅⁆‹› + ≾≿≼≽≺≻≸≹≶≷≴≵≲≳≰≱≮≯≪≫≨≩≦≧≤≥≔≕≒≓⋍∼∽⧵∊∉∈∍∌∋ + ⋷⋶⋴⋳⋲⋾⋽⋼⋻⋺⋰⋱⋬⋭⋪⋫⋨⋩⋦⋧⋤⋥⋢⋣⋠⋡⋞⋟⋜⋝⋚⋛⋘⋙⋖⋗⋐⋑≃⋋⋌⋉⋊⊶⊷⊴⊵⊲⊳⊰⊱⫥⫣⫤⫞⊢⊣⦸⊑⊒⊏⊐⊊⊋⊈⊉⊆⊇⊄⊅⊂⊃⊀⊁ + 〈〉⌊⌋⌈⌉ + ⟮⟯⟬⟭⟪⟫⟨⟩⟦⟧⟤⟥⟢⟣⟝⟞⟕⟖⟋⟍⟈⟉⟅⟆⟃⟄❴❵❲❳❰❱❮❯❬❭❪❫❨❩ + ⧼⧽⧸⧹∕⧚⧛⧘⧙⧔⧕⧑⧒⧏⧐⧄⧅⧀⧁⊘⦗⦘⦕⦖⦓⦔⦑⦒⦍⦎⦏⦐⦋⦌⦉⦊⦇⦈⦅⦆⦃⦄ + ⫹⫺⫷⫸⫬⫭⊫⊨⊩⊦⫕⫖⫓⫔⫑⫒⫏⫐⫍⫎⫅⫆⫃⫄⫁⫂⪿⫀⪽⪾⪻⪼⪳⪴⪯⪰⪬⪭⪪⪫⪨⪩⪦⪧⪡⪢⪛⪜⪙⪚⪗⪘⪕⪖⪓⪔⪑⪒⪋⪌⪃⪄⪁⪂⩿⪀⩽⩾⩹⩺⩤⩥⨼⨽⨴⨵⨭⨮⨫⨬ + ⸨⸩⸦⸧⸤⸥⸢⸣⸠⸡⸜⸝⸌⸍⸉⸊⸄⸅⸂⸃ + 〚〛〘〙〖〗〔〕【】『』「」《》〈〉 + ﹤﹥﹝﹞﹛﹜﹙﹚ + 「」⦅⦆{}[]<>() + diff --git a/layout/reftests/bidi/bidiMirroring.svg b/layout/reftests/bidi/bidiMirroring.svg new file mode 100644 index 00000000000..e9699d5ca08 --- /dev/null +++ b/layout/reftests/bidi/bidiMirroring.svg @@ -0,0 +1,14 @@ + + ()<>[]{}«»༺༻༼༽᚛᚜ + ‹›⁅⁆⁽⁾₍₎ + ∈∉∊∋∌∍∕∼∽≃≒≓≔≕≤≥≦≧≨≩≪≫≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿ + ⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊏⊐⊑⊒⊘⊢⊣⊦⊨⊩⊫⊰⊱⊲⊳⊴⊵⊶⊷⋉⋊⋋⋌⋍⋐⋑⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋰⋱⋲⋳⋴⋶⋷⋺⋻⋼⋽⋾ + ⌈⌉⌊⌋〈〉 + ❨❩❪❫❬❭❮❯❰❱❲❳❴❵⟃⟄⟅⟆⟈⟉⟋⟍⟕⟖⟝⟞⟢⟣⟤⟥⟦⟧⟨⟩⟪⟫⟬⟭⟮⟯ + ⦃⦄⦅⦆⦇⦈⦉⦊⦋⦌⦍⦎⦏⦐⦑⦒⦓⦔⦕⦖⦗⦘⦸⧀⧁⧄⧅⧏⧐⧑⧒⧔⧕⧘⧙⧚⧛⧵⧸⧹⧼⧽ + ⨫⨬⨭⨮⨴⨵⨼⨽⩤⩥⩹⩺⩽⩾⩿⪀⪁⪂⪃⪄⪋⪌⪑⪒⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪡⪢⪦⪧⪨⪩⪪⪫⪬⪭⪯⪰⪳⪴⪻⪼⪽⪾⪿⫀⫁⫂⫃⫄⫅⫆⫍⫎⫏⫐⫑⫒⫓⫔⫕⫖⫞⫣⫤⫥⫬⫭⫷⫸⫹⫺ + ⸂⸃⸄⸅⸉⸊⸌⸍⸜⸝⸠⸡⸢⸣⸤⸥⸦⸧⸨⸩ + 〈〉《》「」『』【】〔〕〖〗〘〙〚〛 + ﹙﹚﹛﹜﹝﹞﹤﹥ + ()<>[]{}⦅⦆「」 + diff --git a/layout/reftests/bidi/reftest.list b/layout/reftests/bidi/reftest.list index 4d1832f33da..c5e2ec1a8d4 100644 --- a/layout/reftests/bidi/reftest.list +++ b/layout/reftests/bidi/reftest.list @@ -15,6 +15,7 @@ random-if(cocoaWidget) == bidi-006-j.html bidi-006-ref.html # bug 734313 == bidiSVG-03.svg bidiSVG-03-ref.svg == bidiSVG-04.svg bidiSVG-04-ref.svg == bidiSVG-05.svg bidiSVG-05-ref.svg +== bidiMirroring.svg bidiMirroring-ref.svg random-if(layersGPUAccelerated) == visualmarquee.html marquee-ref.html random-if(layersGPUAccelerated) == logicalmarquee.html marquee-ref.html == visualmarquee.html logicalmarquee.html From e2b45d2173f9030986a04fe55d5eb3d4d1511359 Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Tue, 24 Apr 2012 18:53:39 +0100 Subject: [PATCH 018/182] bug 744357 - implement mappings from Unicode's SpecialCasing.txt for text-transform. r=smontagu --- .../unicharutil/tools/genSpecialCasingData.pl | 287 ++++++++++++++++++ intl/unicharutil/util/Makefile.in | 2 + intl/unicharutil/util/nsSpecialCasingData.cpp | 202 ++++++++++++ intl/unicharutil/util/nsSpecialCasingData.h | 26 ++ intl/unicharutil/util/objs.mk | 1 + layout/generic/nsTextRunTransformations.cpp | 135 +++++--- 6 files changed, 607 insertions(+), 46 deletions(-) create mode 100755 intl/unicharutil/tools/genSpecialCasingData.pl create mode 100644 intl/unicharutil/util/nsSpecialCasingData.cpp create mode 100644 intl/unicharutil/util/nsSpecialCasingData.h diff --git a/intl/unicharutil/tools/genSpecialCasingData.pl b/intl/unicharutil/tools/genSpecialCasingData.pl new file mode 100755 index 00000000000..3d9207c4a7a --- /dev/null +++ b/intl/unicharutil/tools/genSpecialCasingData.pl @@ -0,0 +1,287 @@ +#!/usr/bin/env perl + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + +# This tool is used to extract "special" (one-to-many) case mappings +# into a form that can be used by nsTextRunTransformations. + +use strict; + +if ($#ARGV != 1) { + print <<__EOT; +# Run this tool using a command line of the form +# +# perl genSpecialCasingData.pl UnicodeData.txt SpecialCasing.txt +# +# The nsSpecialCasingData.cpp file will be written to standard output. +# +# This tool will also write up-to-date versions of the test files +# all-{upper,lower,title}.html +# and corresponding -ref files in the current directory. +# +__EOT + exit 0; +} + +my %allLower; +my %allUpper; +my %allTitle; +my %compositions; +my %gc; +open FH, "< $ARGV[0]" or die "can't open $ARGV[0] (should be UnicodeData.txt)\n"; +while () { + chomp; + my @fields = split /;/; + next if ($fields[1] =~ /) { + chomp; + m/#\s*(.+)$/; + my $comment = $1; + if ($comment =~ /^(SpecialCasing-|Date:)/) { + push @headerLines, $comment; + next; + } + s/#.*//; + s/;\s*$//; + next if $_ eq ''; + my @fields = split /; */; + next unless (scalar @fields) == 4; + my $usv = hex "0x$fields[0]"; + addIfSpecial(\%specialLower, $usv, $fields[1]); + addIfSpecial(\%specialTitle, $usv, $fields[2]); + addIfSpecial(\%specialUpper, $usv, $fields[3]); + $charName{$usv} = $comment; +} +close FH; + +print <<__END__; +/* 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/. */ + +/* Auto-generated from files in the Unicode Character Database + by genSpecialCasingData.pl - do not edit! */ + +#include "nsSpecialCasingData.h" +#include "mozilla/Util.h" // for ArrayLength +#include // for bsearch + +__END__ +map { print "/* $_ */\n" } @headerLines; + +print <<__END__; + +using mozilla::unicode::MultiCharMapping; + +__END__ + +printMappings('Lower', \%specialLower); +printMappings('Upper', \%specialUpper); +printMappings('Title', \%specialTitle); + +print <<__END__; +static int CompareMCM(const void* aKey, const void* aElement) +{ + const PRUint32 ch = *static_cast(aKey); + const MultiCharMapping* mcm = static_cast(aElement); + return int(ch) - int(mcm->mOriginalChar); +} + +#define MAKE_SPECIAL_CASE_ACCESSOR(which) \\ + const MultiCharMapping* \\ + Special##which(PRUint32 aChar) \\ + { \\ + const void* p = bsearch(&aChar, CaseSpecials_##which, \\ + mozilla::ArrayLength(CaseSpecials_##which), \\ + sizeof(MultiCharMapping), CompareMCM); \\ + return static_cast(p); \\ + } + +namespace mozilla { +namespace unicode { + +MAKE_SPECIAL_CASE_ACCESSOR(Lower) +MAKE_SPECIAL_CASE_ACCESSOR(Upper) +MAKE_SPECIAL_CASE_ACCESSOR(Title) + +} // namespace unicode +} // namespace mozilla +__END__ + +addSpecialsTo(\%allLower, \%specialLower); +addSpecialsTo(\%allUpper, \%specialUpper); +addSpecialsTo(\%allTitle, \%specialTitle); + +my $testFont = "../fonts/dejavu-sans/DejaVuSans.ttf"; +genTest('lower', \%allLower); +genTest('upper', \%allUpper); +genTitleTest(); + +sub printMappings { + my ($whichMapping, $hash) = @_; + print "static const MultiCharMapping CaseSpecials_${whichMapping}[] = {\n"; + foreach my $key (sort { $a <=> $b } keys %$hash) { + my @chars = split(/ /, $hash->{$key}); + printf " { 0x%04x, {0x%04x, 0x%04x, 0x%04x} }, // %s\n", $key, + hex "0x0$chars[0]", hex "0x0$chars[1]", hex "0x0$chars[2]", + "$charName{$key}"; + } + print "};\n\n"; +}; + +sub addIfSpecial { + my ($hash, $usv, $mapping) = @_; + return unless $mapping =~ / /; + # only do compositions that start with the initial char + foreach (keys %compositions) { + $mapping =~ s/^$_/$compositions{$_}/; + } + $hash->{$usv} = $mapping; +}; + +sub addSpecialsTo { + my ($hash, $specials) = @_; + foreach my $key (keys %$specials) { + $hash->{$key} = $specials->{$key}; + } +}; + +sub genTest { + my ($whichMapping, $hash) = @_; + open OUT, "> all-$whichMapping.html"; + print OUT <<__END__; + + + + + + + +

+__END__ + foreach my $key (sort { $a <=> $b } keys %$hash) { + printf OUT "&#x%04X;", $key; + print OUT " " if exists $charName{$key}; + print OUT "\n"; + } + print OUT <<__END__; +

+ + +__END__ + close OUT; + + open OUT, "> all-$whichMapping-ref.html"; + print OUT <<__END__; + + + + + + + +

+__END__ + foreach my $key (sort { $a <=> $b } keys %$hash) { + print OUT join('', map { sprintf("&#x%s;", $_) } split(/ /, $hash->{$key})); + print OUT " " if exists $charName{$key}; + print OUT "\n"; + } + print OUT <<__END__; +

+ + +__END__ + close OUT; +}; + +sub genTitleTest { + open OUT, "> all-title.html"; + print OUT <<__END__; + + + + + + + +

+__END__ + foreach my $key (sort { $a <=> $b } keys %allTitle) { + printf OUT "&#x%04X;x", $key; + print OUT " " if exists $charName{$key}; + print OUT "\n"; + } + print OUT <<__END__; +

+ + +__END__ + close OUT; + + open OUT, "> all-title-ref.html"; + print OUT <<__END__; + + + + + + + +

+__END__ + foreach my $key (sort { $a <=> $b } keys %allTitle) { + # capitalize is only applied to characters with GC=L* or N*... + if ($gc{$key} =~ /^[LN]/) { + # ...and those that are already uppercase are not transformed + if (exists $allUpper{$key}) { + print OUT join('', map { sprintf("&#x%s;", $_) } split(/ /, $allTitle{$key})); + } else { + printf OUT "&#x%04X;", $key; + } + print OUT "x"; + } else { + printf OUT "&#x%04X;X", $key; + } + print OUT " " if exists $charName{$key}; + print OUT "\n"; + } + print OUT <<__END__; +

+ + +__END__ + close OUT; +}; diff --git a/intl/unicharutil/util/Makefile.in b/intl/unicharutil/util/Makefile.in index 6bd276a94aa..37415c4d27a 100644 --- a/intl/unicharutil/util/Makefile.in +++ b/intl/unicharutil/util/Makefile.in @@ -62,6 +62,7 @@ SDK_HEADERS = \ EXPORTS = \ nsBidiUtils.h \ + nsSpecialCasingData.h \ nsUnicodeProperties.h \ nsUnicodeScriptCodes.h \ $(NULL) @@ -69,6 +70,7 @@ EXPORTS = \ CPPSRCS = \ nsUnicharUtils.cpp \ nsBidiUtils.cpp \ + nsSpecialCasingData.cpp \ nsUnicodeProperties.cpp \ $(NULL) diff --git a/intl/unicharutil/util/nsSpecialCasingData.cpp b/intl/unicharutil/util/nsSpecialCasingData.cpp new file mode 100644 index 00000000000..fccb79215ad --- /dev/null +++ b/intl/unicharutil/util/nsSpecialCasingData.cpp @@ -0,0 +1,202 @@ +/* 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/. */ + +/* Auto-generated from files in the Unicode Character Database + by genSpecialCasingData.pl - do not edit! */ + +#include "nsSpecialCasingData.h" +#include "mozilla/Util.h" // for ArrayLength +#include // for bsearch + +/* SpecialCasing-6.1.0.txt */ +/* Date: 2011-11-27, 05:10:51 GMT [MD] */ + +using mozilla::unicode::MultiCharMapping; + +static const MultiCharMapping CaseSpecials_Lower[] = { + { 0x0130, {0x0069, 0x0307, 0x0000} }, // LATIN CAPITAL LETTER I WITH DOT ABOVE +}; + +static const MultiCharMapping CaseSpecials_Upper[] = { + { 0x00df, {0x0053, 0x0053, 0x0000} }, // LATIN SMALL LETTER SHARP S + { 0x0149, {0x02bc, 0x004e, 0x0000} }, // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + { 0x01f0, {0x004a, 0x030c, 0x0000} }, // LATIN SMALL LETTER J WITH CARON + { 0x0390, {0x03aa, 0x0301, 0x0000} }, // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + { 0x03b0, {0x03ab, 0x0301, 0x0000} }, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + { 0x0587, {0x0535, 0x0552, 0x0000} }, // ARMENIAN SMALL LIGATURE ECH YIWN + { 0x1e96, {0x0048, 0x0331, 0x0000} }, // LATIN SMALL LETTER H WITH LINE BELOW + { 0x1e97, {0x0054, 0x0308, 0x0000} }, // LATIN SMALL LETTER T WITH DIAERESIS + { 0x1e98, {0x0057, 0x030a, 0x0000} }, // LATIN SMALL LETTER W WITH RING ABOVE + { 0x1e99, {0x0059, 0x030a, 0x0000} }, // LATIN SMALL LETTER Y WITH RING ABOVE + { 0x1e9a, {0x0041, 0x02be, 0x0000} }, // LATIN SMALL LETTER A WITH RIGHT HALF RING + { 0x1f50, {0x03a5, 0x0313, 0x0000} }, // GREEK SMALL LETTER UPSILON WITH PSILI + { 0x1f52, {0x03a5, 0x0313, 0x0300} }, // GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA + { 0x1f54, {0x03a5, 0x0313, 0x0301} }, // GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA + { 0x1f56, {0x03a5, 0x0313, 0x0342} }, // GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI + { 0x1f80, {0x1f08, 0x0399, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI + { 0x1f81, {0x1f09, 0x0399, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI + { 0x1f82, {0x1f0a, 0x0399, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + { 0x1f83, {0x1f0b, 0x0399, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + { 0x1f84, {0x1f0c, 0x0399, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + { 0x1f85, {0x1f0d, 0x0399, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + { 0x1f86, {0x1f0e, 0x0399, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + { 0x1f87, {0x1f0f, 0x0399, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + { 0x1f88, {0x1f08, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI + { 0x1f89, {0x1f09, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI + { 0x1f8a, {0x1f0a, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + { 0x1f8b, {0x1f0b, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + { 0x1f8c, {0x1f0c, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + { 0x1f8d, {0x1f0d, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + { 0x1f8e, {0x1f0e, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1f8f, {0x1f0f, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1f90, {0x1f28, 0x0399, 0x0000} }, // GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI + { 0x1f91, {0x1f29, 0x0399, 0x0000} }, // GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI + { 0x1f92, {0x1f2a, 0x0399, 0x0000} }, // GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + { 0x1f93, {0x1f2b, 0x0399, 0x0000} }, // GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + { 0x1f94, {0x1f2c, 0x0399, 0x0000} }, // GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + { 0x1f95, {0x1f2d, 0x0399, 0x0000} }, // GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + { 0x1f96, {0x1f2e, 0x0399, 0x0000} }, // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + { 0x1f97, {0x1f2f, 0x0399, 0x0000} }, // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + { 0x1f98, {0x1f28, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI + { 0x1f99, {0x1f29, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI + { 0x1f9a, {0x1f2a, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + { 0x1f9b, {0x1f2b, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + { 0x1f9c, {0x1f2c, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + { 0x1f9d, {0x1f2d, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + { 0x1f9e, {0x1f2e, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1f9f, {0x1f2f, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1fa0, {0x1f68, 0x0399, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI + { 0x1fa1, {0x1f69, 0x0399, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI + { 0x1fa2, {0x1f6a, 0x0399, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + { 0x1fa3, {0x1f6b, 0x0399, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + { 0x1fa4, {0x1f6c, 0x0399, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + { 0x1fa5, {0x1f6d, 0x0399, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + { 0x1fa6, {0x1f6e, 0x0399, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + { 0x1fa7, {0x1f6f, 0x0399, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + { 0x1fa8, {0x1f68, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI + { 0x1fa9, {0x1f69, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI + { 0x1faa, {0x1f6a, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + { 0x1fab, {0x1f6b, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + { 0x1fac, {0x1f6c, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + { 0x1fad, {0x1f6d, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + { 0x1fae, {0x1f6e, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1faf, {0x1f6f, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + { 0x1fb2, {0x1fba, 0x0399, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI + { 0x1fb3, {0x0391, 0x0399, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI + { 0x1fb4, {0x0386, 0x0399, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + { 0x1fb6, {0x0391, 0x0342, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH PERISPOMENI + { 0x1fb7, {0x0391, 0x0342, 0x0399} }, // GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI + { 0x1fbc, {0x0391, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI + { 0x1fc2, {0x1fca, 0x0399, 0x0000} }, // GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI + { 0x1fc3, {0x0397, 0x0399, 0x0000} }, // GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI + { 0x1fc4, {0x0389, 0x0399, 0x0000} }, // GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + { 0x1fc6, {0x0397, 0x0342, 0x0000} }, // GREEK SMALL LETTER ETA WITH PERISPOMENI + { 0x1fc7, {0x0397, 0x0342, 0x0399} }, // GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI + { 0x1fcc, {0x0397, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI + { 0x1fd2, {0x03aa, 0x0300, 0x0000} }, // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA + { 0x1fd3, {0x03aa, 0x0301, 0x0000} }, // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA + { 0x1fd6, {0x0399, 0x0342, 0x0000} }, // GREEK SMALL LETTER IOTA WITH PERISPOMENI + { 0x1fd7, {0x03aa, 0x0342, 0x0000} }, // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI + { 0x1fe2, {0x03ab, 0x0300, 0x0000} }, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA + { 0x1fe3, {0x03ab, 0x0301, 0x0000} }, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA + { 0x1fe4, {0x03a1, 0x0313, 0x0000} }, // GREEK SMALL LETTER RHO WITH PSILI + { 0x1fe6, {0x03a5, 0x0342, 0x0000} }, // GREEK SMALL LETTER UPSILON WITH PERISPOMENI + { 0x1fe7, {0x03ab, 0x0342, 0x0000} }, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI + { 0x1ff2, {0x1ffa, 0x0399, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI + { 0x1ff3, {0x03a9, 0x0399, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI + { 0x1ff4, {0x038f, 0x0399, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + { 0x1ff6, {0x03a9, 0x0342, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH PERISPOMENI + { 0x1ff7, {0x03a9, 0x0342, 0x0399} }, // GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + { 0x1ffc, {0x03a9, 0x0399, 0x0000} }, // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + { 0xfb00, {0x0046, 0x0046, 0x0000} }, // LATIN SMALL LIGATURE FF + { 0xfb01, {0x0046, 0x0049, 0x0000} }, // LATIN SMALL LIGATURE FI + { 0xfb02, {0x0046, 0x004c, 0x0000} }, // LATIN SMALL LIGATURE FL + { 0xfb03, {0x0046, 0x0046, 0x0049} }, // LATIN SMALL LIGATURE FFI + { 0xfb04, {0x0046, 0x0046, 0x004c} }, // LATIN SMALL LIGATURE FFL + { 0xfb05, {0x0053, 0x0054, 0x0000} }, // LATIN SMALL LIGATURE LONG S T + { 0xfb06, {0x0053, 0x0054, 0x0000} }, // LATIN SMALL LIGATURE ST + { 0xfb13, {0x0544, 0x0546, 0x0000} }, // ARMENIAN SMALL LIGATURE MEN NOW + { 0xfb14, {0x0544, 0x0535, 0x0000} }, // ARMENIAN SMALL LIGATURE MEN ECH + { 0xfb15, {0x0544, 0x053b, 0x0000} }, // ARMENIAN SMALL LIGATURE MEN INI + { 0xfb16, {0x054e, 0x0546, 0x0000} }, // ARMENIAN SMALL LIGATURE VEW NOW + { 0xfb17, {0x0544, 0x053d, 0x0000} }, // ARMENIAN SMALL LIGATURE MEN XEH +}; + +static const MultiCharMapping CaseSpecials_Title[] = { + { 0x00df, {0x0053, 0x0073, 0x0000} }, // LATIN SMALL LETTER SHARP S + { 0x0149, {0x02bc, 0x004e, 0x0000} }, // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + { 0x01f0, {0x004a, 0x030c, 0x0000} }, // LATIN SMALL LETTER J WITH CARON + { 0x0390, {0x03aa, 0x0301, 0x0000} }, // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + { 0x03b0, {0x03ab, 0x0301, 0x0000} }, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + { 0x0587, {0x0535, 0x0582, 0x0000} }, // ARMENIAN SMALL LIGATURE ECH YIWN + { 0x1e96, {0x0048, 0x0331, 0x0000} }, // LATIN SMALL LETTER H WITH LINE BELOW + { 0x1e97, {0x0054, 0x0308, 0x0000} }, // LATIN SMALL LETTER T WITH DIAERESIS + { 0x1e98, {0x0057, 0x030a, 0x0000} }, // LATIN SMALL LETTER W WITH RING ABOVE + { 0x1e99, {0x0059, 0x030a, 0x0000} }, // LATIN SMALL LETTER Y WITH RING ABOVE + { 0x1e9a, {0x0041, 0x02be, 0x0000} }, // LATIN SMALL LETTER A WITH RIGHT HALF RING + { 0x1f50, {0x03a5, 0x0313, 0x0000} }, // GREEK SMALL LETTER UPSILON WITH PSILI + { 0x1f52, {0x03a5, 0x0313, 0x0300} }, // GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA + { 0x1f54, {0x03a5, 0x0313, 0x0301} }, // GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA + { 0x1f56, {0x03a5, 0x0313, 0x0342} }, // GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI + { 0x1fb2, {0x1fba, 0x0345, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI + { 0x1fb4, {0x0386, 0x0345, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + { 0x1fb6, {0x0391, 0x0342, 0x0000} }, // GREEK SMALL LETTER ALPHA WITH PERISPOMENI + { 0x1fb7, {0x0391, 0x0342, 0x0345} }, // GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI + { 0x1fc2, {0x1fca, 0x0345, 0x0000} }, // GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI + { 0x1fc4, {0x0389, 0x0345, 0x0000} }, // GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + { 0x1fc6, {0x0397, 0x0342, 0x0000} }, // GREEK SMALL LETTER ETA WITH PERISPOMENI + { 0x1fc7, {0x0397, 0x0342, 0x0345} }, // GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI + { 0x1fd2, {0x03aa, 0x0300, 0x0000} }, // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA + { 0x1fd3, {0x03aa, 0x0301, 0x0000} }, // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA + { 0x1fd6, {0x0399, 0x0342, 0x0000} }, // GREEK SMALL LETTER IOTA WITH PERISPOMENI + { 0x1fd7, {0x03aa, 0x0342, 0x0000} }, // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI + { 0x1fe2, {0x03ab, 0x0300, 0x0000} }, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA + { 0x1fe3, {0x03ab, 0x0301, 0x0000} }, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA + { 0x1fe4, {0x03a1, 0x0313, 0x0000} }, // GREEK SMALL LETTER RHO WITH PSILI + { 0x1fe6, {0x03a5, 0x0342, 0x0000} }, // GREEK SMALL LETTER UPSILON WITH PERISPOMENI + { 0x1fe7, {0x03ab, 0x0342, 0x0000} }, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI + { 0x1ff2, {0x1ffa, 0x0345, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI + { 0x1ff4, {0x038f, 0x0345, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + { 0x1ff6, {0x03a9, 0x0342, 0x0000} }, // GREEK SMALL LETTER OMEGA WITH PERISPOMENI + { 0x1ff7, {0x03a9, 0x0342, 0x0345} }, // GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + { 0xfb00, {0x0046, 0x0066, 0x0000} }, // LATIN SMALL LIGATURE FF + { 0xfb01, {0x0046, 0x0069, 0x0000} }, // LATIN SMALL LIGATURE FI + { 0xfb02, {0x0046, 0x006c, 0x0000} }, // LATIN SMALL LIGATURE FL + { 0xfb03, {0x0046, 0x0066, 0x0069} }, // LATIN SMALL LIGATURE FFI + { 0xfb04, {0x0046, 0x0066, 0x006c} }, // LATIN SMALL LIGATURE FFL + { 0xfb05, {0x0053, 0x0074, 0x0000} }, // LATIN SMALL LIGATURE LONG S T + { 0xfb06, {0x0053, 0x0074, 0x0000} }, // LATIN SMALL LIGATURE ST + { 0xfb13, {0x0544, 0x0576, 0x0000} }, // ARMENIAN SMALL LIGATURE MEN NOW + { 0xfb14, {0x0544, 0x0565, 0x0000} }, // ARMENIAN SMALL LIGATURE MEN ECH + { 0xfb15, {0x0544, 0x056b, 0x0000} }, // ARMENIAN SMALL LIGATURE MEN INI + { 0xfb16, {0x054e, 0x0576, 0x0000} }, // ARMENIAN SMALL LIGATURE VEW NOW + { 0xfb17, {0x0544, 0x056d, 0x0000} }, // ARMENIAN SMALL LIGATURE MEN XEH +}; + +static int CompareMCM(const void* aKey, const void* aElement) +{ + const PRUint32 ch = *static_cast(aKey); + const MultiCharMapping* mcm = static_cast(aElement); + return int(ch) - int(mcm->mOriginalChar); +} + +#define MAKE_SPECIAL_CASE_ACCESSOR(which) \ + const MultiCharMapping* \ + Special##which(PRUint32 aChar) \ + { \ + const void* p = bsearch(&aChar, CaseSpecials_##which, \ + mozilla::ArrayLength(CaseSpecials_##which), \ + sizeof(MultiCharMapping), CompareMCM); \ + return static_cast(p); \ + } + +namespace mozilla { +namespace unicode { + +MAKE_SPECIAL_CASE_ACCESSOR(Lower) +MAKE_SPECIAL_CASE_ACCESSOR(Upper) +MAKE_SPECIAL_CASE_ACCESSOR(Title) + +} // namespace unicode +} // namespace mozilla diff --git a/intl/unicharutil/util/nsSpecialCasingData.h b/intl/unicharutil/util/nsSpecialCasingData.h new file mode 100644 index 00000000000..fe2fc522027 --- /dev/null +++ b/intl/unicharutil/util/nsSpecialCasingData.h @@ -0,0 +1,26 @@ +/* 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 "prtypes.h" + +namespace mozilla { +namespace unicode { + +// Multi-character mappings (from SpecialCasing.txt) map a single Unicode +// value to a sequence of 2 or 3 Unicode characters. There are currently none +// defined outside the BMP, so we can use PRUnichar here. Unused trailing +// positions in mMappedChars are set to 0. +struct MultiCharMapping { + PRUnichar mOriginalChar; + PRUnichar mMappedChars[3]; +}; + +// Return a pointer to the special case mapping for the given character; +// returns NULL if no such mapping is defined. +const MultiCharMapping* SpecialUpper(PRUint32 aCh); +const MultiCharMapping* SpecialLower(PRUint32 aCh); +const MultiCharMapping* SpecialTitle(PRUint32 aCh); + +} // namespace unicode +} // namespace mozilla diff --git a/intl/unicharutil/util/objs.mk b/intl/unicharutil/util/objs.mk index 69f78cce7f1..4c75e08e617 100644 --- a/intl/unicharutil/util/objs.mk +++ b/intl/unicharutil/util/objs.mk @@ -37,6 +37,7 @@ INTL_UNICHARUTIL_UTIL_LCPPSRCS = \ nsUnicharUtils.cpp \ nsBidiUtils.cpp \ + nsSpecialCasingData.cpp \ nsUnicodeProperties.cpp \ $(NULL) diff --git a/layout/generic/nsTextRunTransformations.cpp b/layout/generic/nsTextRunTransformations.cpp index b9aaaa2acb4..6c05638479c 100644 --- a/layout/generic/nsTextRunTransformations.cpp +++ b/layout/generic/nsTextRunTransformations.cpp @@ -47,8 +47,7 @@ #include "nsContentUtils.h" #include "nsUnicharUtils.h" #include "nsUnicodeProperties.h" - -#define SZLIG 0x00DF +#include "nsSpecialCasingData.h" // Unicode characters needing special casing treatment in tr/az languages #define LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE 0x0130 @@ -158,11 +157,18 @@ nsTransformingTextRunFactory::MakeTextRun(const PRUint8* aString, PRUint32 aLeng * are identical. * * This is used for text-transform:uppercase when we encounter a SZLIG, - * whose uppercase form is "SS". + * whose uppercase form is "SS", or other ligature or precomposed form + * that expands to multiple codepoints during case transformation. * * This function is unable to merge characters when they occur in different - * glyph runs. It's hard to see how this could happen, but if it does, we just - * discard the characters-to-merge. + * glyph runs. This only happens in tricky edge cases where a character was + * decomposed by case-mapping (e.g. there's no precomposed uppercase version + * of an accented lowercase letter), and then font-matching caused the + * diacritics to be assigned to a different font than the base character. + * In this situation, the diacritic(s) get discarded, which is less than + * ideal, but they probably weren't going to render very well anyway. + * Bug 543200 will improve this by making font-matching operate on entire + * clusters instead of individual codepoints. * * For simplicity, this produces a textrun containing all DetailedGlyphs, * no simple glyphs. So don't call it unless you really have merging to do. @@ -188,9 +194,11 @@ MergeCharactersInTextRun(gfxTextRun* aDest, gfxTextRun* aSrc, bool anyMissing = false; PRUint32 mergeRunStart = iter.GetStringStart(); - PRUint32 k; - for (k = iter.GetStringStart(); k < iter.GetStringEnd(); ++k) { - const gfxTextRun::CompressedGlyph g = aSrc->GetCharacterGlyphs()[k]; + const gfxTextRun::CompressedGlyph *srcGlyphs = aSrc->GetCharacterGlyphs(); + gfxTextRun::CompressedGlyph mergedGlyph = srcGlyphs[mergeRunStart]; + PRUint32 stringEnd = iter.GetStringEnd(); + for (PRUint32 k = iter.GetStringStart(); k < stringEnd; ++k) { + const gfxTextRun::CompressedGlyph g = srcGlyphs[k]; if (g.IsSimpleGlyph()) { if (!anyMissing) { gfxTextRun::DetailedGlyph details; @@ -210,40 +218,39 @@ MergeCharactersInTextRun(gfxTextRun* aDest, gfxTextRun* aSrc, } } - // We could teach this method to handle merging of characters that aren't - // cluster starts or ligature group starts, but this is really only used - // to merge S's (uppercase ß), so it's not worth it. - if (k + 1 < iter.GetStringEnd() && aCharsToMerge[k + 1]) { - NS_ASSERTION(g.IsClusterStart() && g.IsLigatureGroupStart(), - "Don't know how to merge this stuff"); + // next char is supposed to merge with current, so loop without + // writing current merged glyph to the destination continue; } - NS_ASSERTION(mergeRunStart == k || - (g.IsClusterStart() && g.IsLigatureGroupStart()), - "Don't know how to merge this stuff"); - // If the start of the merge run is actually a character that should // have been merged with the previous character (this can happen - // if there's a font change in the middle of a szlig, for example), + // if there's a font change in the middle of a case-mapped character, + // that decomposed into a sequence of base+diacritics, for example), // just discard the entire merge run. See comment at start of this // function. + NS_WARN_IF_FALSE(!aCharsToMerge[mergeRunStart], + "unable to merge across a glyph run boundary, " + "glyph(s) discarded"); if (!aCharsToMerge[mergeRunStart]) { - gfxTextRun::CompressedGlyph mergedGlyphs = - aSrc->GetCharacterGlyphs()[mergeRunStart]; if (anyMissing) { - mergedGlyphs.SetMissing(glyphs.Length()); + mergedGlyph.SetMissing(glyphs.Length()); } else { - mergedGlyphs.SetComplex(true, true, glyphs.Length()); + mergedGlyph.SetComplex(mergedGlyph.IsClusterStart(), + mergedGlyph.IsLigatureGroupStart(), + glyphs.Length()); } - aDest->SetGlyphs(offset, mergedGlyphs, glyphs.Elements()); + aDest->SetGlyphs(offset, mergedGlyph, glyphs.Elements()); ++offset; } glyphs.Clear(); anyMissing = false; mergeRunStart = k + 1; + if (mergeRunStart < stringEnd) { + mergedGlyph = srcGlyphs[mergeRunStart]; + } } NS_ASSERTION(glyphs.Length() == 0, "Leftover glyphs, don't request merging of the last character with its next!"); @@ -310,7 +317,7 @@ nsFontVariantTextRunFactory::RebuildTextRun(nsTransformedTextRun* aTextRun, ch = SURROGATE_TO_UCS4(ch, str[i + 1]); } PRUint32 ch2 = ToUpperCase(ch); - isLowercase = ch != ch2 || ch == SZLIG; + isLowercase = ch != ch2 || mozilla::unicode::SpecialUpper(ch); } else { // Don't transform the character! I.e., pretend that it's not lowercase } @@ -399,7 +406,8 @@ nsCaseTransformTextRunFactory::RebuildTextRun(nsTransformedTextRun* aTextRun, PRUint8 style = mAllUppercase ? NS_STYLE_TEXT_TRANSFORM_UPPERCASE : styleContext->GetStyleText()->mTextTransform; - bool extraChar = false; + int extraChars = 0; + const mozilla::unicode::MultiCharMapping *mcm; if (NS_IS_HIGH_SURROGATE(ch) && i < length - 1 && NS_IS_LOW_SURROGATE(str[i + 1])) { ch = SURROGATE_TO_UCS4(ch, str[i + 1]); @@ -420,11 +428,19 @@ nsCaseTransformTextRunFactory::RebuildTextRun(nsTransformedTextRun* aTextRun, switch (style) { case NS_STYLE_TEXT_TRANSFORM_LOWERCASE: - if (languageSpecificCasing == eTurkish && ch == 'I') { - ch = LATIN_SMALL_LETTER_DOTLESS_I; - prevIsLetter = true; - sigmaIndex = PRUint32(-1); - break; + if (languageSpecificCasing == eTurkish) { + if (ch == 'I') { + ch = LATIN_SMALL_LETTER_DOTLESS_I; + prevIsLetter = true; + sigmaIndex = PRUint32(-1); + break; + } + if (ch == LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE) { + ch = 'i'; + prevIsLetter = true; + sigmaIndex = PRUint32(-1); + break; + } } // Special lowercasing behavior for Greek Sigma: note that this is listed @@ -473,8 +489,6 @@ nsCaseTransformTextRunFactory::RebuildTextRun(nsTransformedTextRun* aTextRun, break; } - ch = ToLowerCase(ch); - // ignore diacritics for the purpose of contextual sigma mapping; // otherwise, reset prevIsLetter appropriately and clear the // sigmaIndex marker @@ -482,19 +496,40 @@ nsCaseTransformTextRunFactory::RebuildTextRun(nsTransformedTextRun* aTextRun, prevIsLetter = (cat == nsIUGenCategory::kLetter); sigmaIndex = PRUint32(-1); } + + mcm = mozilla::unicode::SpecialLower(ch); + if (mcm) { + int j = 0; + while (j < 2 && mcm->mMappedChars[j + 1]) { + convertedString.Append(mcm->mMappedChars[j]); + ++extraChars; + ++j; + } + ch = mcm->mMappedChars[j]; + break; + } + + ch = ToLowerCase(ch); break; case NS_STYLE_TEXT_TRANSFORM_UPPERCASE: - if (ch == SZLIG) { - convertedString.Append('S'); - extraChar = true; - ch = 'S'; - break; - } if (languageSpecificCasing == eTurkish && ch == 'i') { ch = LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE; break; } + + mcm = mozilla::unicode::SpecialUpper(ch); + if (mcm) { + int j = 0; + while (j < 2 && mcm->mMappedChars[j + 1]) { + convertedString.Append(mcm->mMappedChars[j]); + ++extraChars; + ++j; + } + ch = mcm->mMappedChars[j]; + break; + } + ch = ToUpperCase(ch); break; @@ -506,12 +541,6 @@ nsCaseTransformTextRunFactory::RebuildTextRun(nsTransformedTextRun* aTextRun, } capitalizeDutchIJ = false; if (i < aTextRun->mCapitalize.Length() && aTextRun->mCapitalize[i]) { - if (ch == SZLIG) { - convertedString.Append('S'); - extraChar = true; - ch = 'S'; - break; - } if (languageSpecificCasing == eTurkish && ch == 'i') { ch = LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE; break; @@ -521,6 +550,19 @@ nsCaseTransformTextRunFactory::RebuildTextRun(nsTransformedTextRun* aTextRun, capitalizeDutchIJ = true; break; } + + mcm = mozilla::unicode::SpecialTitle(ch); + if (mcm) { + int j = 0; + while (j < 2 && mcm->mMappedChars[j + 1]) { + convertedString.Append(mcm->mMappedChars[j]); + ++extraChars; + ++j; + } + ch = mcm->mMappedChars[j]; + break; + } + ch = ToTitleCase(ch); } break; @@ -540,11 +582,12 @@ nsCaseTransformTextRunFactory::RebuildTextRun(nsTransformedTextRun* aTextRun, canBreakBeforeArray.AppendElement(false); } - if (extraChar) { + while (extraChars > 0) { ++extraCharsCount; charsToMergeArray.AppendElement(true); styleArray.AppendElement(styleContext); canBreakBeforeArray.AppendElement(false); + --extraChars; } } From 8df6ada1ae85e352df925051a5e43d3b6cd50025 Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Tue, 24 Apr 2012 18:53:39 +0100 Subject: [PATCH 019/182] bug 744357 - update case-mapping reftests to take account of SpecialCasing mappings. r=smontagu --- .../text-transform/all-lower-ref.html | 100 +++++++--- layout/reftests/text-transform/all-lower.html | 99 +++++++--- .../text-transform/all-title-ref.html | 152 ++++++++++++--- layout/reftests/text-transform/all-title.html | 151 +++++++++++---- .../text-transform/all-upper-ref.html | 173 +++++++++++++++--- layout/reftests/text-transform/all-upper.html | 172 ++++++++++++++--- layout/reftests/text-transform/reftest.list | 7 +- 7 files changed, 678 insertions(+), 176 deletions(-) diff --git a/layout/reftests/text-transform/all-lower-ref.html b/layout/reftests/text-transform/all-lower-ref.html index 52b16521196..b5b3b803fd4 100644 --- a/layout/reftests/text-transform/all-lower-ref.html +++ b/layout/reftests/text-transform/all-lower-ref.html @@ -2,6 +2,10 @@ +

@@ -85,7 +89,7 @@ ī ĭ į -i +i̇ ij ĵ ķ @@ -681,40 +685,40 @@ ὥ ὦ ὧ -ᾀ -ᾁ -ᾂ -ᾃ -ᾄ -ᾅ -ᾆ -ᾇ -ᾐ -ᾑ -ᾒ -ᾓ -ᾔ -ᾕ -ᾖ -ᾗ -ᾠ -ᾡ -ᾢ -ᾣ -ᾤ -ᾥ -ᾦ -ᾧ +ᾀ +ᾁ +ᾂ +ᾃ +ᾄ +ᾅ +ᾆ +ᾇ +ᾐ +ᾑ +ᾒ +ᾓ +ᾔ +ᾕ +ᾖ +ᾗ +ᾠ +ᾡ +ᾢ +ᾣ +ᾤ +ᾥ +ᾦ +ᾧ ᾰ ᾱ ὰ ά -ᾳ +ᾳ ὲ έ ὴ ή -ῃ +ῃ ῐ ῑ ὶ @@ -728,7 +732,7 @@ ό ὼ ώ -ῳ +ῳ ω k å @@ -1008,6 +1012,46 @@ x y z +𐐨 +𐐩 +𐐪 +𐐫 +𐐬 +𐐭 +𐐮 +𐐯 +𐐰 +𐐱 +𐐲 +𐐳 +𐐴 +𐐵 +𐐶 +𐐷 +𐐸 +𐐹 +𐐺 +𐐻 +𐐼 +𐐽 +𐐾 +𐐿 +𐑀 +𐑁 +𐑂 +𐑃 +𐑄 +𐑅 +𐑆 +𐑇 +𐑈 +𐑉 +𐑊 +𐑋 +𐑌 +𐑍 +𐑎 +𐑏

diff --git a/layout/reftests/text-transform/all-lower.html b/layout/reftests/text-transform/all-lower.html index 866eda43fa1..7adf0c42c34 100644 --- a/layout/reftests/text-transform/all-lower.html +++ b/layout/reftests/text-transform/all-lower.html @@ -3,7 +3,8 @@ @@ -88,7 +89,7 @@ Ī Ĭ Į -İ +İ IJ Ĵ Ķ @@ -684,40 +685,40 @@ Ὥ Ὦ Ὧ -ᾈ -ᾉ -ᾊ -ᾋ -ᾌ -ᾍ -ᾎ -ᾏ -ᾘ -ᾙ -ᾚ -ᾛ -ᾜ -ᾝ -ᾞ -ᾟ -ᾨ -ᾩ -ᾪ -ᾫ -ᾬ -ᾭ -ᾮ -ᾯ +ᾈ +ᾉ +ᾊ +ᾋ +ᾌ +ᾍ +ᾎ +ᾏ +ᾘ +ᾙ +ᾚ +ᾛ +ᾜ +ᾝ +ᾞ +ᾟ +ᾨ +ᾩ +ᾪ +ᾫ +ᾬ +ᾭ +ᾮ +ᾯ Ᾰ Ᾱ Ὰ Ά -ᾼ +ᾼ Ὲ Έ Ὴ Ή -ῌ +ῌ Ῐ Ῑ Ὶ @@ -731,7 +732,7 @@ Ό Ὼ Ώ -ῼ +ῼ Ω K Å @@ -1011,6 +1012,46 @@ X Y Z +𐐀 +𐐁 +𐐂 +𐐃 +𐐄 +𐐅 +𐐆 +𐐇 +𐐈 +𐐉 +𐐊 +𐐋 +𐐌 +𐐍 +𐐎 +𐐏 +𐐐 +𐐑 +𐐒 +𐐓 +𐐔 +𐐕 +𐐖 +𐐗 +𐐘 +𐐙 +𐐚 +𐐛 +𐐜 +𐐝 +𐐞 +𐐟 +𐐠 +𐐡 +𐐢 +𐐣 +𐐤 +𐐥 +𐐦 +𐐧

diff --git a/layout/reftests/text-transform/all-title-ref.html b/layout/reftests/text-transform/all-title-ref.html index 0338db2a5d0..2613ec9e429 100644 --- a/layout/reftests/text-transform/all-title-ref.html +++ b/layout/reftests/text-transform/all-title-ref.html @@ -2,6 +2,10 @@ +

@@ -32,6 +36,7 @@ Yx Zx Μx +Ssx Àx Áx Âx @@ -99,6 +104,7 @@ Ńx Ņx Ňx +ʼNx Ŋx Ōx Ŏx @@ -174,6 +180,7 @@ Ǫx Ǭx Ǯx +J̌x DZx Dzx Dzx @@ -245,17 +252,19 @@ Ʋx Ʌx Ʒx -ͅX +ͅX Ͱx Ͳx Ͷx Ͻx Ͼx Ͽx +Ϊ́x Άx Έx Ήx Ίx +Ϋ́x Αx Βx Γx @@ -491,6 +500,7 @@ Քx Օx Ֆx +Եւx Ᵹx Ᵽx Ḁx @@ -568,6 +578,11 @@ Ẑx Ẓx Ẕx +H̱x +T̈x +W̊x +Y̊x +Aʾx Ṡx Ạx Ảx @@ -653,9 +668,13 @@ Ὃx Ὄx Ὅx +Υ̓x Ὑx +Υ̓̀x Ὓx +Υ̓́x Ὕx +Υ̓͂x Ὗx Ὠx Ὡx @@ -679,41 +698,62 @@ Ύx Ὼx Ώx -ᾈx -ᾉx -ᾊx -ᾋx -ᾌx -ᾍx -ᾎx -ᾏx -ᾘx -ᾙx -ᾚx -ᾛx -ᾜx -ᾝx -ᾞx -ᾟx -ᾨx -ᾩx -ᾪx -ᾫx -ᾬx -ᾭx -ᾮx -ᾯx +ᾈx +ᾉx +ᾊx +ᾋx +ᾌx +ᾍx +ᾎx +ᾏx +ᾘx +ᾙx +ᾚx +ᾛx +ᾜx +ᾝx +ᾞx +ᾟx +ᾨx +ᾩx +ᾪx +ᾫx +ᾬx +ᾭx +ᾮx +ᾯx Ᾰx Ᾱx -ᾼx +Ὰͅx +ᾼx +Άͅx +Α͂x +ᾼ͂x Ιx -ῌx +Ὴͅx +ῌx +Ήͅx +Η͂x +ῌ͂x Ῐx Ῑx +Ϊ̀x +Ϊ́x +Ι͂x +Ϊ͂x Ῠx Ῡx +Ϋ̀x +Ϋ́x +Ρ̓x Ῥx -ῼx +Υ͂x +Ϋ͂x +Ὼͅx +ῼx +Ώͅx +Ω͂x +ῼ͂x Ⅎx Ⅰx Ⅱx @@ -732,7 +772,7 @@ Ⅾx Ⅿx Ↄx -ⓐX +ⓐX ⓑX ⓒX ⓓX @@ -757,7 +797,7 @@ ⓦX ⓧX ⓨX -ⓩX +ⓩX Ⰰx Ⰱx Ⰲx @@ -994,6 +1034,18 @@ Ꞥx Ꞧx Ꞩx +Ffx +Fix +Flx +Ffix +Fflx +Stx +Stx +Մնx +Մեx +Միx +Վնx +Մխx Ax Bx Cx @@ -1020,6 +1072,46 @@ Xx Yx Zx +𐐀x +𐐁x +𐐂x +𐐃x +𐐄x +𐐅x +𐐆x +𐐇x +𐐈x +𐐉x +𐐊x +𐐋x +𐐌x +𐐍x +𐐎x +𐐏x +𐐐x +𐐑x +𐐒x +𐐓x +𐐔x +𐐕x +𐐖x +𐐗x +𐐘x +𐐙x +𐐚x +𐐛x +𐐜x +𐐝x +𐐞x +𐐟x +𐐠x +𐐡x +𐐢x +𐐣x +𐐤x +𐐥x +𐐦x +𐐧x

diff --git a/layout/reftests/text-transform/all-title.html b/layout/reftests/text-transform/all-title.html index a810b7e5a5f..1dbd85882d4 100644 --- a/layout/reftests/text-transform/all-title.html +++ b/layout/reftests/text-transform/all-title.html @@ -3,7 +3,8 @@ @@ -35,6 +36,7 @@ yx zx µx +ßx àx áx âx @@ -102,6 +104,7 @@ ńx ņx ňx +ʼnx ŋx ōx ŏx @@ -177,6 +180,7 @@ ǫx ǭx ǯx +ǰx DZx Dzx dzx @@ -248,17 +252,19 @@ ʋx ʌx ʒx -ͅx +ͅx ͱx ͳx ͷx ͻx ͼx ͽx +ΐx άx έx ήx ίx +ΰx αx βx γx @@ -494,6 +500,7 @@ քx օx ֆx +ևx ᵹx ᵽx ḁx @@ -571,6 +578,11 @@ ẑx ẓx ẕx +ẖx +ẗx +ẘx +ẙx +ẚx ẛx ạx ảx @@ -656,9 +668,13 @@ ὃx ὄx ὅx +ὐx ὑx +ὒx ὓx +ὔx ὕx +ὖx ὗx ὠx ὡx @@ -682,41 +698,62 @@ ύx ὼx ώx -ᾀx -ᾁx -ᾂx -ᾃx -ᾄx -ᾅx -ᾆx -ᾇx -ᾐx -ᾑx -ᾒx -ᾓx -ᾔx -ᾕx -ᾖx -ᾗx -ᾠx -ᾡx -ᾢx -ᾣx -ᾤx -ᾥx -ᾦx -ᾧx +ᾀx +ᾁx +ᾂx +ᾃx +ᾄx +ᾅx +ᾆx +ᾇx +ᾐx +ᾑx +ᾒx +ᾓx +ᾔx +ᾕx +ᾖx +ᾗx +ᾠx +ᾡx +ᾢx +ᾣx +ᾤx +ᾥx +ᾦx +ᾧx ᾰx ᾱx -ᾳx +ᾲx +ᾳx +ᾴx +ᾶx +ᾷx ιx -ῃx +ῂx +ῃx +ῄx +ῆx +ῇx ῐx ῑx +ῒx +ΐx +ῖx +ῗx ῠx ῡx +ῢx +ΰx +ῤx ῥx -ῳx +ῦx +ῧx +ῲx +ῳx +ῴx +ῶx +ῷx ⅎx ⅰx ⅱx @@ -735,7 +772,7 @@ ⅾx ⅿx ↄx -ⓐx +ⓐx ⓑx ⓒx ⓓx @@ -760,7 +797,7 @@ ⓦx ⓧx ⓨx -ⓩx +ⓩx ⰰx ⰱx ⰲx @@ -997,6 +1034,18 @@ ꞥx ꞧx ꞩx +ffx +fix +flx +ffix +fflx +ſtx +stx +ﬓx +ﬔx +ﬕx +ﬖx +ﬗx ax bx cx @@ -1023,6 +1072,46 @@ xx yx zx +𐐨x +𐐩x +𐐪x +𐐫x +𐐬x +𐐭x +𐐮x +𐐯x +𐐰x +𐐱x +𐐲x +𐐳x +𐐴x +𐐵x +𐐶x +𐐷x +𐐸x +𐐹x +𐐺x +𐐻x +𐐼x +𐐽x +𐐾x +𐐿x +𐑀x +𐑁x +𐑂x +𐑃x +𐑄x +𐑅x +𐑆x +𐑇x +𐑈x +𐑉x +𐑊x +𐑋x +𐑌x +𐑍x +𐑎x +𐑏x

diff --git a/layout/reftests/text-transform/all-upper-ref.html b/layout/reftests/text-transform/all-upper-ref.html index f3cff63bef6..bbb746c6184 100644 --- a/layout/reftests/text-transform/all-upper-ref.html +++ b/layout/reftests/text-transform/all-upper-ref.html @@ -2,6 +2,10 @@ +

@@ -32,6 +36,7 @@ Y Z Μ +SS À Á Â @@ -99,6 +104,7 @@ Ń Ņ Ň +ʼN Ŋ Ō Ŏ @@ -171,6 +177,7 @@ Ǫ Ǭ Ǯ +J̌ DZ DZ Ǵ @@ -248,10 +255,12 @@ Ͻ Ͼ Ͽ +Ϊ́ Ά Έ Ή Ί +Ϋ́ Α Β Γ @@ -487,6 +496,7 @@ Ք Օ Ֆ +ԵՒ Ᵹ Ᵽ Ḁ @@ -564,6 +574,11 @@ Ẑ Ẓ Ẕ +H̱ +T̈ +W̊ +Y̊ +Aʾ Ṡ Ạ Ả @@ -649,9 +664,13 @@ Ὃ Ὄ Ὅ +Υ̓ Ὑ +Υ̓̀ Ὓ +Υ̓́ Ὕ +Υ̓͂ Ὗ Ὠ Ὡ @@ -675,41 +694,89 @@ Ύ Ὼ Ώ -ᾈ -ᾉ -ᾊ -ᾋ -ᾌ -ᾍ -ᾎ -ᾏ -ᾘ -ᾙ -ᾚ -ᾛ -ᾜ -ᾝ -ᾞ -ᾟ -ᾨ -ᾩ -ᾪ -ᾫ -ᾬ -ᾭ -ᾮ -ᾯ +ἈΙ +ἉΙ +ἊΙ +ἋΙ +ἌΙ +ἍΙ +ἎΙ +ἏΙ +ἈΙ +ἉΙ +ἊΙ +ἋΙ +ἌΙ +ἍΙ +ἎΙ +ἏΙ +ἨΙ +ἩΙ +ἪΙ +ἫΙ +ἬΙ +ἭΙ +ἮΙ +ἯΙ +ἨΙ +ἩΙ +ἪΙ +ἫΙ +ἬΙ +ἭΙ +ἮΙ +ἯΙ +ὨΙ +ὩΙ +ὪΙ +ὫΙ +ὬΙ +ὭΙ +ὮΙ +ὯΙ +ὨΙ +ὩΙ +ὪΙ +ὫΙ +ὬΙ +ὭΙ +ὮΙ +ὯΙ Ᾰ Ᾱ -ᾼ +ᾺΙ +ΑΙ +ΆΙ +Α͂ +Α͂Ι +ΑΙ Ι -ῌ +ῊΙ +ΗΙ +ΉΙ +Η͂ +Η͂Ι +ΗΙ Ῐ Ῑ +Ϊ̀ +Ϊ́ +Ι͂ +Ϊ͂ Ῠ Ῡ +Ϋ̀ +Ϋ́ +Ρ̓ Ῥ -ῼ +Υ͂ +Ϋ͂ +ῺΙ +ΩΙ +ΏΙ +Ω͂ +Ω͂Ι +ΩΙ Ⅎ Ⅰ Ⅱ @@ -990,6 +1057,18 @@ Ꞥ Ꞧ Ꞩ +FF +FI +FL +FFI +FFL +ST +ST +ՄՆ +ՄԵ +ՄԻ +ՎՆ +ՄԽ A B C @@ -1016,6 +1095,46 @@ X Y Z +𐐀 +𐐁 +𐐂 +𐐃 +𐐄 +𐐅 +𐐆 +𐐇 +𐐈 +𐐉 +𐐊 +𐐋 +𐐌 +𐐍 +𐐎 +𐐏 +𐐐 +𐐑 +𐐒 +𐐓 +𐐔 +𐐕 +𐐖 +𐐗 +𐐘 +𐐙 +𐐚 +𐐛 +𐐜 +𐐝 +𐐞 +𐐟 +𐐠 +𐐡 +𐐢 +𐐣 +𐐤 +𐐥 +𐐦 +𐐧

diff --git a/layout/reftests/text-transform/all-upper.html b/layout/reftests/text-transform/all-upper.html index b47dd640444..93146b870a4 100644 --- a/layout/reftests/text-transform/all-upper.html +++ b/layout/reftests/text-transform/all-upper.html @@ -3,7 +3,8 @@ @@ -35,6 +36,7 @@ y z µ +ß à á â @@ -102,6 +104,7 @@ ń ņ ň +ʼn ŋ ō ŏ @@ -174,6 +177,7 @@ ǫ ǭ ǯ +ǰ Dz dz ǵ @@ -251,10 +255,12 @@ ͻ ͼ ͽ +ΐ ά έ ή ί +ΰ α β γ @@ -490,6 +496,7 @@ ք օ ֆ +և ᵹ ᵽ ḁ @@ -567,6 +574,11 @@ ẑ ẓ ẕ +ẖ +ẗ +ẘ +ẙ +ẚ ẛ ạ ả @@ -652,9 +664,13 @@ ὃ ὄ ὅ +ὐ ὑ +ὒ ὓ +ὔ ὕ +ὖ ὗ ὠ ὡ @@ -678,41 +694,89 @@ ύ ὼ ώ -ᾀ -ᾁ -ᾂ -ᾃ -ᾄ -ᾅ -ᾆ -ᾇ -ᾐ -ᾑ -ᾒ -ᾓ -ᾔ -ᾕ -ᾖ -ᾗ -ᾠ -ᾡ -ᾢ -ᾣ -ᾤ -ᾥ -ᾦ -ᾧ +ᾀ +ᾁ +ᾂ +ᾃ +ᾄ +ᾅ +ᾆ +ᾇ +ᾈ +ᾉ +ᾊ +ᾋ +ᾌ +ᾍ +ᾎ +ᾏ +ᾐ +ᾑ +ᾒ +ᾓ +ᾔ +ᾕ +ᾖ +ᾗ +ᾘ +ᾙ +ᾚ +ᾛ +ᾜ +ᾝ +ᾞ +ᾟ +ᾠ +ᾡ +ᾢ +ᾣ +ᾤ +ᾥ +ᾦ +ᾧ +ᾨ +ᾩ +ᾪ +ᾫ +ᾬ +ᾭ +ᾮ +ᾯ ᾰ ᾱ -ᾳ +ᾲ +ᾳ +ᾴ +ᾶ +ᾷ +ᾼ ι -ῃ +ῂ +ῃ +ῄ +ῆ +ῇ +ῌ ῐ ῑ +ῒ +ΐ +ῖ +ῗ ῠ ῡ +ῢ +ΰ +ῤ ῥ -ῳ +ῦ +ῧ +ῲ +ῳ +ῴ +ῶ +ῷ +ῼ ⅎ ⅰ ⅱ @@ -993,6 +1057,18 @@ ꞥ ꞧ ꞩ +ff +fi +fl +ffi +ffl +ſt +st +ﬓ +ﬔ +ﬕ +ﬖ +ﬗ a b c @@ -1019,6 +1095,46 @@ x y z +𐐨 +𐐩 +𐐪 +𐐫 +𐐬 +𐐭 +𐐮 +𐐯 +𐐰 +𐐱 +𐐲 +𐐳 +𐐴 +𐐵 +𐐶 +𐐷 +𐐸 +𐐹 +𐐺 +𐐻 +𐐼 +𐐽 +𐐾 +𐐿 +𐑀 +𐑁 +𐑂 +𐑃 +𐑄 +𐑅 +𐑆 +𐑇 +𐑈 +𐑉 +𐑊 +𐑋 +𐑌 +𐑍 +𐑎 +𐑏

diff --git a/layout/reftests/text-transform/reftest.list b/layout/reftests/text-transform/reftest.list index e600a6f9989..6ef9d278bcd 100644 --- a/layout/reftests/text-transform/reftest.list +++ b/layout/reftests/text-transform/reftest.list @@ -9,9 +9,10 @@ == small-caps-1.html small-caps-1-ref.html == uppercase-1.html uppercase-ref.html == uppercase-szlig-1.html uppercase-szlig-ref.html -== all-upper.html all-upper-ref.html -== all-lower.html all-lower-ref.html -== all-title.html all-title-ref.html +# these use DejaVu Sans via @font-face for consistency of results +HTTP(..) == all-upper.html all-upper-ref.html +HTTP(..) == all-lower.html all-lower-ref.html +HTTP(..) == all-title.html all-title-ref.html == smtp-upper.html smtp-upper-ref.html == smtp-lower.html smtp-lower-ref.html == smtp-title.html smtp-title-ref.html From 9d15dfd22d0d57eba1994db2e13b4a215780f877 Mon Sep 17 00:00:00 2001 From: Tom Schuster Date: Tue, 24 Apr 2012 20:03:48 +0200 Subject: [PATCH 020/182] Bug 735036 - Check for OOM in debug only method. r=luke --- js/public/HashTable.h | 2 +- js/src/jsgc.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/js/public/HashTable.h b/js/public/HashTable.h index 259725f3a86..b801e91262f 100644 --- a/js/public/HashTable.h +++ b/js/public/HashTable.h @@ -384,7 +384,7 @@ class HashTable : private AllocPolicy mutationCount(0) {} - bool init(uint32_t length) + MOZ_WARN_UNUSED_RESULT bool init(uint32_t length) { /* Make sure that init isn't called twice. */ JS_ASSERT(table == NULL); diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp index cf248d826d8..4d955c02e51 100644 --- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -4193,7 +4193,8 @@ StartVerifyBarriers(JSRuntime *rt) trc->edgeptr = (char *)trc->root; trc->term = trc->edgeptr + size; - trc->nodemap.init(); + if (!trc->nodemap.init()) + return; /* Create the root node. */ trc->curnode = MakeNode(trc, NULL, JSGCTraceKind(0)); From 00a9f8fa6372a25975d5b43603691358bfc49032 Mon Sep 17 00:00:00 2001 From: Terrence Cole Date: Tue, 24 Apr 2012 11:25:20 -0700 Subject: [PATCH 021/182] Bug 748397 - Fix broken JSON when there is a ',' in LC_NUMERIC; r=billm --HG-- extra : rebase_source : 5e086466273671dbecacb7d877990250d428db6e --- js/src/gc/Statistics.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/js/src/gc/Statistics.cpp b/js/src/gc/Statistics.cpp index 383aae9a2c1..aec37177500 100644 --- a/js/src/gc/Statistics.cpp +++ b/js/src/gc/Statistics.cpp @@ -108,9 +108,16 @@ class StatisticsSerializer va_end(va); } + void appendDecimal(const char *name, const char *units, double d) { + if (asJSON_) + appendNumber(name, "%.1F", units, d); + else + appendNumber(name, "%.1f", units, d); + } + void appendIfNonzeroMS(const char *name, double v) { if (asJSON_ || v >= 0.1) - appendNumber(name, "%.1f", "ms", v); + appendDecimal(name, "ms", v); } void beginObject(const char *name) { @@ -327,13 +334,13 @@ Statistics::formatData(StatisticsSerializer &ss, uint64_t timestamp) ss.beginObject(NULL); if (ss.isJSON()) ss.appendNumber("Timestamp", "%llu", "", (unsigned long long)timestamp); - ss.appendNumber("Total Time", "%.1f", "ms", t(total)); + ss.appendDecimal("Total Time", "ms", t(total)); ss.appendNumber("Compartments Collected", "%d", "", collectedCount); ss.appendNumber("Total Compartments", "%d", "", compartmentCount); ss.appendNumber("MMU (20ms)", "%d", "%", int(mmu20 * 100)); ss.appendNumber("MMU (50ms)", "%d", "%", int(mmu50 * 100)); if (slices.length() > 1 || ss.isJSON()) - ss.appendNumber("Max Pause", "%.1f", "ms", t(longest)); + ss.appendDecimal("Max Pause", "ms", t(longest)); else ss.appendString("Reason", ExplainReason(slices[0].reason)); if (nonincrementalReason || ss.isJSON()) { @@ -358,9 +365,9 @@ Statistics::formatData(StatisticsSerializer &ss, uint64_t timestamp) ss.beginObject(NULL); ss.extra(" "); ss.appendNumber("Slice", "%d", "", i); - ss.appendNumber("Time", "%.1f", "ms", t(slices[i].end - slices[0].start)); + ss.appendDecimal("Time", "ms", t(slices[i].end - slices[0].start)); ss.extra(" ("); - ss.appendNumber("Pause", "%.1f", "", t(width)); + ss.appendDecimal("Pause", "", t(width)); ss.appendString("Reason", ExplainReason(slices[i].reason)); if (slices[i].resetReason) ss.appendString("Reset", slices[i].resetReason); From b426c475945b01f5d453d0a0c8c7f51a817af52d Mon Sep 17 00:00:00 2001 From: Margaret Leibovic Date: Tue, 24 Apr 2012 13:37:38 -0400 Subject: [PATCH 022/182] Bug 736008 - Show autocomplete suggestions on click instead of on focus. r=mfinkle --- mobile/android/chrome/content/browser.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index 15e8b5a71ee..b0950212d69 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -3104,6 +3104,7 @@ var FormAssistant = { // We need to use a capturing listener for focus events BrowserApp.deck.addEventListener("focus", this, true); + BrowserApp.deck.addEventListener("click", this, true); BrowserApp.deck.addEventListener("input", this, false); BrowserApp.deck.addEventListener("pageshow", this, false); }, @@ -3114,6 +3115,7 @@ var FormAssistant = { Services.obs.removeObserver(this, "invalidformsubmit"); BrowserApp.deck.removeEventListener("focus", this); + BrowserApp.deck.removeEventListener("click", this); BrowserApp.deck.removeEventListener("input", this); BrowserApp.deck.removeEventListener("pageshow", this); }, @@ -3159,12 +3161,19 @@ var FormAssistant = { case "focus": let currentElement = aEvent.target; + // Only show a validation message on focus. + this._showValidationMessage(currentElement); + break; + + case "click": + currentElement = aEvent.target; + // Prioritize a form validation message over autocomplete suggestions // when the element is first focused (a form validation message will // only be available if an invalid form was submitted) if (this._showValidationMessage(currentElement)) break; - this._showAutoCompleteSuggestions(currentElement) + this._showAutoCompleteSuggestions(currentElement); break; case "input": From ac62a1790e53d2b27f56fb5c4ab53cf8be70b505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hub=20Figui=C3=A8re?= Date: Tue, 24 Apr 2012 11:35:23 -0700 Subject: [PATCH 023/182] Bug 746358 - Implement new role for definition lists. r=tbsaunde --- accessible/public/nsIAccessibleRole.idl | 17 +++++++++- accessible/src/atk/nsRoleMap.h | 3 ++ accessible/src/base/Role.h | 17 +++++++++- accessible/src/base/nsAccessibilityService.h | 5 ++- accessible/src/html/nsHTMLTextAccessible.cpp | 6 ++++ accessible/src/html/nsHyperTextAccessible.cpp | 3 ++ accessible/src/mac/mozAccessible.mm | 32 ++++--------------- accessible/src/mac/nsRoleMap.h | 3 ++ accessible/src/msaa/nsRoleMap.h | 9 ++++++ accessible/tests/mochitest/role.js | 3 ++ .../tests/mochitest/role/test_general.html | 6 ++-- .../tests/mochitest/tree/test_list.html | 16 +++++----- .../chrome/accessibility/AccessFu.properties | 3 ++ 13 files changed, 84 insertions(+), 39 deletions(-) diff --git a/accessible/public/nsIAccessibleRole.idl b/accessible/public/nsIAccessibleRole.idl index d9b9b06c8f4..e7282d9ee49 100644 --- a/accessible/public/nsIAccessibleRole.idl +++ b/accessible/public/nsIAccessibleRole.idl @@ -797,10 +797,25 @@ interface nsIAccessibleRole : nsISupports */ const unsigned long ROLE_CHECK_RICH_OPTION = 125; + /** + * An HTML definition list
+ */ + const unsigned long ROLE_DEFINITION_LIST = 126; + + /** + * An HTML definition term
+ */ + const unsigned long ROLE_TERM = 127; + + /** + * An HTML definition
+ */ + const unsigned long ROLE_DEFINITION = 128; + /** * It's not role actually. This constant is important to help ensure * nsRoleMap's are synchronized. */ - const unsigned long ROLE_LAST_ENTRY = 126; + const unsigned long ROLE_LAST_ENTRY = 129; }; diff --git a/accessible/src/atk/nsRoleMap.h b/accessible/src/atk/nsRoleMap.h index dcdb9a89f81..0ba389aee3d 100644 --- a/accessible/src/atk/nsRoleMap.h +++ b/accessible/src/atk/nsRoleMap.h @@ -171,6 +171,9 @@ static const PRUint32 atkRoleMap[] = { ATK_ROLE_SECTION, // roles::NOTE 123 ATK_ROLE_PANEL, // roles::FIGURE 124 ATK_ROLE_CHECK_BOX, // roles::CHECK_RICH_OPTION 125 + ATK_ROLE_LIST, // roles::DEFINITION_LIST 126 + ATK_ROLE_LIST_ITEM, // roles::TERM 127 + ATK_ROLE_PARAGRAPH, // roles::DEFINITION 128 kROLE_ATK_LAST_ENTRY // roles::LAST_ENTRY }; diff --git a/accessible/src/base/Role.h b/accessible/src/base/Role.h index b8aae02eb99..4351a00746a 100644 --- a/accessible/src/base/Role.h +++ b/accessible/src/base/Role.h @@ -798,11 +798,26 @@ namespace roles { */ CHECK_RICH_OPTION = 125, + /** + * Represent a definition list (dl in HTML). + */ + DEFINITION_LIST = 126, + + /** + * Represent a term in a definition list (dt in HTML). + */ + TERM = 127, + + /** + * Represent a definition in a definition list (dd in HTML) + */ + DEFINITION = 128, + /** * It's not role actually. This constant is important to help ensure * nsRoleMap's are synchronized. */ - LAST_ENTRY = 126 + LAST_ENTRY = 129 }; } // namespace role typedef enum mozilla::a11y::roles::Role role; diff --git a/accessible/src/base/nsAccessibilityService.h b/accessible/src/base/nsAccessibilityService.h index 1c17cefbfb9..cdd7a8a9452 100644 --- a/accessible/src/base/nsAccessibilityService.h +++ b/accessible/src/base/nsAccessibilityService.h @@ -423,7 +423,10 @@ static const char kRoleNames[][20] = { "embedded object", //ROLE_EMBEDDED_OBJECT "note", //ROLE_NOTE "figure", //ROLE_FIGURE - "check rich option" //ROLE_CHECK_RICH_OPTION + "check rich option", //ROLE_CHECK_RICH_OPTION + "definitionlist", //ROLE_DEFINITION_LIST + "term", //ROLE_TERM + "definition" //ROLE_DEFINITION }; /** diff --git a/accessible/src/html/nsHTMLTextAccessible.cpp b/accessible/src/html/nsHTMLTextAccessible.cpp index d997253e0fc..7f0cbe8de85 100644 --- a/accessible/src/html/nsHTMLTextAccessible.cpp +++ b/accessible/src/html/nsHTMLTextAccessible.cpp @@ -259,6 +259,9 @@ nsHTMLLIAccessible::Shutdown() role nsHTMLLIAccessible::NativeRole() { + if (mContent->Tag() == nsGkAtoms::dt) + return roles::TERM; + return roles::LISTITEM; } @@ -410,6 +413,9 @@ NS_IMPL_ISUPPORTS_INHERITED0(nsHTMLListAccessible, nsHyperTextAccessible) role nsHTMLListAccessible::NativeRole() { + if (mContent->Tag() == nsGkAtoms::dl) + return roles::DEFINITION_LIST; + return roles::LIST; } diff --git a/accessible/src/html/nsHyperTextAccessible.cpp b/accessible/src/html/nsHyperTextAccessible.cpp index 1a30c43f9ba..2db31abead3 100644 --- a/accessible/src/html/nsHyperTextAccessible.cpp +++ b/accessible/src/html/nsHyperTextAccessible.cpp @@ -123,6 +123,9 @@ nsHyperTextAccessible::NativeRole() { nsIAtom *tag = mContent->Tag(); + if (tag == nsGkAtoms::dd) + return roles::DEFINITION; + if (tag == nsGkAtoms::form) return roles::FORM; diff --git a/accessible/src/mac/mozAccessible.mm b/accessible/src/mac/mozAccessible.mm index ccfbcb75caf..37d3ebc771a 100644 --- a/accessible/src/mac/mozAccessible.mm +++ b/accessible/src/mac/mozAccessible.mm @@ -467,36 +467,18 @@ GetNativeFromGeckoAccessible(nsIAccessible *anAccessible) - (NSString*)subrole { - if (!mGeckoAccessible) - return nil; - - nsIContent* content = mGeckoAccessible->GetContent(); - if (!content || !content->IsHTML()) - return nil; - - nsIAtom* tag = content->Tag(); - switch (mRole) { case roles::LIST: - if ((tag == nsGkAtoms::ul) || (tag == nsGkAtoms::ol)) - return NSAccessibilityContentListSubrole; + return NSAccessibilityContentListSubrole; - if (tag == nsGkAtoms::dl) - return NSAccessibilityDefinitionListSubrole; + case roles::DEFINITION_LIST: + return NSAccessibilityDefinitionListSubrole; - break; + case roles::TERM: + return @"AXTerm"; - case roles::LISTITEM: - if (tag == nsGkAtoms::dt) - return @"AXTerm"; - - break; - - case roles::PARAGRAPH: - if (tag == nsGkAtoms::dd) - return @"AXDefinition"; - - break; + case roles::DEFINITION: + return @"AXDefinition"; default: break; diff --git a/accessible/src/mac/nsRoleMap.h b/accessible/src/mac/nsRoleMap.h index c6783e94e75..7c86fbffce8 100644 --- a/accessible/src/mac/nsRoleMap.h +++ b/accessible/src/mac/nsRoleMap.h @@ -168,5 +168,8 @@ static const NSString* AXRoles [] = { NSAccessibilityGroupRole, // roles::NOTE 123 NSAccessibilityGroupRole, // roles::FIGURE 124 NSAccessibilityCheckBoxRole, // roles::CHECK_RICH_OPTION 125 + NSAccessibilityListRole, // roles::DEFINITION_LIST 126 + NSAccessibilityGroupRole, // roles::TERM 127 + NSAccessibilityGroupRole, // roles::DEFINITION 128 @"ROLE_LAST_ENTRY" // roles::LAST_ENTRY Bogus role that will never be shown (just marks the end of this array)! }; diff --git a/accessible/src/msaa/nsRoleMap.h b/accessible/src/msaa/nsRoleMap.h index d31de3fe76b..f6ee3b73785 100644 --- a/accessible/src/msaa/nsRoleMap.h +++ b/accessible/src/msaa/nsRoleMap.h @@ -452,6 +452,15 @@ static const WindowsRoleMapItem gWindowsRoleMap[] = { // roles::CHECK_RICH_OPTION { ROLE_SYSTEM_CHECKBUTTON, ROLE_SYSTEM_CHECKBUTTON }, + // roles::DEFINITION_LIST + { ROLE_SYSTEM_LIST, ROLE_SYSTEM_LIST }, + + // roles::TERM + { ROLE_SYSTEM_LISTITEM, ROLE_SYSTEM_LISTITEM }, + + // roles::DEFINITION + { USE_ROLE_STRING, IA2_ROLE_PARAGRAPH }, + // roles::LAST_ENTRY { ROLE_WINDOWS_LAST_ENTRY, ROLE_WINDOWS_LAST_ENTRY } }; diff --git a/accessible/tests/mochitest/role.js b/accessible/tests/mochitest/role.js index 0b2c1bd8a09..bf6f7e99b0e 100644 --- a/accessible/tests/mochitest/role.js +++ b/accessible/tests/mochitest/role.js @@ -16,6 +16,8 @@ const ROLE_COMBOBOX = nsIAccessibleRole.ROLE_COMBOBOX; const ROLE_COMBOBOX_LIST = nsIAccessibleRole.ROLE_COMBOBOX_LIST; const ROLE_COMBOBOX_OPTION = nsIAccessibleRole.ROLE_COMBOBOX_OPTION; const ROLE_COLUMNHEADER = nsIAccessibleRole.ROLE_COLUMNHEADER; +const ROLE_DEFINITION = nsIAccessibleRole.ROLE_DEFINITION; +const ROLE_DEFINITION_LIST = nsIAccessibleRole.ROLE_DEFINITION_LIST; const ROLE_DIALOG = nsIAccessibleRole.ROLE_DIALOG; const ROLE_DOCUMENT = nsIAccessibleRole.ROLE_DOCUMENT; const ROLE_EMBEDDED_OBJECT = nsIAccessibleRole.ROLE_EMBEDDED_OBJECT; @@ -62,6 +64,7 @@ const ROLE_SEPARATOR = nsIAccessibleRole.ROLE_SEPARATOR; const ROLE_SLIDER = nsIAccessibleRole.ROLE_SLIDER; const ROLE_STATICTEXT = nsIAccessibleRole.ROLE_STATICTEXT; const ROLE_TABLE = nsIAccessibleRole.ROLE_TABLE; +const ROLE_TERM = nsIAccessibleRole.ROLE_TERM; const ROLE_TEXT_CONTAINER = nsIAccessibleRole.ROLE_TEXT_CONTAINER; const ROLE_TEXT_LEAF = nsIAccessibleRole.ROLE_TEXT_LEAF; const ROLE_TOGGLE_BUTTON = nsIAccessibleRole.ROLE_TOGGLE_BUTTON; diff --git a/accessible/tests/mochitest/role/test_general.html b/accessible/tests/mochitest/role/test_general.html index daf085683be..22f1402fbed 100644 --- a/accessible/tests/mochitest/role/test_general.html +++ b/accessible/tests/mochitest/role/test_general.html @@ -53,9 +53,9 @@ testRole("p", ROLE_PARAGRAPH); // Test dl, dt, dd - testRole("definitionlist", ROLE_LIST); - testRole("definitionterm", ROLE_LISTITEM); - testRole("definitiondescription", ROLE_PARAGRAPH); + testRole("definitionlist", ROLE_DEFINITION_LIST); + testRole("definitionterm", ROLE_TERM); + testRole("definitiondescription", ROLE_DEFINITION); // Has click, mousedown or mouseup listeners. testRole("span1", ROLE_TEXT_CONTAINER); diff --git a/accessible/tests/mochitest/tree/test_list.html b/accessible/tests/mochitest/tree/test_list.html index 17e58cf6533..6c29b9c75f5 100644 --- a/accessible/tests/mochitest/tree/test_list.html +++ b/accessible/tests/mochitest/tree/test_list.html @@ -88,17 +88,17 @@ // dl list var tree = - { LIST: [ // dl - { LISTITEM: [ // dt + { DEFINITION_LIST: [ // dl + { TERM: [ // dt { TEXT_LEAF: [] }, ] }, - { PARAGRAPH: [ // dd + { DEFINITION: [ // dd { TEXT_LEAF: [] } ] }, - { LISTITEM: [ // dt + { TERM: [ // dt { TEXT_LEAF: [] } ] }, - { PARAGRAPH: [ // dd + { DEFINITION: [ // dd { TEXT_LEAF: [] } ] } ] }; @@ -110,11 +110,11 @@ { LIST: [ // ol { LISTITEM: [ // li { STATICTEXT: [ ] }, - { LIST: [ // dl - { LISTITEM: [ // dt + { DEFINITION_LIST: [ // dl + { TERM: [ // dt { TEXT_LEAF: [] } ] }, - { PARAGRAPH: [ // dd + { DEFINITION: [ // dd { TEXT_LEAF: [] } ] } ] } diff --git a/dom/locales/en-US/chrome/accessibility/AccessFu.properties b/dom/locales/en-US/chrome/accessibility/AccessFu.properties index bf7224fb9cb..050e3c4ca38 100644 --- a/dom/locales/en-US/chrome/accessibility/AccessFu.properties +++ b/dom/locales/en-US/chrome/accessibility/AccessFu.properties @@ -65,6 +65,9 @@ flatequation = flat equation gridcell = gridcell note = note figure = figure +definitionlist = definition list +term = term +definition = definition # More sophisiticated object descriptions headingLevel = heading level %S From 5e2e41371d2199b3da8869b3075795f76ba7f961 Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Tue, 24 Apr 2012 11:50:37 -0700 Subject: [PATCH 024/182] Bug 747065 - Precondition failed on clients PUT. r=nalexander, a=blocking-fennec --- .../android/base/sync/SyncConfiguration.java | 20 +++++- mobile/android/base/sync/Utils.java | 7 +- .../sync/net/SyncStorageRecordRequest.java | 71 ++++++++----------- .../base/sync/net/SyncStorageResponse.java | 44 ++---------- .../repositories/domain/ClientRecord.java | 10 +++ .../sync/stage/SyncClientsEngineStage.java | 39 +++++----- 6 files changed, 91 insertions(+), 100 deletions(-) diff --git a/mobile/android/base/sync/SyncConfiguration.java b/mobile/android/base/sync/SyncConfiguration.java index 27edeb19f70..6fd73e8b216 100644 --- a/mobile/android/base/sync/SyncConfiguration.java +++ b/mobile/android/base/sync/SyncConfiguration.java @@ -191,7 +191,9 @@ public class SyncConfiguration implements CredentialsSource { public String prefsPath; public PrefsSource prefsSource; - public static final String CLIENT_RECORD_TIMESTAMP = "serverClientRecordTimestamp"; + public static final String CLIENTS_COLLECTION_TIMESTAMP = "serverClientsTimestamp"; // When the collection was touched. + public static final String CLIENT_RECORD_TIMESTAMP = "serverClientRecordTimestamp"; // When our record was touched. + public static final String PREF_CLUSTER_URL = "clusterURL"; public static final String PREF_SYNC_ID = "syncID"; @@ -298,6 +300,10 @@ public class SyncConfiguration implements CredentialsSource { (trailingSlash ? "/storage/" : "/storage"); } + public URI collectionURI(String collection) throws URISyntaxException { + return new URI(storageURL(true) + collection); + } + public URI collectionURI(String collection, boolean full) throws URISyntaxException { // Do it this way to make it easier to add more params later. // It's pretty ugly, I'll grant. @@ -371,6 +377,10 @@ public class SyncConfiguration implements CredentialsSource { return this.getPrefs().edit(); } + /** + * We persist two different clients timestamps: our own record's, + * and the timestamp for the collection. + */ public void persistServerClientRecordTimestamp(long timestamp) { getEditor().putLong(SyncConfiguration.CLIENT_RECORD_TIMESTAMP, timestamp).commit(); } @@ -379,6 +389,14 @@ public class SyncConfiguration implements CredentialsSource { return getPrefs().getLong(SyncConfiguration.CLIENT_RECORD_TIMESTAMP, 0); } + public void persistServerClientsTimestamp(long timestamp) { + getEditor().putLong(SyncConfiguration.CLIENTS_COLLECTION_TIMESTAMP, timestamp).commit(); + } + + public long getPersistedServerClientsTimestamp() { + return getPrefs().getLong(SyncConfiguration.CLIENTS_COLLECTION_TIMESTAMP, 0); + } + public void purgeCryptoKeys() { if (collectionKeys != null) { collectionKeys.clear(); diff --git a/mobile/android/base/sync/Utils.java b/mobile/android/base/sync/Utils.java index c1fd3142d5b..e5d89a209fd 100644 --- a/mobile/android/base/sync/Utils.java +++ b/mobile/android/base/sync/Utils.java @@ -180,7 +180,12 @@ public class Utils { } public static String millisecondsToDecimalSecondsString(long ms) { - return new BigDecimal(ms).movePointLeft(3).toString(); + return millisecondsToDecimalSeconds(ms).toString(); + } + + // For dumping into JSON without quotes. + public static BigDecimal millisecondsToDecimalSeconds(long ms) { + return new BigDecimal(ms).movePointLeft(3); } // This lives until Bug 708956 lands, and we don't have to do it any more. diff --git a/mobile/android/base/sync/net/SyncStorageRecordRequest.java b/mobile/android/base/sync/net/SyncStorageRecordRequest.java index 5987ee46aaf..f8426ce6d06 100644 --- a/mobile/android/base/sync/net/SyncStorageRecordRequest.java +++ b/mobile/android/base/sync/net/SyncStorageRecordRequest.java @@ -1,39 +1,6 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Android Sync Client. - * - * The Initial Developer of the Original Code is - * the Mozilla Foundation. - * Portions created by the Initial Developer are Copyright (C) 2011 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Richard Newman - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.gecko.sync.net; @@ -41,10 +8,12 @@ import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; +import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.mozilla.gecko.sync.CryptoRecord; import org.mozilla.gecko.sync.ThreadPool; +import ch.boye.httpclientandroidlib.HttpEntity; import ch.boye.httpclientandroidlib.entity.StringEntity; /** @@ -88,20 +57,36 @@ public class SyncStorageRecordRequest extends SyncStorageRequest { return new SyncStorageRecordResourceDelegate(request); } - /** - * Helper for turning a JSON object into a payload. - * @throws UnsupportedEncodingException - */ - protected StringEntity jsonEntity(JSONObject body) throws UnsupportedEncodingException { - StringEntity e = new StringEntity(body.toJSONString(), "UTF-8"); + protected static StringEntity stringEntity(String s) throws UnsupportedEncodingException { + StringEntity e = new StringEntity(s, "UTF-8"); e.setContentType("application/json"); return e; } + /** + * Helper for turning a JSON object into a payload. + * @throws UnsupportedEncodingException + */ + protected static StringEntity jsonEntity(JSONObject body) throws UnsupportedEncodingException { + return stringEntity(body.toJSONString()); + } + + /** + * Helper for turning a JSON array into a payload. + * @throws UnsupportedEncodingException + */ + protected static HttpEntity jsonEntity(JSONArray toPOST) throws UnsupportedEncodingException { + return stringEntity(toPOST.toJSONString()); + } + + @SuppressWarnings("unchecked") public void post(JSONObject body) { // Let's do this the trivial way for now. + // Note that POSTs should be an array, so we wrap here. + final JSONArray toPOST = new JSONArray(); + toPOST.add(body); try { - this.resource.post(jsonEntity(body)); + this.resource.post(jsonEntity(toPOST)); } catch (UnsupportedEncodingException e) { this.delegate.handleRequestError(e); } diff --git a/mobile/android/base/sync/net/SyncStorageResponse.java b/mobile/android/base/sync/net/SyncStorageResponse.java index de96147864f..354b34d997c 100644 --- a/mobile/android/base/sync/net/SyncStorageResponse.java +++ b/mobile/android/base/sync/net/SyncStorageResponse.java @@ -1,47 +1,13 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Android Sync Client. - * - * The Initial Developer of the Original Code is - * the Mozilla Foundation. - * Portions created by the Initial Developer are Copyright (C) 2011 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Richard Newman - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.gecko.sync.net; - import java.io.IOException; import java.util.HashMap; -import android.util.Log; +import org.mozilla.gecko.sync.Logger; import ch.boye.httpclientandroidlib.HttpResponse; @@ -81,7 +47,7 @@ public class SyncStorageResponse extends SyncResponse { SERVER_ERROR_MESSAGES = errors; } public static String getServerErrorMessage(String body) { - Log.d(LOG_TAG, "Looking up message for body \"" + body + "\""); + Logger.debug(LOG_TAG, "Looking up message for body \"" + body + "\""); if (SERVER_ERROR_MESSAGES.containsKey(body)) { return SERVER_ERROR_MESSAGES.get(body); } diff --git a/mobile/android/base/sync/repositories/domain/ClientRecord.java b/mobile/android/base/sync/repositories/domain/ClientRecord.java index 931d6c5b617..3f61801562e 100644 --- a/mobile/android/base/sync/repositories/domain/ClientRecord.java +++ b/mobile/android/base/sync/repositories/domain/ClientRecord.java @@ -64,11 +64,21 @@ public class ClientRecord extends Record { putPayload(payload, "type", this.type); } + @Override public boolean equals(Object o) { if (!(o instanceof ClientRecord) || !super.equals(o)) { return false; } + return this.equalPayloads(o); + } + + @Override + public boolean equalPayloads(Object o) { + if (!(o instanceof ClientRecord) || !super.equalPayloads(o)) { + return false; + } + ClientRecord other = (ClientRecord) o; if (!RepoUtils.stringsEqual(other.name, this.name) || !RepoUtils.stringsEqual(other.type, this.type)) { diff --git a/mobile/android/base/sync/stage/SyncClientsEngineStage.java b/mobile/android/base/sync/stage/SyncClientsEngineStage.java index b61a28c2655..fb9b5db783b 100644 --- a/mobile/android/base/sync/stage/SyncClientsEngineStage.java +++ b/mobile/android/base/sync/stage/SyncClientsEngineStage.java @@ -109,7 +109,11 @@ public class SyncClientsEngineStage implements GlobalSyncStage { @Override public void handleRequestSuccess(SyncStorageResponse response) { - BaseResource.consumeEntity(response); // We don't need the response at all. + + // Hang onto the server's last modified timestamp to use + // in X-If-Unmodified-Since for upload. + session.config.persistServerClientsTimestamp(response.normalizedWeaveTimestamp()); + BaseResource.consumeEntity(response); // If we successfully downloaded all records but ours was not one of them // then reset the timestamp. @@ -170,13 +174,9 @@ public class SyncClientsEngineStage implements GlobalSyncStage { r = (ClientRecord) factory.createRecord(record.decrypt()); if (clientsDelegate.isLocalGUID(r.guid)) { Logger.info(LOG_TAG, "Local client GUID exists on server and was downloaded"); - localAccountGUIDDownloaded = true; - // Oh hey! Our record is on the server. This is the authoritative - // server timestamp, so let's hang on to it to decide whether we - // need to upload. - session.config.persistServerClientRecordTimestamp(r.lastModified); - // Process commands. + localAccountGUIDDownloaded = true; + session.config.persistServerClientRecordTimestamp(r.lastModified); processCommands(r.commands); } RepoUtils.logClient(r); @@ -208,7 +208,8 @@ public class SyncClientsEngineStage implements GlobalSyncStage { @Override public String ifUnmodifiedSince() { - Long timestampInMilliseconds = session.config.getPersistedServerClientRecordTimestamp(); + // Use the timestamp for the whole collection per Sync storage 1.1 spec. + Long timestampInMilliseconds = session.config.getPersistedServerClientsTimestamp(); // It's the first upload so we don't care about X-If-Unmodified-Since. if (timestampInMilliseconds == 0) { @@ -225,12 +226,14 @@ public class SyncClientsEngineStage implements GlobalSyncStage { commandsProcessedShouldUpload = false; uploadAttemptsCount.set(0); - long timestamp = Utils.decimalSecondsToMilliseconds(response.body()); + // Persist the timestamp for the record we just uploaded, + // and bump the collection timestamp, too. + long timestamp = response.normalizedWeaveTimestamp(); session.config.persistServerClientRecordTimestamp(timestamp); + session.config.persistServerClientsTimestamp(timestamp); BaseResource.consumeEntity(response); - Logger.debug(LOG_TAG, "Timestamp from body is: " + timestamp); - Logger.debug(LOG_TAG, "Timestamp from header is: " + response.normalizedWeaveTimestamp()); + Logger.debug(LOG_TAG, "Timestamp is " + timestamp); } catch (Exception e) { session.abort(e, "Unable to fetch timestamp."); return; @@ -289,7 +292,9 @@ public class SyncClientsEngineStage implements GlobalSyncStage { @Override public void resetLocal() { // Clear timestamps and local data. - session.config.persistServerClientRecordTimestamp(0L); + session.config.persistServerClientRecordTimestamp(0L); // TODO: roll these into one. + session.config.persistServerClientsTimestamp(0L); + session.getClientsDelegate().setClientsCount(0); try { getClientsDatabaseAccessor().wipe(); @@ -391,14 +396,16 @@ public class SyncClientsEngineStage implements GlobalSyncStage { } } + /** + * Upload a client record via HTTP POST to the parent collection. + */ protected void uploadClientRecord(CryptoRecord record) { Logger.debug(LOG_TAG, "Uploading client record " + record.guid); try { - URI putURI = session.config.wboURI(COLLECTION_NAME, record.guid); - - SyncStorageRecordRequest request = new SyncStorageRecordRequest(putURI); + URI postURI = session.config.collectionURI(COLLECTION_NAME); + SyncStorageRecordRequest request = new SyncStorageRecordRequest(postURI); request.delegate = clientUploadDelegate; - request.put(record); + request.post(record); } catch (URISyntaxException e) { session.abort(e, "Invalid URI."); } From b9a7468478f05d978403bb2eba8c545cf2da6427 Mon Sep 17 00:00:00 2001 From: Timothy Nikkel Date: Tue, 24 Apr 2012 13:52:35 -0500 Subject: [PATCH 025/182] Bug 732016 Allow override of the scroll port size used for clamping scroll positions. r=roc --- dom/base/nsDOMWindowUtils.cpp | 23 +++++++++++++++++++++ dom/interfaces/base/nsIDOMWindowUtils.idl | 10 ++++++++- layout/base/nsIPresShell.h | 13 ++++++++++++ layout/base/nsPresShell.cpp | 9 ++++++++ layout/generic/nsGfxScrollFrame.cpp | 25 +++++++++++++++++++---- layout/generic/nsGfxScrollFrame.h | 5 +++++ 6 files changed, 80 insertions(+), 5 deletions(-) diff --git a/dom/base/nsDOMWindowUtils.cpp b/dom/base/nsDOMWindowUtils.cpp index 05e34c69f6e..08f94bb3395 100644 --- a/dom/base/nsDOMWindowUtils.cpp +++ b/dom/base/nsDOMWindowUtils.cpp @@ -2317,3 +2317,26 @@ nsDOMWindowUtils::GetPlugins(JSContext* cx, jsval* aPlugins) *aPlugins = OBJECT_TO_JSVAL(jsPlugins); return NS_OK; } + +NS_IMETHODIMP +nsDOMWindowUtils::SetScrollPositionClampingScrollPortSize(float aWidth, float aHeight) +{ + if (!IsUniversalXPConnectCapable()) { + return NS_ERROR_DOM_SECURITY_ERR; + } + + if (!(aWidth >= 0.0 && aHeight >= 0.0)) { + return NS_ERROR_ILLEGAL_VALUE; + } + + nsIPresShell* presShell = GetPresShell(); + if (!presShell) { + return NS_ERROR_FAILURE; + } + + presShell->SetScrollPositionClampingScrollPortSize( + nsPresContext::CSSPixelsToAppUnits(aWidth), + nsPresContext::CSSPixelsToAppUnits(aHeight)); + + return NS_OK; +} diff --git a/dom/interfaces/base/nsIDOMWindowUtils.idl b/dom/interfaces/base/nsIDOMWindowUtils.idl index a86f14081ae..f88eee4e447 100644 --- a/dom/interfaces/base/nsIDOMWindowUtils.idl +++ b/dom/interfaces/base/nsIDOMWindowUtils.idl @@ -70,7 +70,7 @@ interface nsIDOMFile; interface nsIFile; interface nsIDOMTouch; -[scriptable, uuid(c7f303a1-4f7b-4d38-a192-c3f0e25dadb1)] +[scriptable, uuid(66a68858-df38-40e1-a792-fda04ebcc084)] interface nsIDOMWindowUtils : nsISupports { /** @@ -1110,4 +1110,12 @@ interface nsIDOMWindowUtils : nsISupports { */ [implicit_jscontext] readonly attribute jsval plugins; + + /** + * Set the scrollport size for the purposes of clamping scroll positions for + * the root scroll frame of this document to be (aWidth,aHeight) in CSS pixels. + * + * The caller of this method must have UniversalXPConnect privileges. + */ + void setScrollPositionClampingScrollPortSize(in float aWidth, in float aHeight); }; diff --git a/layout/base/nsIPresShell.h b/layout/base/nsIPresShell.h index 2e4b4119cbf..512e77d974e 100644 --- a/layout/base/nsIPresShell.h +++ b/layout/base/nsIPresShell.h @@ -1265,6 +1265,15 @@ public: // clears that capture. static void ClearMouseCapture(nsIFrame* aFrame); + void SetScrollPositionClampingScrollPortSize(nscoord aWidth, nscoord aHeight); + bool IsScrollPositionClampingScrollPortSizeSet() { + return mScrollPositionClampingScrollPortSizeSet; + } + nsSize GetScrollPositionClampingScrollPortSize() { + NS_ASSERTION(mScrollPositionClampingScrollPortSizeSet, "asking for scroll port when its not set?"); + return mScrollPositionClampingScrollPortSize; + } + protected: friend class nsRefreshDriver; @@ -1315,6 +1324,8 @@ protected: bool mSuppressInterruptibleReflows; + bool mScrollPositionClampingScrollPortSizeSet; + // A list of weak frames. This is a pointer to the last item in the list. nsWeakFrame* mWeakFrames; @@ -1333,6 +1344,8 @@ protected: float mXResolution; float mYResolution; + nsSize mScrollPositionClampingScrollPortSize; + static nsIContent* gKeyDownTarget; }; diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index edd4e6bd7b3..5f8c6a159ab 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -831,6 +831,8 @@ PresShell::PresShell() mYResolution = 1.0; mViewportOverridden = false; + mScrollPositionClampingScrollPortSizeSet = false; + static bool addedSynthMouseMove = false; if (!addedSynthMouseMove) { Preferences::AddBoolVarCache(&sSynthMouseMove, @@ -9147,3 +9149,10 @@ PresShell::SizeOfTextRuns(nsMallocSizeOfFun aMallocSizeOf) const /* clear = */false); } +void +nsIPresShell::SetScrollPositionClampingScrollPortSize(nscoord aWidth, nscoord aHeight) +{ + mScrollPositionClampingScrollPortSizeSet = true; + mScrollPositionClampingScrollPortSize.width = aWidth; + mScrollPositionClampingScrollPortSize.height = aHeight; +} diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp index 7c8de465176..c9241352870 100644 --- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -1645,7 +1645,7 @@ Clamp(nscoord aLower, nscoord aVal, nscoord aUpper) nsPoint nsGfxScrollFrameInner::ClampScrollPosition(const nsPoint& aPt) const { - nsRect range = GetScrollRange(); + nsRect range = GetScrollRangeForClamping(); return nsPoint(Clamp(range.x, aPt.x, range.XMost()), Clamp(range.y, aPt.y, range.YMost())); } @@ -1971,7 +1971,7 @@ nsGfxScrollFrameInner::RestrictToDevPixels(const nsPoint& aPt, // pixels. But we also need to make sure that our position remains // inside the allowed region. if (aShouldClamp) { - nsRect scrollRange = GetScrollRange(); + nsRect scrollRange = GetScrollRangeForClamping(); *aPtDevPx = nsIntPoint(ClampInt(scrollRange.x, aPt.x, scrollRange.XMost(), appUnitsPerDevPixel), ClampInt(scrollRange.y, aPt.y, scrollRange.YMost(), appUnitsPerDevPixel)); } else { @@ -2326,10 +2326,16 @@ AlignToDevPixelRoundingToZero(nscoord aVal, PRInt32 aAppUnitsPerDevPixel) nsRect nsGfxScrollFrameInner::GetScrollRange() const +{ + return GetScrollRange(mScrollPort.width, mScrollPort.height); +} + +nsRect +nsGfxScrollFrameInner::GetScrollRange(nscoord aWidth, nscoord aHeight) const { nsRect range = GetScrolledRect(); - range.width -= mScrollPort.width; - range.height -= mScrollPort.height; + range.width -= aWidth; + range.height -= aHeight; nsPresContext* presContext = mOuter->PresContext(); PRInt32 appUnitsPerDevPixel = presContext->AppUnitsPerDevPixel(); @@ -2342,6 +2348,17 @@ nsGfxScrollFrameInner::GetScrollRange() const return range; } +nsRect +nsGfxScrollFrameInner::GetScrollRangeForClamping() const +{ + nsIPresShell* presShell = mOuter->PresContext()->PresShell(); + if (mIsRoot && presShell->IsScrollPositionClampingScrollPortSizeSet()) { + nsSize size = presShell->GetScrollPositionClampingScrollPortSize(); + return GetScrollRange(size.width, size.height); + } + return GetScrollRange(); +} + static void AdjustForWholeDelta(PRInt32 aDelta, nscoord* aCoord) { diff --git a/layout/generic/nsGfxScrollFrame.h b/layout/generic/nsGfxScrollFrame.h index 28b73bca44a..c0f679f6c95 100644 --- a/layout/generic/nsGfxScrollFrame.h +++ b/layout/generic/nsGfxScrollFrame.h @@ -178,7 +178,12 @@ public: return pt; } nsRect GetScrollRange() const; + // Get the scroll range assuming the scrollport has size (aWidth, aHeight). + nsRect GetScrollRange(nscoord aWidth, nscoord aHeight) const; +protected: + nsRect GetScrollRangeForClamping() const; +public: nsPoint RestrictToDevPixels(const nsPoint& aPt, nsIntPoint* aPtDevPx, bool aShouldClamp) const; nsPoint ClampScrollPosition(const nsPoint& aPt) const; static void AsyncScrollCallback(nsITimer *aTimer, void* anInstance); From 89e412b9841d7e2f811b5f38fccf08aa7204df71 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Tue, 24 Apr 2012 13:52:37 -0500 Subject: [PATCH 026/182] Bug 732016 - Re-enable scroll clamping but set the desired scrollport using the new scrollport API. r=Cwiiis --- mobile/android/chrome/content/browser.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index b0950212d69..ad2ab2d60c2 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -1560,7 +1560,6 @@ Tab.prototype = { let frameLoader = this.browser.QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader; frameLoader.renderMode = Ci.nsIFrameLoader.RENDER_MODE_ASYNC_SCROLL; - frameLoader.clampScrollPosition = false; // only set tab uri if uri is valid let uri = null; @@ -1852,6 +1851,8 @@ Tab.prototype = { // Set scroll position let win = this.browser.contentWindow; + win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils).setScrollPositionClampingScrollPortSize( + gScreenWidth / aViewport.zoom, gScreenHeight / aViewport.zoom); win.scrollTo(x, y); this.userScrollPos.x = win.scrollX; this.userScrollPos.y = win.scrollY; From 13bcb1b233ad697e5abef9acb7da1ee9015bace0 Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Tue, 24 Apr 2012 12:09:15 -0700 Subject: [PATCH 027/182] Bug 748475 - Bump User-Agent version for trunk. r=trivial, a=blocking-fennec --- mobile/android/base/sync/GlobalConstants.java.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/android/base/sync/GlobalConstants.java.in b/mobile/android/base/sync/GlobalConstants.java.in index 464705d719d..17867512dbf 100644 --- a/mobile/android/base/sync/GlobalConstants.java.in +++ b/mobile/android/base/sync/GlobalConstants.java.in @@ -10,7 +10,7 @@ package org.mozilla.gecko.sync; */ public class GlobalConstants { public static final String PRODUCT_NAME = "@MOZ_APP_DISPLAYNAME@"; - public static final String SYNC_VERSION_STRING = "0.6"; + public static final String SYNC_VERSION_STRING = "0.8"; public static final String USER_AGENT = "Firefox AndroidSync " + SYNC_VERSION_STRING + " (" + PRODUCT_NAME + ")"; From 4963a1fea80838683169aca912f9d9595d46734d Mon Sep 17 00:00:00 2001 From: Patrick McManus Date: Tue, 24 Apr 2012 15:12:06 -0400 Subject: [PATCH 028/182] bug 746731 - nsHttpConnection::mIdleTimeout initialization fixes r=honzab --- netwerk/protocol/http/nsHttpConnection.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netwerk/protocol/http/nsHttpConnection.cpp b/netwerk/protocol/http/nsHttpConnection.cpp index c3e4203e2d7..0fe8ef6dedb 100644 --- a/netwerk/protocol/http/nsHttpConnection.cpp +++ b/netwerk/protocol/http/nsHttpConnection.cpp @@ -73,6 +73,7 @@ using namespace mozilla::net; nsHttpConnection::nsHttpConnection() : mTransaction(nsnull) + , mIdleTimeout(0) , mConsiderReusedAfterInterval(0) , mConsiderReusedAfterEpoch(0) , mCurrentBytesRead(0) @@ -821,7 +822,7 @@ nsHttpConnection::OnHeadersAvailable(nsAHttpTransaction *trans, if (cp) mIdleTimeout = PR_SecondsToInterval((PRUint32) atoi(cp + 8)); else - mIdleTimeout = gHttpHandler->SpdyTimeout(); + mIdleTimeout = gHttpHandler->IdleTimeout(); cp = PL_strcasestr(val, "max="); if (cp) { From 142a463d8e3a76f7ab38de5ed8e3f61e2d1743e7 Mon Sep 17 00:00:00 2001 From: Brad Lassey Date: Tue, 24 Apr 2012 15:13:36 -0400 Subject: [PATCH 029/182] bug 746016 - Cache low res version of the page in the java ui for use instead of checkerboarding r=kats --HG-- extra : rebase_source : d6de0327a46393cd4cfc327dea5689364744a71d --- embedding/android/GeckoAppShell.java | 10 +- mobile/android/app/mobile.js | 2 +- mobile/android/base/GeckoApp.java | 10 +- mobile/android/base/GeckoAppShell.java | 108 +++++++- mobile/android/base/GeckoEvent.java | 20 +- mobile/android/base/Makefile.in | 1 + mobile/android/base/gfx/GeckoLayerClient.java | 3 + mobile/android/base/gfx/IntSize.java | 4 + mobile/android/base/gfx/LayerRenderer.java | 50 +++- mobile/android/base/gfx/LayerView.java | 2 +- .../android/base/gfx/NinePatchTileLayer.java | 2 +- mobile/android/base/gfx/ScreenshotLayer.java | 254 ++++++++++++++++++ mobile/android/base/gfx/ScrollbarLayer.java | 2 +- mobile/android/base/gfx/SingleTileLayer.java | 8 +- mobile/android/base/gfx/TileLayer.java | 13 +- widget/android/AndroidBridge.cpp | 16 +- widget/android/AndroidBridge.h | 5 +- widget/android/AndroidJavaWrappers.cpp | 8 +- widget/android/AndroidJavaWrappers.h | 1 + widget/android/nsAppShell.cpp | 83 +++++- 20 files changed, 559 insertions(+), 43 deletions(-) create mode 100644 mobile/android/base/gfx/ScreenshotLayer.java diff --git a/embedding/android/GeckoAppShell.java b/embedding/android/GeckoAppShell.java index be482e47052..e9ade7ef012 100644 --- a/embedding/android/GeckoAppShell.java +++ b/embedding/android/GeckoAppShell.java @@ -603,9 +603,13 @@ public class GeckoAppShell imm, text, start, end, newEnd); } - public static void notifyScreenShot(ByteBuffer data, int tabId, int width, int height) { - // this stub is never called in XUL Fennec, but we need it so that the JNI code - // shared between XUL and Native Fennec doesn't die. + // these 2 stubs are never called in XUL Fennec, but we need them so that + // the JNI code shared between XUL and Native Fennec doesn't die. + public static void notifyScreenShot(final ByteBuffer data, final int tabId, final int x, final int y, + final int width, final int height, final int token) { + } + + public static void notifyPaintedRect(float top, float left, float bottom, float right) { } private static CountDownLatch sGeckoPendingAcks = null; diff --git a/mobile/android/app/mobile.js b/mobile/android/app/mobile.js index 8984d204624..90a542169f2 100644 --- a/mobile/android/app/mobile.js +++ b/mobile/android/app/mobile.js @@ -728,7 +728,7 @@ pref("direct-texture.force.enabled", false); pref("direct-texture.force.disabled", false); // show checkerboard pattern on android; we use background colour instead -pref("gfx.show_checkerboard_pattern", false); +pref("gfx.show_checkerboard_pattern", true); pref("remote-debugger.enabled", false); pref("remote-debugger.port", 6000); diff --git a/mobile/android/base/GeckoApp.java b/mobile/android/base/GeckoApp.java index 5379c601b85..d93a612602a 100644 --- a/mobile/android/base/GeckoApp.java +++ b/mobile/android/base/GeckoApp.java @@ -556,7 +556,7 @@ abstract public class GeckoApp int sh = tab.getMinScreenshotHeight(); int dw = tab.getThumbnailWidth(); int dh = tab.getThumbnailHeight(); - GeckoAppShell.sendEventToGecko(GeckoEvent.createScreenshotEvent(tab.getId(), sw, sh, dw, dh)); + GeckoAppShell.sendEventToGecko(GeckoEvent.createScreenshotEvent(tab.getId(), 0, 0, sw, sh, 0, 0, dw, dh, GeckoAppShell.SCREENSHOT_THUMBNAIL)); } } @@ -1193,7 +1193,8 @@ abstract public class GeckoApp tab.updateURL(uri); tab.setState(Tab.STATE_LOADING); tab.updateSecurityMode("unknown"); - + if (Tabs.getInstance().isSelectedTab(tab)) + getLayerController().getView().getRenderer().resetCheckerboard(); mMainHandler.post(new Runnable() { public void run() { if (Tabs.getInstance().isSelectedTab(tab)) { @@ -1223,6 +1224,11 @@ abstract public class GeckoApp GeckoAppShell.getHandler().postDelayed(new Runnable() { public void run() { getAndProcessThumbnailForTab(tab); + if (Tabs.getInstance().isSelectedTab(tab)) { + GeckoAppShell.sendEventToGecko(GeckoEvent.createStartPaintListentingEvent(tab.getId())); + GeckoAppShell.screenshotWholePage(tab); + } + } }, 500); } diff --git a/mobile/android/base/GeckoAppShell.java b/mobile/android/base/GeckoAppShell.java index cde7fd5c7b9..fff02ed8c92 100644 --- a/mobile/android/base/GeckoAppShell.java +++ b/mobile/android/base/GeckoAppShell.java @@ -39,9 +39,13 @@ package org.mozilla.gecko; import org.mozilla.gecko.gfx.BitmapUtils; +import org.mozilla.gecko.gfx.IntSize; import org.mozilla.gecko.gfx.GeckoLayerClient; +import org.mozilla.gecko.gfx.ImmutableViewportMetrics; import org.mozilla.gecko.gfx.LayerController; import org.mozilla.gecko.gfx.LayerView; +import org.mozilla.gecko.gfx.ScreenshotLayer; +import org.mozilla.gecko.FloatUtils; import java.io.*; import java.lang.reflect.*; @@ -110,6 +114,10 @@ public class GeckoAppShell public static final String SHORTCUT_TYPE_WEBAPP = "webapp"; public static final String SHORTCUT_TYPE_BOOKMARK = "bookmark"; + static public final int SCREENSHOT_THUMBNAIL = 0; + static public final int SCREENSHOT_WHOLE_PAGE = 1; + static public final int SCREENSHOT_UPDATE = 2; + static private File sCacheFile = null; static private int sFreeSpace = -1; static File sHomeDir = null; @@ -118,6 +126,9 @@ public class GeckoAppShell private static Boolean sNSSLibsLoaded = false; private static Boolean sLibsSetup = false; private static File sGREDir = null; + private static float sCheckerboardPageWidth, sCheckerboardPageHeight; + private static float sLastCheckerboardWidthRatio, sLastCheckerboardHeightRatio; + private static RepaintRunnable sRepaintRunnable = new RepaintRunnable(); private static Map> mEventListeners = new HashMap>(); @@ -525,8 +536,9 @@ public class GeckoAppShell mInputConnection.notifyIMEChange(text, start, end, newEnd); } - public static void notifyScreenShot(final ByteBuffer data, final int tabId, - final int width, final int height) { + // Called by AndroidBridge using JNI + public static void notifyScreenShot(final ByteBuffer data, final int tabId, final int x, final int y, + final int width, final int height, final int token) { getHandler().post(new Runnable() { public void run() { try { @@ -534,9 +546,28 @@ public class GeckoAppShell if (tab == null) return; + if (!Tabs.getInstance().isSelectedTab(tab) && SCREENSHOT_THUMBNAIL != token) + return; + Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); b.copyPixelsFromBuffer(data); - GeckoApp.mAppContext.processThumbnail(tab, b, null); + switch (token) { + case SCREENSHOT_WHOLE_PAGE: + GeckoApp.mAppContext.getLayerController() + .getView().getRenderer().setCheckerboardBitmap(b); + break; + case SCREENSHOT_UPDATE: + GeckoApp.mAppContext.getLayerController().getView().getRenderer(). + updateCheckerboardBitmap( + b, sLastCheckerboardWidthRatio * x, + sLastCheckerboardHeightRatio * y, + sLastCheckerboardWidthRatio * width, + sLastCheckerboardHeightRatio * height); + break; + case SCREENSHOT_THUMBNAIL: + GeckoApp.mAppContext.processThumbnail(tab, b, null); + break; + } } finally { freeDirectBuffer(data); } @@ -2114,4 +2145,75 @@ public class GeckoAppShell if (!GeckoApp.mAppContext.showFilePicker(aMimeType, new AsyncResultHandler(id))) GeckoAppShell.notifyFilePickerResult("", id); } + + static class RepaintRunnable implements Runnable { + private boolean mIsRepaintRunnablePosted = false; + private float mDirtyTop = Float.POSITIVE_INFINITY, mDirtyLeft = Float.POSITIVE_INFINITY; + private float mDirtyBottom = Float.NEGATIVE_INFINITY, mDirtyRight = Float.NEGATIVE_INFINITY; + + public void run() { + float top, left, bottom, right; + // synchronize so we don't try to accumulate more rects while painting the ones we have + synchronized(this) { + top = mDirtyTop; + left = mDirtyLeft; + right = mDirtyRight; + bottom = mDirtyBottom; + // reset these to infinity to start accumulating again + mDirtyTop = Float.POSITIVE_INFINITY; + mDirtyLeft = Float.POSITIVE_INFINITY; + mDirtyBottom = Float.NEGATIVE_INFINITY; + mDirtyRight = Float.NEGATIVE_INFINITY; + mIsRepaintRunnablePosted = false; + } + + Tab tab = Tabs.getInstance().getSelectedTab(); + ImmutableViewportMetrics viewport = GeckoApp.mAppContext.getLayerController().getViewportMetrics(); + if (FloatUtils.fuzzyEquals(sCheckerboardPageWidth, viewport.pageSizeWidth) && + FloatUtils.fuzzyEquals(sCheckerboardPageHeight, viewport.pageSizeHeight)) { + float width = right - left; + float height = bottom - top; + GeckoAppShell.sendEventToGecko(GeckoEvent.createScreenshotEvent(tab.getId(), (int)top, (int)left, (int)width, (int)height, 0, 0, (int)(sLastCheckerboardWidthRatio * width), (int)(sLastCheckerboardHeightRatio * height), GeckoAppShell.SCREENSHOT_UPDATE)); + } else { + GeckoAppShell.screenshotWholePage(tab); + } + } + + void addRectToRepaint(float top, float left, float bottom, float right) { + synchronized(this) { + mDirtyTop = Math.min(top, mDirtyTop); + mDirtyLeft = Math.min(left, mDirtyLeft); + mDirtyBottom = Math.max(bottom, mDirtyBottom); + mDirtyRight = Math.max(right, mDirtyRight); + if (!mIsRepaintRunnablePosted) { + getHandler().postDelayed(this, 5000); + mIsRepaintRunnablePosted = true; + } + } + } + } + + // Called by AndroidBridge using JNI + public static void notifyPaintedRect(float top, float left, float bottom, float right) { + sRepaintRunnable.addRectToRepaint(top, left, bottom, right); + } + + public static void screenshotWholePage(Tab tab) { + ImmutableViewportMetrics viewport = GeckoApp.mAppContext.getLayerController().getViewportMetrics(); + // source width and height to screenshot + float sw = viewport.pageSizeWidth; + float sh = viewport.pageSizeHeight; + // 2Mb of 16bit image data + // may be bumped by up to 4x for power of 2 alignment + float ratio = (float)Math.sqrt((sw * sh) / (ScreenshotLayer.getMaxNumPixels() / 4)); + // destination width and hight + int dw = IntSize.nextPowerOfTwo(sw / ratio); + int dh = IntSize.nextPowerOfTwo(sh / ratio); + sLastCheckerboardWidthRatio = dw / sw; + sLastCheckerboardHeightRatio = dh / sh; + sCheckerboardPageWidth = viewport.pageSizeWidth; + sCheckerboardPageHeight = viewport.pageSizeHeight; + + GeckoAppShell.sendEventToGecko(GeckoEvent.createScreenshotEvent(tab.getId(), 0, 0, (int)sw, (int)sh, 0, 0, dw, dh, GeckoAppShell.SCREENSHOT_WHOLE_PAGE)); + } } diff --git a/mobile/android/base/GeckoEvent.java b/mobile/android/base/GeckoEvent.java index b213b02018c..737f6f6a414 100644 --- a/mobile/android/base/GeckoEvent.java +++ b/mobile/android/base/GeckoEvent.java @@ -97,7 +97,8 @@ public class GeckoEvent { private static final int UNUSED2_EVENT = 26; private static final int SCREENORIENTATION_CHANGED = 27; private static final int COMPOSITOR_PAUSE = 28; - private static final int COMPOSITOR_RESUME = 29; + private static final int COMPOSITOR_RESUME = 29; + private static final int PAINT_LISTEN_START_EVENT = 30; public static final int IME_COMPOSITION_END = 0; public static final int IME_COMPOSITION_BEGIN = 1; @@ -478,12 +479,15 @@ public class GeckoEvent { return event; } - public static GeckoEvent createScreenshotEvent(int tabId, int sw, int sh, int dw, int dh) { + public static GeckoEvent createScreenshotEvent(int tabId, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int token) { GeckoEvent event = new GeckoEvent(SCREENSHOT); - event.mPoints = new Point[2]; - event.mPoints[0] = new Point(sw, sh); - event.mPoints[1] = new Point(dw, dh); + event.mPoints = new Point[4]; + event.mPoints[0] = new Point(sx, sy); + event.mPoints[1] = new Point(sw, sh); + event.mPoints[2] = new Point(dx, dy); + event.mPoints[3] = new Point(dw, dh); event.mMetaState = tabId; + event.mFlags = token; return event; } @@ -492,4 +496,10 @@ public class GeckoEvent { event.mScreenOrientation = aScreenOrientation; return event; } + + public static GeckoEvent createStartPaintListentingEvent(int tabId) { + GeckoEvent event = new GeckoEvent(PAINT_LISTEN_START_EVENT); + event.mMetaState = tabId; + return event; + } } diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in index ca15823eb8a..c61b188a12d 100644 --- a/mobile/android/base/Makefile.in +++ b/mobile/android/base/Makefile.in @@ -138,6 +138,7 @@ FENNEC_JAVA_FILES = \ gfx/PanningPerfAPI.java \ gfx/PointUtils.java \ gfx/RectUtils.java \ + gfx/ScreenshotLayer.java \ gfx/ScrollbarLayer.java \ gfx/SingleTileLayer.java \ gfx/SurfaceTextureLayer.java \ diff --git a/mobile/android/base/gfx/GeckoLayerClient.java b/mobile/android/base/gfx/GeckoLayerClient.java index 80bd248acd8..410da0e9fe1 100644 --- a/mobile/android/base/gfx/GeckoLayerClient.java +++ b/mobile/android/base/gfx/GeckoLayerClient.java @@ -43,6 +43,7 @@ import org.mozilla.gecko.GeckoApp; import org.mozilla.gecko.GeckoAppShell; import org.mozilla.gecko.GeckoEvent; import org.mozilla.gecko.GeckoEventResponder; +import org.mozilla.gecko.Tabs; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -341,6 +342,8 @@ public class GeckoLayerClient implements GeckoEventResponder, mLayerController.abortPanZoomAnimation(); mLayerController.getView().setPaintState(LayerView.PAINT_BEFORE_FIRST); } + mLayerController.getView().getRenderer().resetCheckerboard(); + GeckoAppShell.screenshotWholePage(Tabs.getInstance().getSelectedTab()); } /** This function is invoked by Gecko via JNI; be careful when modifying signature. diff --git a/mobile/android/base/gfx/IntSize.java b/mobile/android/base/gfx/IntSize.java index ee43b1bf557..8f5b3f4b989 100644 --- a/mobile/android/base/gfx/IntSize.java +++ b/mobile/android/base/gfx/IntSize.java @@ -96,6 +96,10 @@ public class IntSize { return value + 1; } + public static int nextPowerOfTwo(float value) { + return nextPowerOfTwo((int) value); + } + public IntSize nextPowerOfTwo() { return new IntSize(nextPowerOfTwo(width), nextPowerOfTwo(height)); } diff --git a/mobile/android/base/gfx/LayerRenderer.java b/mobile/android/base/gfx/LayerRenderer.java index d846c7d8e30..d3b84875be7 100644 --- a/mobile/android/base/gfx/LayerRenderer.java +++ b/mobile/android/base/gfx/LayerRenderer.java @@ -52,6 +52,7 @@ import org.mozilla.gecko.gfx.TileLayer; import org.mozilla.gecko.GeckoAppShell; import android.content.Context; import android.content.SharedPreferences; +import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; @@ -90,8 +91,7 @@ public class LayerRenderer implements GLSurfaceView.Renderer { private final LayerView mView; private final SingleTileLayer mBackgroundLayer; - private final CheckerboardImage mCheckerboardImage; - private final SingleTileLayer mCheckerboardLayer; + private final ScreenshotLayer mCheckerboardLayer; private final NinePatchTileLayer mShadowLayer; private TextLayer mFrameRateLayer; private final ScrollbarLayer mHorizScrollLayer; @@ -158,6 +158,36 @@ public class LayerRenderer implements GLSurfaceView.Renderer { " gl_FragColor = texture2D(sTexture, vec2(vTexCoord.x, 1.0 - vTexCoord.y));\n" + "}\n"; + public void setCheckerboardBitmap(Bitmap bitmap) { + mCheckerboardLayer.setBitmap(bitmap); + mCheckerboardLayer.beginTransaction(); + try { + mCheckerboardLayer.invalidate(); + } finally { + mCheckerboardLayer.endTransaction(); + } + } + + public void updateCheckerboardBitmap(Bitmap bitmap, float x, float y, float width, float height) { + mCheckerboardLayer.updateBitmap(bitmap, x, y, width, height); + mCheckerboardLayer.beginTransaction(); + try { + mCheckerboardLayer.invalidate(); + } finally { + mCheckerboardLayer.endTransaction(); + } + } + + public void resetCheckerboard() { + mCheckerboardLayer.reset(); + mCheckerboardLayer.beginTransaction(); + try { + mCheckerboardLayer.invalidate(); + } finally { + mCheckerboardLayer.endTransaction(); + } + } + public LayerRenderer(LayerView view) { mView = view; @@ -166,8 +196,7 @@ public class LayerRenderer implements GLSurfaceView.Renderer { CairoImage backgroundImage = new BufferedCairoImage(controller.getBackgroundPattern()); mBackgroundLayer = new SingleTileLayer(true, backgroundImage); - mCheckerboardImage = new CheckerboardImage(); - mCheckerboardLayer = new SingleTileLayer(true, mCheckerboardImage); + mCheckerboardLayer = ScreenshotLayer.create(); CairoImage shadowImage = new BufferedCairoImage(controller.getShadowPattern()); mShadowLayer = new NinePatchTileLayer(shadowImage); @@ -391,18 +420,15 @@ public class LayerRenderer implements GLSurfaceView.Renderer { private void updateCheckerboardImage() { int checkerboardColor = mView.getController().getCheckerboardColor(); boolean showChecks = mView.getController().checkerboardShouldShowChecks(); - if (checkerboardColor == mCheckerboardImage.getColor() && - showChecks == mCheckerboardImage.getShowChecks()) { - return; - } mCheckerboardLayer.beginTransaction(); // called on compositor thread try { - mCheckerboardImage.update(showChecks, checkerboardColor); - mCheckerboardLayer.invalidate(); + if (mCheckerboardLayer.updateBackground(showChecks, checkerboardColor)) + mCheckerboardLayer.invalidate(); } finally { mCheckerboardLayer.endTransaction(); } + } /* @@ -533,7 +559,7 @@ public class LayerRenderer implements GLSurfaceView.Renderer { mUpdated &= mBackgroundLayer.update(mScreenContext); // called on compositor thread mUpdated &= mShadowLayer.update(mPageContext); // called on compositor thread updateCheckerboardImage(); - mUpdated &= mCheckerboardLayer.update(mScreenContext); // called on compositor thread + mUpdated &= mCheckerboardLayer.update(mPageContext); // called on compositor thread if (mFrameRateLayer != null) mUpdated &= mFrameRateLayer.update(mScreenContext); // called on compositor thread mUpdated &= mVertScrollLayer.update(mPageContext); // called on compositor thread mUpdated &= mHorizScrollLayer.update(mPageContext); // called on compositor thread @@ -569,7 +595,7 @@ public class LayerRenderer implements GLSurfaceView.Renderer { /* Draw the checkerboard. */ setScissorRect(); mCheckerboardLayer.setMask(rootMask); - mCheckerboardLayer.draw(mScreenContext); + mCheckerboardLayer.draw(mPageContext); GLES20.glDisable(GLES20.GL_SCISSOR_TEST); } diff --git a/mobile/android/base/gfx/LayerView.java b/mobile/android/base/gfx/LayerView.java index 2bb45ffbe8b..991acfd21c3 100644 --- a/mobile/android/base/gfx/LayerView.java +++ b/mobile/android/base/gfx/LayerView.java @@ -230,7 +230,7 @@ public class LayerView extends SurfaceView implements SurfaceHolder.Callback { } - public GLSurfaceView.Renderer getRenderer() { + public LayerRenderer getRenderer() { return mRenderer; } diff --git a/mobile/android/base/gfx/NinePatchTileLayer.java b/mobile/android/base/gfx/NinePatchTileLayer.java index 1c9fed8059b..f0bcdc50604 100644 --- a/mobile/android/base/gfx/NinePatchTileLayer.java +++ b/mobile/android/base/gfx/NinePatchTileLayer.java @@ -57,7 +57,7 @@ public class NinePatchTileLayer extends TileLayer { private static final int TEXTURE_SIZE = 64; public NinePatchTileLayer(CairoImage image) { - super(false, image); + super(image, TileLayer.PaintMode.NORMAL); } @Override diff --git a/mobile/android/base/gfx/ScreenshotLayer.java b/mobile/android/base/gfx/ScreenshotLayer.java new file mode 100644 index 00000000000..c8f6453135b --- /dev/null +++ b/mobile/android/base/gfx/ScreenshotLayer.java @@ -0,0 +1,254 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.gfx; + +import org.mozilla.gecko.GeckoAppShell; +import org.mozilla.gecko.gfx.BufferedCairoImage; +import org.mozilla.gecko.gfx.CairoImage; +import org.mozilla.gecko.gfx.IntSize; +import org.mozilla.gecko.gfx.SingleTileLayer; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.Region; +import android.graphics.RegionIterator; +import android.opengl.GLES20; +import android.util.Log; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.FloatBuffer; + +public class ScreenshotLayer extends SingleTileLayer { + private static final int SCREENSHOT_SIZE_LIMIT = 1048576; + private ScreenshotImage mImage; + // Size of the image buffer + private IntSize mBufferSize; + // The size of the bitmap painted in the buffer + // (may be smaller than mBufferSize due to power of 2 padding) + private IntSize mImageSize; + // Special case to show the page background color prior to painting a screenshot + private boolean mIsSingleColor = true; + // Force single color, needed for testing + private boolean mForceSingleColor = false; + // Cache the passed in background color to determine if we need to update + // initialized to 0 so it lets the code run to set it to white on init + private int mCurrentBackgroundColor = 0; + + public static int getMaxNumPixels() { + return SCREENSHOT_SIZE_LIMIT; + } + + public void reset() { + mIsSingleColor = true; + updateBackground(mForceSingleColor, Color.WHITE); + } + + void setBitmap(Bitmap bitmap) { + if (mForceSingleColor) + return; + mImageSize = new IntSize(bitmap.getWidth(), bitmap.getHeight()); + int width = IntSize.nextPowerOfTwo(bitmap.getWidth()); + int height = IntSize.nextPowerOfTwo(bitmap.getHeight()); + mBufferSize = new IntSize(width, height); + mImage.setBitmap(bitmap, width, height, CairoImage.FORMAT_RGB16_565); + mIsSingleColor = false; + } + + public void updateBitmap(Bitmap bitmap, float x, float y, float width, float height) { + mImage.updateBitmap(bitmap, x, y, width, height); + } + + public static ScreenshotLayer create() { + // 3 x 3 min for the single color case. Less than 3x3 will blend + // the colors from outside this single color block when scaled + return ScreenshotLayer.create(new IntSize(3, 3)); + } + + public static ScreenshotLayer create(IntSize size) { + Bitmap bitmap = Bitmap.createBitmap(size.width, size.height, Bitmap.Config.RGB_565); + ScreenshotLayer sl = create(bitmap); + sl.reset(); + return sl; + } + + public static ScreenshotLayer create(Bitmap bitmap) { + IntSize size = new IntSize(bitmap.getWidth(), bitmap.getHeight()); + // allocate a buffer that can hold our max screenshot size + ByteBuffer buffer = GeckoAppShell.allocateDirectBuffer(SCREENSHOT_SIZE_LIMIT * 2); + // construct the screenshot layer + ScreenshotLayer sl = new ScreenshotLayer(new ScreenshotImage(buffer, size.width, size.height, CairoImage.FORMAT_RGB16_565), size); + // paint the passed in bitmap into the buffer + sl.setBitmap(bitmap); + return sl; + } + + private ScreenshotLayer(ScreenshotImage image, IntSize size) { + super(image, TileLayer.PaintMode.STRETCH); + mBufferSize = size; + mImage = image; + } + + @Override + public void draw(RenderContext context) { + // mTextureIDs may be null here during startup if Layer.java's draw method + // failed to acquire the transaction lock and call performUpdates. + if (!initialized()) + return; + + float txl, txr, txb, txt; + if (mIsSingleColor) { + txt = 1.0f; + txr = 0.5f / mBufferSize.width;; + txb = 1.0f - 0.5f / mBufferSize.height; + txl = 0.0f; + } else { + Rect position = getPosition(); + + float bw = mBufferSize.width; + float bh = mBufferSize.height; + float iw = mImageSize.width; + float ih = mImageSize.height; + + float pw = context.pageSize.width; + float ph = context.pageSize.height; + + float vl = context.viewport.left; + float vr = context.viewport.right; + float vt = context.viewport.top; + float vb = context.viewport.bottom; + + float vw = vr - vl; + float vh = vb - vt; + + txl = (iw/bw) * (vl / pw); + txr = (iw/bw) * (vr / pw); + txt = 1.0f - ((ih/bh) * (vt / ph)); + txb = 1.0f - ((ih/bh) * (vb / ph)); + } + float[] coords = { + 0.0f, 0.0f, 0.0f, txl, txb, + 0.0f, 1.0f, 0.0f, txl, txt, + 1.0f, 0.0f, 0.0f, txr, txb, + 1.0f, 1.0f, 0.0f, txr, txt, + }; + + FloatBuffer coordBuffer = context.coordBuffer; + int positionHandle = context.positionHandle; + int textureHandle = context.textureHandle; + + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, getTextureID()); + + // Make sure we are at position zero in the buffer + coordBuffer.position(0); + coordBuffer.put(coords); + + // Vertex coordinates are x,y,z starting at position 0 into the buffer. + coordBuffer.position(0); + GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 20, coordBuffer); + + // Texture coordinates are texture_x, texture_y starting at position 3 into the buffer. + coordBuffer.position(3); + GLES20.glVertexAttribPointer(textureHandle, 2, GLES20.GL_FLOAT, false, 20, coordBuffer); + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + } + + public boolean updateBackground(boolean showChecks, int color) { + if (!showChecks) { + mIsSingleColor = true; + mForceSingleColor = true; + } else { + mForceSingleColor = false; + } + + if (!mIsSingleColor || color == mCurrentBackgroundColor) + return false; + + mCurrentBackgroundColor = color; + + /* mask each component of the 8888 color and bit shift to least + * sigificant. Then for red and blue multiply by (2^5 -1) and (2^6 - 1) + * for green. Finally, divide by (2^8 - 1) for all color values. This + * scales the 8 bit color values to 5 or 6 bits + */ + int red = ((color & 0x00FF0000 >> 16)* 31 / 255); + int green = ((color & 0x0000FF00 >> 8) * 63 / 255); + int blue = (color & 0x000000FF) * 31 / 255; + /* For the first byte left shift red by 3 positions such that it is the + * top 5 bits, right shift green by 3 so its 3 most significant are the + * 3 least significant. For the second byte, left shift green by 3 so + * its 3 least significant bits are the 3 most significant bits of the + * byte. Finally, set the 5 least significant bits to blue's value. + */ + byte byte1 = (byte)((red << 3 | green >> 3) & 0x0000FFFF); + byte byte2 = (byte)((green << 5 | blue) & 0x0000FFFF); + mImage.mBuffer.put(1, byte1); + mImage.mBuffer.put(0, byte2); + mImage.mBuffer.put(3, byte1); + mImage.mBuffer.put(2, byte2); + mImage.mBuffer.put(5, byte1); + mImage.mBuffer.put(4, byte2); + mImage.mBuffer.put(mImageSize.width + 1, byte1); + mImage.mBuffer.put(mImageSize.width + 0, byte2); + mImage.mBuffer.put(mImageSize.width + 3, byte1); + mImage.mBuffer.put(mImageSize.width + 2, byte2); + mImage.mBuffer.put(mImageSize.width + 5, byte1); + mImage.mBuffer.put(mImageSize.width + 4, byte2); + return true; + } + + /** A Cairo image that simply saves a buffer of pixel data. */ + static class ScreenshotImage extends CairoImage { + ByteBuffer mBuffer; + private IntSize mSize; + private int mFormat; + + /** Creates a buffered Cairo image from a byte buffer. */ + public ScreenshotImage(ByteBuffer inBuffer, int inWidth, int inHeight, int inFormat) { + mBuffer = inBuffer; mSize = new IntSize(inWidth, inHeight); mFormat = inFormat; + } + + @Override + protected void finalize() throws Throwable { + try { + if (mBuffer != null) + GeckoAppShell.freeDirectBuffer(mBuffer); + } finally { + super.finalize(); + } + } + + void setBitmap(Bitmap bitmap, int width, int height, int format) { + Bitmap tmp; + mSize = new IntSize(width, height); + mFormat = format; + if (width == bitmap.getWidth() && height == bitmap.getHeight()) { + tmp = bitmap; + } else { + tmp = Bitmap.createBitmap(width, height, CairoUtils.cairoFormatTobitmapConfig(mFormat)); + new Canvas(tmp).drawBitmap(bitmap, 0.0f, 0.0f, new Paint()); + } + tmp.copyPixelsToBuffer(mBuffer.asIntBuffer()); + } + + public void updateBitmap(Bitmap bitmap, float x, float y, float width, float height) { + Bitmap tmp = Bitmap.createBitmap(mSize.width, mSize.height, CairoUtils.cairoFormatTobitmapConfig(mFormat)); + tmp.copyPixelsFromBuffer(mBuffer.asIntBuffer()); + Canvas c = new Canvas(tmp); + c.drawBitmap(bitmap, x, y, new Paint()); + tmp.copyPixelsToBuffer(mBuffer.asIntBuffer()); + } + + @Override + public ByteBuffer getBuffer() { return mBuffer; } + @Override + public IntSize getSize() { return mSize; } + @Override + public int getFormat() { return mFormat; } + } +} diff --git a/mobile/android/base/gfx/ScrollbarLayer.java b/mobile/android/base/gfx/ScrollbarLayer.java index 601fa506164..c22878f39ae 100644 --- a/mobile/android/base/gfx/ScrollbarLayer.java +++ b/mobile/android/base/gfx/ScrollbarLayer.java @@ -141,7 +141,7 @@ public class ScrollbarLayer extends TileLayer { }; private ScrollbarLayer(LayerRenderer renderer, CairoImage image, boolean vertical, ByteBuffer buffer) { - super(false, image); + super(image, TileLayer.PaintMode.NORMAL); mVertical = vertical; mBuffer = buffer; mRenderer = renderer; diff --git a/mobile/android/base/gfx/SingleTileLayer.java b/mobile/android/base/gfx/SingleTileLayer.java index 1264768b365..ce11bce779a 100644 --- a/mobile/android/base/gfx/SingleTileLayer.java +++ b/mobile/android/base/gfx/SingleTileLayer.java @@ -65,7 +65,11 @@ public class SingleTileLayer extends TileLayer { public SingleTileLayer(CairoImage image) { this(false, image); } public SingleTileLayer(boolean repeat, CairoImage image) { - super(repeat, image); + super(image, repeat ? TileLayer.PaintMode.REPEAT : TileLayer.PaintMode.NORMAL); + } + + public SingleTileLayer(CairoImage image, TileLayer.PaintMode paintMode) { + super(image, paintMode); } /** @@ -86,7 +90,7 @@ public class SingleTileLayer extends TileLayer { Rect position = getPosition(); RectF viewport = context.viewport; - if (repeats()) { + if (repeats() || stretches()) { bounds = new RectF(0.0f, 0.0f, viewport.width(), viewport.height()); int width = Math.round(viewport.width()); int height = Math.round(viewport.height()); diff --git a/mobile/android/base/gfx/TileLayer.java b/mobile/android/base/gfx/TileLayer.java index a9a6e3cf258..c699e178ebc 100644 --- a/mobile/android/base/gfx/TileLayer.java +++ b/mobile/android/base/gfx/TileLayer.java @@ -58,20 +58,23 @@ public abstract class TileLayer extends Layer { private final Rect mDirtyRect; private final CairoImage mImage; - private final boolean mRepeat; private IntSize mSize; private int[] mTextureIDs; - public TileLayer(boolean repeat, CairoImage image) { + public enum PaintMode { NORMAL, REPEAT, STRETCH }; + private PaintMode mPaintMode; + + public TileLayer(CairoImage image, PaintMode paintMode) { super(image.getSize()); - mRepeat = repeat; + mPaintMode = paintMode; mImage = image; mSize = new IntSize(0, 0); mDirtyRect = new Rect(); } - protected boolean repeats() { return mRepeat; } + protected boolean repeats() { return mPaintMode == PaintMode.REPEAT; } + protected boolean stretches() { return mPaintMode == PaintMode.STRETCH; } protected int getTextureID() { return mTextureIDs[0]; } protected boolean initialized() { return mImage != null && mTextureIDs != null; } @@ -186,7 +189,7 @@ public abstract class TileLayer extends Layer { GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); - int repeatMode = mRepeat ? GLES20.GL_REPEAT : GLES20.GL_CLAMP_TO_EDGE; + int repeatMode = repeats() ? GLES20.GL_REPEAT : GLES20.GL_CLAMP_TO_EDGE; GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, repeatMode); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, repeatMode); } diff --git a/widget/android/AndroidBridge.cpp b/widget/android/AndroidBridge.cpp index 642d6ac9f40..f77d97e95f0 100644 --- a/widget/android/AndroidBridge.cpp +++ b/widget/android/AndroidBridge.cpp @@ -115,7 +115,7 @@ AndroidBridge::Init(JNIEnv *jEnv, jNotifyIME = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "notifyIME", "(II)V"); jNotifyIMEEnabled = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "notifyIMEEnabled", "(ILjava/lang/String;Ljava/lang/String;Z)V"); jNotifyIMEChange = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "notifyIMEChange", "(Ljava/lang/String;III)V"); - jNotifyScreenShot = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "notifyScreenShot", "(Ljava/nio/ByteBuffer;III)V"); + jNotifyScreenShot = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "notifyScreenShot", "(Ljava/nio/ByteBuffer;IIIIII)V"); jAcknowledgeEventSync = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "acknowledgeEventSync", "()V"); jEnableLocation = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "enableLocation", "(Z)V"); @@ -166,6 +166,7 @@ AndroidBridge::Init(JNIEnv *jEnv, jDisableBatteryNotifications = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "disableBatteryNotifications", "()V"); jGetCurrentBatteryInformation = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "getCurrentBatteryInformation", "()[D"); jRemovePluginView = jEnv->GetStaticMethodID(jGeckoAppShellClass, "removePluginView", "(Landroid/view/View;)V"); + jNotifyPaintedRect = jEnv->GetStaticMethodID(jGeckoAppShellClass, "notifyPaintedRect", "(FFFF)V"); jHandleGeckoMessage = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "handleGeckoMessage", "(Ljava/lang/String;)Ljava/lang/String;"); jCheckUriVisited = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "checkUriVisited", "(Ljava/lang/String;)V"); @@ -2135,7 +2136,7 @@ jobject JNICALL Java_org_mozilla_gecko_GeckoAppShell_allocateDirectBuffer(JNIEnv *jenv, jclass, jlong size); -nsresult AndroidBridge::TakeScreenshot(nsIDOMWindow *window, PRInt32 srcX, PRInt32 srcY, PRInt32 srcW, PRInt32 srcH, PRInt32 dstW, PRInt32 dstH, PRInt32 tabId, float scale) +nsresult AndroidBridge::TakeScreenshot(nsIDOMWindow *window, PRInt32 srcX, PRInt32 srcY, PRInt32 srcW, PRInt32 srcH, PRInt32 dstW, PRInt32 dstH, PRInt32 tabId, float scale, PRInt32 token) { nsCOMPtr win = do_QueryInterface(window); if (!win) @@ -2175,6 +2176,15 @@ nsresult AndroidBridge::TakeScreenshot(nsIDOMWindow *window, PRInt32 srcX, PRInt nsresult rv = presShell->RenderDocument(r, renderDocFlags, bgColor, context); NS_ENSURE_SUCCESS(rv, rv); AndroidBridge::AutoLocalJNIFrame jniFrame(jenv, 1); - jenv->CallStaticVoidMethod(AndroidBridge::Bridge()->mGeckoAppShellClass, AndroidBridge::Bridge()->jNotifyScreenShot, buffer, tabId, dstW, dstH); + jenv->CallStaticVoidMethod(AndroidBridge::Bridge()->mGeckoAppShellClass, AndroidBridge::Bridge()->jNotifyScreenShot, buffer, tabId, srcX * dstW / srcW , srcY * dstH / srcH, dstW, dstH, token); return NS_OK; } + +void +AndroidBridge::NotifyPaintedRect(float top, float left, float bottom, float right) +{ + JNIEnv* jenv = AndroidBridge::GetJNIEnv(); + if (!jenv) + return; + jenv->CallStaticVoidMethod(AndroidBridge::Bridge()->mGeckoAppShellClass, AndroidBridge::Bridge()->jNotifyPaintedRect, top, left, bottom, right); +} diff --git a/widget/android/AndroidBridge.h b/widget/android/AndroidBridge.h index cff7179674f..2827fc0e318 100644 --- a/widget/android/AndroidBridge.h +++ b/widget/android/AndroidBridge.h @@ -183,7 +183,9 @@ public: static void RemovePluginView(void* surface); - nsresult TakeScreenshot(nsIDOMWindow *window, PRInt32 srcX, PRInt32 srcY, PRInt32 srcW, PRInt32 srcH, PRInt32 dstW, PRInt32 dstH, PRInt32 tabId, float scale); + nsresult TakeScreenshot(nsIDOMWindow *window, PRInt32 srcX, PRInt32 srcY, PRInt32 srcW, PRInt32 srcH, PRInt32 dstW, PRInt32 dstH, PRInt32 tabId, float scale, PRInt32 token); + + static void NotifyPaintedRect(float top, float left, float bottom, float right); void AcknowledgeEventSync(); @@ -524,6 +526,7 @@ protected: jmethodID jCheckUriVisited; jmethodID jMarkUriVisited; jmethodID jRemovePluginView; + jmethodID jNotifyPaintedRect; jmethodID jNumberOfMessages; jmethodID jSendMessage; diff --git a/widget/android/AndroidJavaWrappers.cpp b/widget/android/AndroidJavaWrappers.cpp index aeb682f10f0..b1ff4ab18d3 100644 --- a/widget/android/AndroidJavaWrappers.cpp +++ b/widget/android/AndroidJavaWrappers.cpp @@ -520,7 +520,13 @@ AndroidGeckoEvent::Init(JNIEnv *jenv, jobject jobj) case SCREENSHOT: { mMetaState = jenv->GetIntField(jobj, jMetaStateField); - ReadPointArray(mPoints, jenv, jPoints, 2); + mFlags = jenv->GetIntField(jobj, jFlagsField); + ReadPointArray(mPoints, jenv, jPoints, 4); + break; + } + + case PAINT_LISTEN_START_EVENT: { + mMetaState = jenv->GetIntField(jobj, jMetaStateField); break; } diff --git a/widget/android/AndroidJavaWrappers.h b/widget/android/AndroidJavaWrappers.h index 691a0b0543d..43666ebe6d6 100644 --- a/widget/android/AndroidJavaWrappers.h +++ b/widget/android/AndroidJavaWrappers.h @@ -719,6 +719,7 @@ public: SCREENORIENTATION_CHANGED = 27, COMPOSITOR_PAUSE = 28, COMPOSITOR_RESUME = 29, + PAINT_LISTEN_START_EVENT = 30, dummy_java_enum_list_end }; diff --git a/widget/android/nsAppShell.cpp b/widget/android/nsAppShell.cpp index 823aa409f1e..eb7d4950df3 100644 --- a/widget/android/nsAppShell.cpp +++ b/widget/android/nsAppShell.cpp @@ -49,6 +49,10 @@ #include "nsIAppStartup.h" #include "nsIGeolocationProvider.h" #include "nsCacheService.h" +#include "nsIDOMEventListener.h" +#include "nsDOMNotifyPaintEvent.h" +#include "nsIDOMClientRectList.h" +#include "nsIDOMClientRect.h" #include "mozilla/Services.h" #include "mozilla/unused.h" @@ -92,6 +96,64 @@ nsAppShell *nsAppShell::gAppShell = nsnull; NS_IMPL_ISUPPORTS_INHERITED1(nsAppShell, nsBaseAppShell, nsIObserver) +class AfterPaintListener : public nsIDOMEventListener { + public: + NS_DECL_ISUPPORTS + + void Register(nsIDOMWindow* window) { + if (mEventTarget) + Unregister(); + nsCOMPtr win = do_QueryInterface(window); + if (!win) + return; + mEventTarget = win->GetChromeEventHandler(); + if (mEventTarget) + mEventTarget->AddEventListener(NS_LITERAL_STRING("MozAfterPaint"), this, false); + } + + void Unregister() { + if (mEventTarget) + mEventTarget->RemoveEventListener(NS_LITERAL_STRING("MozAfterPaint"), this, false); + mEventTarget = nsnull; + } + + virtual nsresult HandleEvent(nsIDOMEvent* aEvent) { + nsCOMPtr paintEvent = do_QueryInterface(aEvent); + if (!paintEvent) + return NS_OK; + + nsCOMPtr rects; + paintEvent->GetClientRects(getter_AddRefs(rects)); + if (!rects) + return NS_OK; + PRUint32 length; + rects->GetLength(&length); + for (PRUint32 i = 0; i < length; ++i) { + float top, left, bottom, right; + nsCOMPtr rect = rects->GetItemAt(i); + if (!rect) + continue; + rect->GetTop(&top); + rect->GetLeft(&left); + rect->GetRight(&right); + rect->GetBottom(&bottom); + AndroidBridge::NotifyPaintedRect(top, left, bottom, right); + } + return NS_OK; + } + + ~AfterPaintListener() { + if (mEventTarget) + Unregister(); + } + + private: + nsCOMPtr mEventTarget; +}; + +NS_IMPL_ISUPPORTS1(AfterPaintListener, nsIDOMEventListener) +nsCOMPtr sAfterPaintListener = nsnull; + nsAppShell::nsAppShell() : mQueueLock("nsAppShell.mQueueLock"), mCondLock("nsAppShell.mCondLock"), @@ -101,11 +163,13 @@ nsAppShell::nsAppShell() mAllowCoalescingNextDraw(false) { gAppShell = this; + sAfterPaintListener = new AfterPaintListener(); } nsAppShell::~nsAppShell() { gAppShell = nsnull; + delete sAfterPaintListener; } void @@ -369,6 +433,21 @@ nsAppShell::ProcessNextNativeEvent(bool mayWait) break; } + case AndroidGeckoEvent::PAINT_LISTEN_START_EVENT: { + nsCOMPtr domWindow; + nsCOMPtr tab; + mBrowserApp->GetBrowserTab(curEvent->MetaState(), getter_AddRefs(tab)); + if (!tab) + break; + + tab->GetWindow(getter_AddRefs(domWindow)); + if (!domWindow) + break; + + sAfterPaintListener->Register(domWindow); + break; + } + case AndroidGeckoEvent::SCREENSHOT: { if (!mBrowserApp) break; @@ -392,8 +471,8 @@ nsAppShell::ProcessNextNativeEvent(bool mayWait) break; nsTArray points = curEvent->Points(); - NS_ASSERTION(points.Length() == 2, "Screenshot event does not have enough coordinates"); - bridge->TakeScreenshot(domWindow, 0, 0, points[0].x, points[0].y, points[1].x, points[1].y, curEvent->MetaState(), scale); + NS_ASSERTION(points.Length() == 4, "Screenshot event does not have enough coordinates"); + bridge->TakeScreenshot(domWindow, points[0].x, points[0].y, points[1].x, points[1].y, points[3].x, points[3].y, curEvent->MetaState(), scale, curEvent->Flags()); break; } From 017f2d0691364eb2616f67c31f38d375baa0f425 Mon Sep 17 00:00:00 2001 From: Jim Mathies Date: Tue, 24 Apr 2012 14:28:19 -0500 Subject: [PATCH 030/182] Bug 737969 - Win8 Metro build config. r=ted --- config/autoconf.mk.in | 1 + configure.in | 66 ++++++++++++++++++++++++++++++------ js/src/config/autoconf.mk.in | 2 ++ js/src/configure.in | 41 +++++++++++++++++----- 4 files changed, 92 insertions(+), 18 deletions(-) diff --git a/config/autoconf.mk.in b/config/autoconf.mk.in index 7930a5ee720..8fceba770c0 100644 --- a/config/autoconf.mk.in +++ b/config/autoconf.mk.in @@ -550,6 +550,7 @@ MOZ_ENABLE_DWRITE_FONT = @MOZ_ENABLE_DWRITE_FONT@ MOZ_ENABLE_D2D_SURFACE = @MOZ_ENABLE_D2D_SURFACE@ MOZ_ENABLE_D3D9_LAYER = @MOZ_ENABLE_D3D9_LAYER@ MOZ_ENABLE_D3D10_LAYER = @MOZ_ENABLE_D3D10_LAYER@ +MOZ_METRO = @MOZ_METRO@ MOZ_GTK2_CFLAGS = @MOZ_GTK2_CFLAGS@ MOZ_GTK2_LIBS = @MOZ_GTK2_LIBS@ diff --git a/configure.in b/configure.in index 15161e1e065..8b336c7a086 100644 --- a/configure.in +++ b/configure.in @@ -678,25 +678,49 @@ fi dnl ======================================================== dnl Special win32 checks dnl ======================================================== -WINVER=502 -dnl Target the Windows 7 SDK by default -WINSDK_TARGETVER=601 + +# With win8, sdk target=602, WINVER=602 +MOZ_ARG_ENABLE_BOOL(metro, +[ --enable-metro Enable Windows Metro build targets], + MOZ_METRO=1, + MOZ_METRO=) +if test -n "$MOZ_METRO"; then + AC_DEFINE(MOZ_METRO) + # Target the Windows 8 Kit + WINSDK_TARGETVER=602 + # Allow a higher api set + WINVER=602 +else + # Target the Windows 7 SDK by default + WINSDK_TARGETVER=601 + WINVER=502 +fi + +if test -n "$MOZ_METRO"; then + case "$target" in + *-mingw*) + ;; + *) + AC_MSG_ERROR([Metro builds only valid on the windows platform.]); + ;; + esac +fi MOZ_ARG_WITH_STRING(windows-version, [ --with-windows-version=WINSDK_TARGETVER - Highest Windows version to target using this SDK - 601: Windows 7], + Windows SDK version to target. Lowest version + currently allowed is 601 (Win7), highest is 602 (Win8)], WINSDK_TARGETVER=$withval) +# Currently only two sdk versions allowed, 601 and 602 case "$WINSDK_TARGETVER" in -601) +601|602) MOZ_WINSDK_TARGETVER=0${WINSDK_TARGETVER}0000 ;; *) - AC_MSG_ERROR([Invalid value for --with-windows-version ($WINSDK_TARGETVER), must be 601]); + AC_MSG_ERROR([Invalid value for --with-windows-version ($WINSDK_TARGETVER)]); ;; - esac case "$target" in @@ -778,6 +802,16 @@ case "$target" in WIN32_REDIST_DIR=`cd "$WIN32_REDIST_DIR" && pwd` fi + dnl Confirm we have the pri tools on win8 builds + if test -n "$MOZ_METRO"; then + AC_MSG_CHECKING([for makepri]) + AC_CHECK_PROGS(MAKEPRI, makepri, "") + if test -z "MAKEPRI" ; then + AC_MSG_ERROR([makepri.exe is required for generating metro browser install components. It should be in the Win8 SDK.]) + fi + AC_SUBST(MAKEPRI) + fi + dnl Ensure that mt.exe is 'Microsoft (R) Manifest Tool', dnl not something else like "magnetic tape manipulation utility". MSMT_TOOL=`mt 2>&1|grep 'Microsoft (R) Manifest Tool'` @@ -966,7 +1000,7 @@ EOF AC_MSG_ERROR([windres version $WINDRES_VERSION or higher is required to build.]) fi - MOZ_WINSDK_MAXVER=0x06010000 + MOZ_WINSDK_MAXVER=0x06020000 fi # !GNU_CC AC_DEFINE_UNQUOTED(WINVER,0x$WINVER) @@ -983,7 +1017,18 @@ EOF AC_MSG_RESULT("no") AC_MSG_ERROR([You are targeting Windows version 0x$MOZ_WINSDK_TARGETVER, but your SDK only supports up to version $MOZ_WINSDK_MAXVER. Install and use an updated SDK, or target a lower version using --with-windows-version. Alternatively, try running the Windows SDK Configuration Tool and selecting a newer SDK. See https://developer.mozilla.org/En/Windows_SDK_versions for more details on fixing this.]) fi - + + # Make sure the sdk / code we're targeting has the right toolset + AC_MSG_CHECKING([SDK and tools are in sync]) + if test -n "$MOZ_METRO"; then + if test "$MOZ_MSVCVERSION" -gt "10"; then + AC_MSG_RESULT("yes") + else + AC_MSG_RESULT("no") + AC_MSG_ERROR([Your MOZ_MSVCVERSION equals $MOZ_MSVCVERSION and you've enabled metro build support. You can't target metro without msvc 11 or higher. Disable metro support or switch to a newer set of tools.]) + fi + fi + AC_DEFINE_UNQUOTED(MOZ_WINSDK_TARGETVER,0x$MOZ_WINSDK_TARGETVER) # Definitions matching sdkddkver.h AC_DEFINE_UNQUOTED(MOZ_NTDDI_WIN7, 0x06010000) @@ -8445,6 +8490,7 @@ AC_SUBST(MOZ_D3DX9_CAB) AC_SUBST(MOZ_D3DCOMPILER_CAB) AC_SUBST(MOZ_D3DX9_DLL) AC_SUBST(MOZ_D3DCOMPILER_DLL) +AC_SUBST(MOZ_METRO) AC_SUBST(MOZ_ANDROID_HISTORY) AC_SUBST(MOZ_WEBSMS_BACKEND) diff --git a/js/src/config/autoconf.mk.in b/js/src/config/autoconf.mk.in index 23b776cc903..35d50a269c4 100644 --- a/js/src/config/autoconf.mk.in +++ b/js/src/config/autoconf.mk.in @@ -335,6 +335,8 @@ HAVE_ARM_SIMD= @HAVE_ARM_SIMD@ JS_SHARED_LIBRARY = @JS_SHARED_LIBRARY@ HAVE_LINUX_PERF_EVENT_H = @HAVE_LINUX_PERF_EVENT_H@ +MOZ_METRO = @MOZ_METRO@ + # We only want to do the pymake sanity on Windows, other os's can cope ifeq ($(HOST_OS_ARCH),WINNT) # Ensure invariants between GNU Make and pymake diff --git a/js/src/configure.in b/js/src/configure.in index 25e8a26f92c..e5b0f7a68be 100644 --- a/js/src/configure.in +++ b/js/src/configure.in @@ -663,25 +663,49 @@ fi dnl Special win32 checks dnl ======================================================== -WINVER=502 -dnl Target the Windows 7 SDK by default -WINSDK_TARGETVER=601 + +# With win8, sdk target=602, WINVER=602 +MOZ_ARG_ENABLE_BOOL(metro, +[ --enable-metro Enable Windows Metro build targets], + MOZ_METRO=1, + MOZ_METRO=) +if test -n "$MOZ_METRO"; then + AC_DEFINE(MOZ_METRO) + # Target the Windows 8 Kit + WINSDK_TARGETVER=602 + # Allow a higher api set + WINVER=602 +else + # Target the Windows 7 SDK by default + WINSDK_TARGETVER=601 + WINVER=502 +fi + +if test -n "$MOZ_METRO"; then + case "$target" in + *-mingw*) + ;; + *) + AC_MSG_ERROR([Metro builds only valid on the windows platform.]); + ;; + esac +fi MOZ_ARG_WITH_STRING(windows-version, [ --with-windows-version=WINSDK_TARGETVER - Highest Windows version to target using this SDK - 601: Windows 7], + Windows SDK version to target. Lowest version + currently allowed is 601, highest is 602], WINSDK_TARGETVER=$withval) +# Currently only two sdk versions allowed, 601 and 602 case "$WINSDK_TARGETVER" in -601) +601|602) MOZ_WINSDK_TARGETVER=0${WINSDK_TARGETVER}0000 ;; *) - AC_MSG_ERROR([Invalid value for --with-windows-version ($WINSDK_TARGETVER), must be 601]); + AC_MSG_ERROR([Invalid value for --with-windows-version ($WINSDK_TARGETVER)]); ;; - esac case "$target" in @@ -4859,6 +4883,7 @@ AC_SUBST(COMPILE_CXXFLAGS) AC_SUBST(LDFLAGS) AC_SUBST(LIBS) AC_SUBST(CROSS_COMPILE) +AC_SUBST(MOZ_METRO) AC_SUBST(HOST_CC) AC_SUBST(HOST_CXX) From 8fd1d4d6ae19b97474033568b50f69acc0ea37d8 Mon Sep 17 00:00:00 2001 From: Benoit Jacob Date: Tue, 24 Apr 2012 16:05:11 -0400 Subject: [PATCH 031/182] Bug 748112 - WebGL Water demo broken by long identifier mapping - r=jgilbert --- gfx/angle/src/compiler/MapLongVariableNames.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/gfx/angle/src/compiler/MapLongVariableNames.cpp b/gfx/angle/src/compiler/MapLongVariableNames.cpp index 3852743fb47..f9943804463 100644 --- a/gfx/angle/src/compiler/MapLongVariableNames.cpp +++ b/gfx/angle/src/compiler/MapLongVariableNames.cpp @@ -14,12 +14,18 @@ TString mapLongName(int id, const TString& name, bool isGlobal) ASSERT(name.size() > MAX_SHORTENED_IDENTIFIER_SIZE); TStringStream stream; uint64 hash = SpookyHash::Hash64(name.data(), name.length(), 0); - stream << "webgl_" + + // We want to avoid producing a string with a double underscore, + // which would be an illegal GLSL identifier. We can assume that the + // original identifier doesn't have a double underscore, otherwise + // it's illegal anyway. + stream << (name[0] == '_' ? "webgl" : "webgl_") << name.substr(0, 9) - << "_" + << (name[8] == '_' ? "" : "_") << std::hex << hash; - ASSERT(stream.str().length() == MAX_SHORTENED_IDENTIFIER_SIZE); + ASSERT(stream.str().length() <= MAX_SHORTENED_IDENTIFIER_SIZE); + ASSERT(stream.str().length() >= MAX_SHORTENED_IDENTIFIER_SIZE - 2); return stream.str(); } From c1d32447aed4ba524430eea916643833a2d159b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hub=20Figui=C3=A8re?= Date: Tue, 24 Apr 2012 13:07:17 -0700 Subject: [PATCH 032/182] Bug 718690 - Implement required and invalid element states. r=surkov --- accessible/src/mac/mozTextAccessible.mm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/accessible/src/mac/mozTextAccessible.mm b/accessible/src/mac/mozTextAccessible.mm index 13064fb0359..d8b8047055e 100644 --- a/accessible/src/mac/mozTextAccessible.mm +++ b/accessible/src/mac/mozTextAccessible.mm @@ -79,6 +79,8 @@ ToNSString(id aValue) NSAccessibilityNumberOfCharactersAttribute, // required NSAccessibilityVisibleCharacterRangeAttribute, // required NSAccessibilityInsertionPointLineNumberAttribute, + @"AXRequired", + @"AXInvalid", nil ]; [supportedAttributes addObjectsFromArray:[super accessibilityAttributeNames]]; @@ -115,6 +117,12 @@ ToNSString(id aValue) return [self text]; } + if ([attribute isEqualToString:@"AXRequired"]) + return [NSNumber numberWithBool:!!(mGeckoAccessible->State() & states::REQUIRED)]; + + if ([attribute isEqualToString:@"AXInvalid"]) + return [NSNumber numberWithBool:!!(mGeckoAccessible->State() & states::INVALID)]; + if ([attribute isEqualToString:NSAccessibilityVisibleCharacterRangeAttribute]) return [self visibleCharacterRange]; From bda34ee8755ef138e52a21acbc4877ace39ce886 Mon Sep 17 00:00:00 2001 From: Josh Aas Date: Tue, 24 Apr 2012 16:25:21 -0400 Subject: [PATCH 033/182] Bug 745842: Clean up plugin stream listener creation. r=jst --- content/base/src/nsObjectLoadingContent.cpp | 6 +- dom/plugins/base/nsPluginHost.cpp | 57 ++++--------------- dom/plugins/base/nsPluginHost.h | 22 +++---- .../base/nsPluginStreamListenerPeer.cpp | 12 ++-- 4 files changed, 30 insertions(+), 67 deletions(-) diff --git a/content/base/src/nsObjectLoadingContent.cpp b/content/base/src/nsObjectLoadingContent.cpp index 5b2807652ec..42ed99ac018 100644 --- a/content/base/src/nsObjectLoadingContent.cpp +++ b/content/base/src/nsObjectLoadingContent.cpp @@ -823,6 +823,9 @@ nsObjectLoadingContent::OnStartRequest(nsIRequest *aRequest, nsCOMPtr uri; chan->GetURI(getter_AddRefs(uri)); + if (!uri) { + return NS_ERROR_FAILURE; + } if (mContentType.EqualsASCII(APPLICATION_OCTET_STREAM)) { nsCAutoString extType; @@ -954,7 +957,8 @@ nsObjectLoadingContent::OnStartRequest(nsIRequest *aRequest, if (!pluginHost) { return NS_ERROR_NOT_AVAILABLE; } - pluginHost->CreateListenerForChannel(chan, this, getter_AddRefs(mFinalListener)); + pluginHost->NewEmbeddedPluginStreamListener(uri, this, nsnull, + getter_AddRefs(mFinalListener)); break; } case eType_Loading: diff --git a/dom/plugins/base/nsPluginHost.cpp b/dom/plugins/base/nsPluginHost.cpp index 0a43567beba..538d1d388ea 100644 --- a/dom/plugins/base/nsPluginHost.cpp +++ b/dom/plugins/base/nsPluginHost.cpp @@ -915,36 +915,6 @@ nsPluginHost::GetPluginTempDir(nsIFile **aDir) return sPluginTempDir->Clone(aDir); } -nsresult nsPluginHost::CreateListenerForChannel(nsIChannel* aChannel, - nsObjectLoadingContent* aContent, - nsIStreamListener** aListener) -{ - NS_PRECONDITION(aChannel && aContent, - "Invalid arguments to InstantiatePluginForChannel"); - nsCOMPtr uri; - nsresult rv = aChannel->GetURI(getter_AddRefs(uri)); - if (NS_FAILED(rv)) - return rv; - -#ifdef PLUGIN_LOGGING - if (PR_LOG_TEST(nsPluginLogging::gPluginLog, PLUGIN_LOG_NORMAL)) { - nsCAutoString urlSpec; - uri->GetAsciiSpec(urlSpec); - - PR_LOG(nsPluginLogging::gPluginLog, PLUGIN_LOG_NORMAL, - ("nsPluginHost::InstantiatePluginForChannel Begin content=%p, url=%s\n", - aContent, urlSpec.get())); - - PR_LogFlush(); - } -#endif - - // Note that we're not setting up a plugin instance here; the stream - // listener's OnStartRequest will handle doing that. - - return NewEmbeddedPluginStreamListener(uri, aContent, nsnull, aListener); -} - nsresult nsPluginHost::InstantiateEmbeddedPluginInstance(const char *aMimeType, nsIURI* aURL, nsObjectLoadingContent *aContent, @@ -3243,31 +3213,23 @@ nsPluginHost::StopPluginInstance(nsNPAPIPluginInstance* aInstance) return NS_OK; } -nsresult nsPluginHost::NewEmbeddedPluginStreamListener(nsIURI* aURL, +nsresult nsPluginHost::NewEmbeddedPluginStreamListener(nsIURI* aURI, nsObjectLoadingContent *aContent, nsNPAPIPluginInstance* aInstance, - nsIStreamListener** aListener) + nsIStreamListener **aStreamListener) { - NS_ENSURE_ARG_POINTER(aURL); + NS_ENSURE_ARG_POINTER(aURI); + NS_ENSURE_ARG_POINTER(aStreamListener); nsRefPtr listener = new nsPluginStreamListenerPeer(); - - // If we have an instance, everything has been set up - // if we only have an owner, then we need to pass it in - // so the listener can set up the instance later after - // we've determined the mimetype of the stream. - nsresult rv = NS_ERROR_ILLEGAL_VALUE; - if (aInstance) { - rv = listener->InitializeEmbedded(aURL, aInstance, nsnull); - } else if (aContent) { - rv = listener->InitializeEmbedded(aURL, nsnull, aContent); + nsresult rv = listener->InitializeEmbedded(aURI, aInstance, aContent); + if (NS_FAILED(rv)) { + return rv; } - if (NS_SUCCEEDED(rv)) { - NS_ADDREF(*aListener = listener); - } + listener.forget(aStreamListener); - return rv; + return NS_OK; } nsresult nsPluginHost::NewEmbeddedPluginStream(nsIURI* aURL, @@ -3309,6 +3271,7 @@ nsresult nsPluginHost::NewFullPagePluginStreamListener(nsIURI* aURI, nsNPAPIPluginInstance *aInstance, nsIStreamListener **aStreamListener) { + NS_ENSURE_ARG_POINTER(aURI); NS_ENSURE_ARG_POINTER(aStreamListener); nsRefPtr listener = new nsPluginStreamListenerPeer(); diff --git a/dom/plugins/base/nsPluginHost.h b/dom/plugins/base/nsPluginHost.h index e8b4ad598e4..2b0838027f0 100644 --- a/dom/plugins/base/nsPluginHost.h +++ b/dom/plugins/base/nsPluginHost.h @@ -112,9 +112,7 @@ public: nsresult Init(); nsresult LoadPlugins(); nsresult UnloadPlugins(); - nsresult CreateListenerForChannel(nsIChannel* aChannel, - nsObjectLoadingContent* aContent, - nsIStreamListener** aListener); + nsresult SetUpPluginInstance(const char *aMimeType, nsIURI *aURL, nsIPluginInstanceOwner *aOwner); @@ -233,23 +231,21 @@ public: nsresult GetPlugin(const char *aMimeType, nsNPAPIPlugin** aPlugin); + nsresult NewEmbeddedPluginStreamListener(nsIURI* aURL, nsObjectLoadingContent *aContent, + nsNPAPIPluginInstance* aInstance, + nsIStreamListener **aStreamListener); + + nsresult NewFullPagePluginStreamListener(nsIURI* aURI, + nsNPAPIPluginInstance *aInstance, + nsIStreamListener **aStreamListener); + private: nsresult TrySetUpPluginInstance(const char *aMimeType, nsIURI *aURL, nsIPluginInstanceOwner *aOwner); - nsresult - NewEmbeddedPluginStreamListener(nsIURI* aURL, nsObjectLoadingContent *aContent, - nsNPAPIPluginInstance* aInstance, - nsIStreamListener** aListener); - nsresult NewEmbeddedPluginStream(nsIURI* aURL, nsObjectLoadingContent *aContent, nsNPAPIPluginInstance* aInstance); - nsresult - NewFullPagePluginStreamListener(nsIURI* aURI, - nsNPAPIPluginInstance *aInstance, - nsIStreamListener **aStreamListener); - // Return an nsPluginTag for this type, if any. If aCheckEnabled is // true, only enabled plugins will be returned. nsPluginTag* diff --git a/dom/plugins/base/nsPluginStreamListenerPeer.cpp b/dom/plugins/base/nsPluginStreamListenerPeer.cpp index 4462d72e89a..61f7b24fa99 100644 --- a/dom/plugins/base/nsPluginStreamListenerPeer.cpp +++ b/dom/plugins/base/nsPluginStreamListenerPeer.cpp @@ -379,11 +379,6 @@ nsresult nsPluginStreamListenerPeer::Initialize(nsIURI *aURL, return NS_OK; } -/* Called by NewEmbeddedPluginStream() - if this is called, we weren't - * able to load the plugin, so we need to load it later once we figure - * out the mimetype. In order to load it later, we need the plugin - * instance owner. - */ nsresult nsPluginStreamListenerPeer::InitializeEmbedded(nsIURI *aURL, nsNPAPIPluginInstance* aInstance, nsObjectLoadingContent *aContent) @@ -397,7 +392,12 @@ nsresult nsPluginStreamListenerPeer::InitializeEmbedded(nsIURI *aURL, PR_LogFlush(); #endif - + + // We have to have one or the other. + if (!aInstance && !aContent) { + return NS_ERROR_FAILURE; + } + mURL = aURL; if (aInstance) { From 70f2fc8eca0b29f888615736df4002b3c76e3824 Mon Sep 17 00:00:00 2001 From: Josh Aas Date: Tue, 24 Apr 2012 16:26:48 -0400 Subject: [PATCH 034/182] Bug 748466: Sync NPAPI maemo support with npapi-sdk. r=jst --- dom/plugins/base/npapi.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dom/plugins/base/npapi.h b/dom/plugins/base/npapi.h index 6fc1d6837eb..443540c05e6 100644 --- a/dom/plugins/base/npapi.h +++ b/dom/plugins/base/npapi.h @@ -415,7 +415,7 @@ typedef enum { , NPPVpluginCoreAnimationLayer = 1003 #endif -#if (MOZ_PLATFORM_MAEMO == 5) || (MOZ_PLATFORM_MAEMO == 6) +#if defined(MOZ_PLATFORM_MAEMO) && ((MOZ_PLATFORM_MAEMO == 5) || (MOZ_PLATFORM_MAEMO == 6)) , NPPVpluginWindowlessLocalBool = 2002 #endif } NPPVariable; @@ -479,7 +479,7 @@ typedef enum { , NPNVsupportsCompositingCoreAnimationPluginsBool = 74656 /* TRUE if the browser supports CA model compositing */ #endif -#if (MOZ_PLATFORM_MAEMO == 5) || (MOZ_PLATFORM_MAEMO == 6) +#if defined(MOZ_PLATFORM_MAEMO) && ((MOZ_PLATFORM_MAEMO == 5) || (MOZ_PLATFORM_MAEMO == 6)) , NPNVSupportsWindowlessLocal = 2002 #endif } NPNVariable; From 0eac9baa3c1943209fec7f28c0ad9652a2e6bd44 Mon Sep 17 00:00:00 2001 From: Lucas Rocha Date: Tue, 24 Apr 2012 16:34:03 -0400 Subject: [PATCH 035/182] Bug 746444 - Add native function to force unlock on database file (r=blassey) --- mobile/android/base/GeckoAppShell.java | 2 ++ mozglue/android/nsGeckoUtils.cpp | 33 +++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/mobile/android/base/GeckoAppShell.java b/mobile/android/base/GeckoAppShell.java index fff02ed8c92..ad63b59f3b1 100644 --- a/mobile/android/base/GeckoAppShell.java +++ b/mobile/android/base/GeckoAppShell.java @@ -227,6 +227,8 @@ public class GeckoAppShell public static native void schedulePauseComposition(); public static native void scheduleResumeComposition(int width, int height); + public static native void unlockDatabaseFile(String databasePath); + private static class GeckoMediaScannerClient implements MediaScannerConnectionClient { private String mFile = ""; private String mMimeType = ""; diff --git a/mozglue/android/nsGeckoUtils.cpp b/mozglue/android/nsGeckoUtils.cpp index c8ef06b52ac..9203caa8332 100644 --- a/mozglue/android/nsGeckoUtils.cpp +++ b/mozglue/android/nsGeckoUtils.cpp @@ -44,7 +44,7 @@ #endif #include - +#include extern "C" __attribute__ ((visibility("default"))) @@ -77,3 +77,34 @@ Java_org_mozilla_gecko_GeckoAppShell_freeDirectBuffer(JNIEnv *jenv, jclass, jobj free(jenv->GetDirectBufferAddress(buf)); } +extern "C" +__attribute__ ((visibility("default"))) +void JNICALL +Java_org_mozilla_gecko_GeckoAppShell_unlockDatabaseFile(JNIEnv *jenv, jclass, jstring jDatabasePath) +{ + const char *databasePath = jenv->GetStringUTFChars(jDatabasePath, NULL); + int fd = open(databasePath, O_RDWR); + jenv->ReleaseStringUTFChars(jDatabasePath, databasePath); + + // File could not be open, do nothing + if (fd < 0) { + return; + } + + struct flock lock; + + lock.l_type = F_WRLCK; + lock.l_whence = SEEK_SET; + lock.l_start = 0; + lock.l_len = 0; + + int result = fcntl(fd, F_GETLK, &lock); + + // Release any existing lock in the file + if (result != -1 && lock.l_type == F_WRLCK) { + lock.l_type = F_UNLCK; + fcntl(fd, F_SETLK, &lock); + } + + close(fd); +} \ No newline at end of file From c05d87817a26488ea0989f17cae3fac2a2b884b7 Mon Sep 17 00:00:00 2001 From: Lucas Rocha Date: Tue, 24 Apr 2012 16:34:03 -0400 Subject: [PATCH 036/182] Bug 746444 - Force unlock database file when database is opened in read-only mode (r=blassey) --- .../android/base/db/BrowserProvider.java.in | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/mobile/android/base/db/BrowserProvider.java.in b/mobile/android/base/db/BrowserProvider.java.in index c3cbb1ee04e..a2f908b5732 100644 --- a/mobile/android/base/db/BrowserProvider.java.in +++ b/mobile/android/base/db/BrowserProvider.java.in @@ -21,6 +21,7 @@ import java.util.Random; import java.util.regex.Pattern; import java.util.regex.Matcher; +import org.mozilla.gecko.GeckoAppShell; import org.mozilla.gecko.GeckoBackgroundThread; import org.mozilla.gecko.GeckoProfile; import org.mozilla.gecko.R; @@ -946,6 +947,35 @@ public class BrowserProvider extends ContentProvider { } } + private void ensureDatabaseIsNotLocked(DatabaseHelper dbHelper, String profile, boolean isTest) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + // The returned writable database is read-only, this probably means that the + // database is permanently locked due to a crash or a non-clean quit in Fennec. + // We can assume it's safe to forcefully unlock the database file in this case + // as all database access happens through this content provider (see bug 741718). + if (db.isReadOnly()) { + debug("Database is in read-only mode, trying to forcefully unlock the database file"); + + // Close read-only connection, we don't want to use it + dbHelper.close(); + + // When running inside a test or on Android releases older than 8, + // the returned database path is just filename, not the full path. + // We need to full path when unlocking the database. + String databasePath = getDatabasePath(profile, false); + if (isTest || Build.VERSION.SDK_INT <= 8) { + databasePath = mContext.getDatabasePath(databasePath).getAbsolutePath(); + } + + // Forcefully unlock the database file + GeckoAppShell.unlockDatabaseFile(databasePath); + + // TODO: maybe check if the connection is still read-only and let the + // user know that the device needs rebooting? + } + } + private DatabaseHelper getDatabaseHelperForProfile(String profile, boolean isTest) { // Each profile has a separate browser.db database. The target // profile is provided using a URI query argument in each request @@ -964,6 +994,8 @@ public class BrowserProvider extends ContentProvider { } dbHelper = new DatabaseHelper(getContext(), getDatabasePath(profile, isTest)); mDatabasePerProfile.put(profile, dbHelper); + + ensureDatabaseIsNotLocked(dbHelper, profile, isTest); } debug("Created database helper for profile: " + profile); From 1c968f999d7d62e2834b839e21b05a625f06ccf0 Mon Sep 17 00:00:00 2001 From: Bill McCloskey Date: Tue, 24 Apr 2012 13:36:20 -0700 Subject: [PATCH 037/182] Bug 744727 - Fix methodjit register alloc bug (r=bhackett) --- js/src/methodjit/Compiler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/methodjit/Compiler.cpp b/js/src/methodjit/Compiler.cpp index 8169b86be58..f9d47fdd84c 100644 --- a/js/src/methodjit/Compiler.cpp +++ b/js/src/methodjit/Compiler.cpp @@ -5352,12 +5352,12 @@ mjit::Compiler::jsop_setprop(PropertyName *name, bool popGuaranteed) types->addFreeze(cx); uint32_t slot = propertyTypes->definiteSlot(); RegisterID reg = frame.tempRegForData(lhs); + frame.pinReg(reg); bool isObject = lhs->isTypeKnown(); MaybeJump notObject; if (!isObject) notObject = frame.testObject(Assembler::NotEqual, lhs); #ifdef JSGC_INCREMENTAL_MJ - frame.pinReg(reg); if (cx->compartment->needsBarrier() && propertyTypes->needsBarrier(cx)) { /* Write barrier. */ Jump j = masm.testGCThing(Address(reg, JSObject::getFixedSlotOffset(slot))); @@ -5368,7 +5368,6 @@ mjit::Compiler::jsop_setprop(PropertyName *name, bool popGuaranteed) OOL_STUBCALL(stubs::GCThingWriteBarrier, REJOIN_NONE); stubcc.rejoin(Changes(0)); } - frame.unpinReg(reg); #endif if (!isObject) { stubcc.linkExit(notObject.get(), Uses(2)); @@ -5377,6 +5376,7 @@ mjit::Compiler::jsop_setprop(PropertyName *name, bool popGuaranteed) OOL_STUBCALL(STRICT_VARIANT(stubs::SetName), REJOIN_FALLTHROUGH); } frame.storeTo(rhs, Address(reg, JSObject::getFixedSlotOffset(slot)), popGuaranteed); + frame.unpinReg(reg); frame.shimmy(1); if (!isObject) stubcc.rejoin(Changes(1)); From fca221b6353276d3402debdec8fd47a07c97cf88 Mon Sep 17 00:00:00 2001 From: Jose Antonio Olivera Ortega Date: Tue, 24 Apr 2012 17:46:42 -0300 Subject: [PATCH 038/182] Bug 741862 - B2G 3G: Settings API hookup. r=philikon a=b2g-only --- b2g/app/b2g.js | 9 ---- b2g/chrome/content/shell.js | 48 ++++++++++++++++++++ dom/system/gonk/NetworkManager.js | 2 +- dom/system/gonk/RadioInterfaceLayer.js | 63 +++++++++++++++++++++----- 4 files changed, 101 insertions(+), 21 deletions(-) diff --git a/b2g/app/b2g.js b/b2g/app/b2g.js index 6725d78892c..52e5afa7d19 100644 --- a/b2g/app/b2g.js +++ b/b2g/app/b2g.js @@ -475,15 +475,6 @@ pref("full-screen-api.enabled", true); pref("media.volume.steps", 10); -// Data connection settings. These will eventually live in the -// navigator.settings API, or even in a database where we can look -// it up automatically (bug 729440), but for this will have to do. -pref("ril.data.enabled", false); -pref("ril.data.roaming.enabled", false); -pref("ril.data.apn", ""); -pref("ril.data.user", ""); -pref("ril.data.passwd", ""); - //Enable/disable marionette server, set listening port pref("marionette.defaultPrefs.enabled", true); pref("marionette.defaultPrefs.port", 2828); diff --git a/b2g/chrome/content/shell.js b/b2g/chrome/content/shell.js index e0cc13db37e..df2dbc61c39 100644 --- a/b2g/chrome/content/shell.js +++ b/b2g/chrome/content/shell.js @@ -365,6 +365,54 @@ var shell = { }; })(); +const DATA_CALL_SETTING_BOLKEYS = ["ril.data.enabled", + "ril.data.roaming.enabled"]; +const DATA_CALL_SETTING_CHARKEYS = ["ril.data.apn", + "ril.data.user", + "ril.data.passwd"]; +(function DataCallSettings() { + let sm = navigator.mozSettings; + let lock = sm.getLock(); + DATA_CALL_SETTING_BOLKEYS.forEach(function(key) { + let request = lock.get(key); + request.onsuccess = function onSuccess() { + let value = request.result[key] || false; + Services.prefs.setBoolPref(key, value); + dump("DataCallSettings - " + key + ":" + value); + }; + request.onerror = function onError() { + Services.prefs.setBoolPref(key, false); + }; + }); + + DATA_CALL_SETTING_CHARKEYS.forEach(function(key) { + let request = lock.get(key); + request.onsuccess = function onSuccess() { + let value = request.result[key] || ""; + Services.prefs.setCharPref(key, value); + dump("DataCallSettings - " + key + ":" + value); + }; + request.onerror = function onError() { + Services.prefs.setCharPref(key, ""); + }; + }); + + navigator.mozSettings.onsettingchange = function onSettingChange(e) { + dump("DataCallSettings - onsettingchange: " + e.settingName + + ": " + e.settingValue); + if (e.settingValue) { + if (DATA_CALL_SETTING_BOLKEYS.indexOf(e.settingName) > -1 ) { + Services.prefs.setBoolPref(e.settingName, e.settingValue); + return; + } + if (DATA_CALL_SETTING_CHARKEYS.indexOf(e.settingName) > -1) { + Services.prefs.setCharPref(e.settingName, e.settingValue); + } + } + }; + +})(); + function nsBrowserAccess() { } diff --git a/dom/system/gonk/NetworkManager.js b/dom/system/gonk/NetworkManager.js index 6eec61a28bc..345a2ebd958 100644 --- a/dom/system/gonk/NetworkManager.js +++ b/dom/system/gonk/NetworkManager.js @@ -173,7 +173,7 @@ NetworkManager.prototype = { break; } } - if (oldActive != this.active) { + if (this.active && (oldActive != this.active)) { this.setDefaultRouteAndDNS(); } }, diff --git a/dom/system/gonk/RadioInterfaceLayer.js b/dom/system/gonk/RadioInterfaceLayer.js index effb45a0c16..d8c3ea4d49e 100644 --- a/dom/system/gonk/RadioInterfaceLayer.js +++ b/dom/system/gonk/RadioInterfaceLayer.js @@ -60,6 +60,7 @@ const nsIRadioInterfaceLayer = Ci.nsIRadioInterfaceLayer; const kNetworkInterfaceStateChangedTopic = "network-interface-state-changed"; const kSmsReceivedObserverTopic = "sms-received"; const kSmsDeliveredObserverTopic = "sms-delivered"; +const kMozSettingsChangedObserverTopic = "mozsettings-changed"; const DOM_SMS_DELIVERY_RECEIVED = "received"; const DOM_SMS_DELIVERY_SENT = "sent"; @@ -190,6 +191,7 @@ function RadioInterfaceLayer() { ppmm.addMessageListener(msgname, this); } Services.obs.addObserver(this, "xpcom-shutdown", false); + Services.obs.addObserver(this, kMozSettingsChangedObserverTopic, false); this._sentSmsEnvelopes = {}; this.portAddressedSmsApps = {}; @@ -203,7 +205,8 @@ RadioInterfaceLayer.prototype = { Ci.nsIRadioInterfaceLayer]}), QueryInterface: XPCOMUtils.generateQI([Ci.nsIWorkerHolder, - Ci.nsIRadioInterfaceLayer]), + Ci.nsIRadioInterfaceLayer, + Ci.nsIObserver]), /** * Process a message from the content process. @@ -632,15 +635,44 @@ RadioInterfaceLayer.prototype = { [datacalls, datacalls.length]); }, + /** + * Handle setting changes. + */ + handleMozSettingsChanged: function handleMozSettingsChanged(setting) { + // We only watch at "ril.data.enabled" flag changes for connecting or + // disconnecting the data call. If the value of "ril.data.enabled" is + // true and any of the remaining flags change the setting application + // should turn this flag to false and then to true in order to reload + // the new values and reconnect the data call. + if (setting.key != "ril.data.enabled") { + return; + } + if (!setting.value && RILNetworkInterface.connected) { + debug("Data call settings: disconnect data call."); + RILNetworkInterface.disconnect(); + } + if (setting.value && !RILNetworkInterface.connected) { + debug("Data call settings connect data call."); + RILNetworkInterface.connect(); + } + }, + // nsIObserver observe: function observe(subject, topic, data) { - if (topic == "xpcom-shutdown") { - for each (let msgname in RIL_IPC_MSG_NAMES) { - ppmm.removeMessageListener(msgname, this); - } - Services.obs.removeObserver(this, "xpcom-shutdown"); - ppmm = null; + switch (topic) { + case kMozSettingsChangedObserverTopic: + let setting = JSON.parse(data); + this.handleMozSettingsChanged(setting); + break; + case "xpcom-shutdown": + for each (let msgname in RIL_IPC_MSG_NAMES) { + ppmm.removeMessageListener(msgname, this); + } + ppmm = null; + Services.obs.removeObserver(this, "xpcom-shutdown"); + Services.obs.removeObserver(this, kMozSettingsChangedObserverTopic); + break; } }, @@ -1211,13 +1243,13 @@ let RILNetworkInterface = { // nsIRILDataCallback dataCallStateChanged: function dataCallStateChanged(cid, interfaceName, callState) { + debug("Data call ID: " + cid + ", interface name: " + interfaceName); if (this.connecting && (callState == RIL.GECKO_NETWORK_STATE_CONNECTING || callState == RIL.GECKO_NETWORK_STATE_CONNECTED)) { this.connecting = false; this.cid = cid; this.name = interfaceName; - debug("Data call ID: " + cid + ", interface name: " + interfaceName); if (!this.registeredAsNetworkInterface) { let networkManager = Cc["@mozilla.org/network/manager;1"] .getService(Ci.nsINetworkManager); @@ -1255,11 +1287,14 @@ let RILNetworkInterface = { .getInterface(Ci.nsIRadioInterfaceLayer); }, + get connected() { + return this.state == RIL.GECKO_NETWORK_STATE_CONNECTED; + }, + connect: function connect() { if (this.connecting || this.state == RIL.GECKO_NETWORK_STATE_CONNECTED || - this.state == RIL.GECKO_NETWORK_STATE_SUSPENDED || - this.state == RIL.GECKO_NETWORK_STATE_DISCONNECTING) { + this.state == RIL.GECKO_NETWORK_STATE_SUSPENDED) { return; } if (!this.registeredAsDataCallCallback) { @@ -1286,7 +1321,13 @@ let RILNetworkInterface = { }, disconnect: function disconnect() { - this.mRIL.deactivateDataCall(this.cid); + if (this.state == RIL.GECKO_NETWORK_STATE_DISCONNECTING || + this.state == RIL.GECKO_NETWORK_STATE_DISCONNECTED) { + return; + } + let reason = RIL.DATACALL_DEACTIVATE_NO_REASON; + debug("Going to disconnet data connection " + this.cid); + this.mRIL.deactivateDataCall(this.cid, reason); }, }; From 017428cde1dd1ae0c20964fa40d9a3d6f93c232e Mon Sep 17 00:00:00 2001 From: Brad Lassey Date: Sat, 21 Apr 2012 11:41:03 -0400 Subject: [PATCH 039/182] bug 747642 - cleanup AndroidJNI.cpp r=mwu --- widget/android/AndroidJNI.cpp | 39 +---------------------------------- 1 file changed, 1 insertion(+), 38 deletions(-) diff --git a/widget/android/AndroidJNI.cpp b/widget/android/AndroidJNI.cpp index 38cd25b93fa..ba06dd1e6c9 100644 --- a/widget/android/AndroidJNI.cpp +++ b/widget/android/AndroidJNI.cpp @@ -75,44 +75,6 @@ using namespace mozilla::dom::sms; /* Forward declare all the JNI methods as extern "C" */ extern "C" { - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_nativeInit(JNIEnv *, jclass); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent(JNIEnv *, jclass, jobject event); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_processNextNativeEvent(JNIEnv *, jclass); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_setLayerClient(JNIEnv *jenv, jclass, jobject sv); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_setSurfaceView(JNIEnv *jenv, jclass, jobject sv); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_onResume(JNIEnv *, jclass); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_onLowMemory(JNIEnv *, jclass); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_callObserver(JNIEnv *, jclass, jstring observerKey, jstring topic, jstring data); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_removeObserver(JNIEnv *jenv, jclass, jstring jObserverKey); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_onChangeNetworkLinkStatus(JNIEnv *, jclass, jstring status); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_reportJavaCrash(JNIEnv *, jclass, jstring stack); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_executeNextRunnable(JNIEnv *, jclass); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifyUriVisited(JNIEnv *, jclass, jstring uri); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifyBatteryChange(JNIEnv* jenv, jclass, jdouble, jboolean, jdouble); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifySmsReceived(JNIEnv* jenv, jclass, jstring, jstring, jlong); - NS_EXPORT PRInt32 JNICALL Java_org_mozilla_gecko_GeckoAppShell_saveMessageInSentbox(JNIEnv* jenv, jclass, jstring, jstring, jlong); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifySmsSent(JNIEnv* jenv, jclass, jint, jstring, jstring, jlong, jint, jlong); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifySmsDelivered(JNIEnv* jenv, jclass, jint, jstring, jstring, jlong); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifySmsSendFailed(JNIEnv* jenv, jclass, jint, jint, jlong); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifyGetSms(JNIEnv* jenv, jclass, jint, jstring, jstring, jstring, jlong, jint, jlong); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifyGetSmsFailed(JNIEnv* jenv, jclass, jint, jint, jlong); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleted(JNIEnv* jenv, jclass, jboolean, jint, jlong); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleteFailed(JNIEnv* jenv, jclass, jint, jint, jlong); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifyNoMessageInList(JNIEnv* jenv, jclass, jint, jlong); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifyListCreated(JNIEnv* jenv, jclass, jint, jint, jstring, jstring, jstring, jlong, jint, jlong); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifyGotNextMessage(JNIEnv* jenv, jclass, jint, jstring, jstring, jstring, jlong, jint, jlong); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifyReadingMessageListFailed(JNIEnv* jenv, jclass, jint, jint, jlong); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_notifyFilePickerResult(JNIEnv* jenv, jclass, jstring fileDir, jlong callback); - -#ifdef MOZ_JAVA_COMPOSITOR - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_scheduleComposite(JNIEnv* jenv, jclass); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_schedulePauseComposition(JNIEnv* jenv, jclass); - NS_EXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_scheduleResumeComposition(JNIEnv* jenv, jclass, jint, jint); -#endif - -} - - /* * Incoming JNI methods */ @@ -935,4 +897,5 @@ Java_org_mozilla_gecko_GeckoAppShell_notifyFilePickerResult(JNIEnv* jenv, jclass NS_DispatchToMainThread(runnable); } +} #endif From ebafdfcab035d130ec01250bbbd7720c98f3bf73 Mon Sep 17 00:00:00 2001 From: Steve Fink Date: Sat, 21 Apr 2012 15:51:04 -0700 Subject: [PATCH 040/182] Bug 748109 - jstests.py cannot find any test cases. r=terrence When I do: cd js/src/tests python jstests.py $js_bin js1_8_5/extensions it is unable to find any tests to run because it's looking relative to the jstests.py script, but at least in this case that is a relative path (plain "jstests.py") so os.path.dirname(__file__) is the empty string and that doesn't seem to work very well. --HG-- extra : rebase_source : 1cdc461680ceadba26fc512a50d9c7247a187744 --- js/src/tests/jstests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/tests/jstests.py b/js/src/tests/jstests.py index 8403a61613f..a32ba49377c 100755 --- a/js/src/tests/jstests.py +++ b/js/src/tests/jstests.py @@ -147,7 +147,7 @@ if __name__ == '__main__': xul_info = manifest.XULInfo(xul_abi, xul_os, xul_debug) xul_tester = manifest.XULInfoTester(xul_info, JS) - test_dir = os.path.dirname(__file__) + test_dir = os.path.dirname(os.path.realpath(__file__)) test_list = manifest.load(test_dir, xul_tester) skipped_list = [] From 73e692d5bb8ee2ec62c801baae1b62e6c2068529 Mon Sep 17 00:00:00 2001 From: Steve Fink Date: Wed, 28 Mar 2012 14:43:01 -0700 Subject: [PATCH 041/182] Bug 741040 - Make an ArrayBufferObject subclass of JSOBject. r=Waldo --HG-- extra : rebase_source : 63dd1cc69cfae37203c1f037d5a4b0b5c5651e7b --- js/src/jsapi.cpp | 2 +- js/src/jsclone.cpp | 15 +- js/src/jsinfer.cpp | 2 +- js/src/jsobj.h | 7 +- js/src/jstypedarray.cpp | 349 ++++++++++++++++++----------------- js/src/jstypedarray.h | 43 +++-- js/src/jstypedarrayinlines.h | 24 ++- js/src/vm/ObjectImpl.h | 2 + 8 files changed, 242 insertions(+), 202 deletions(-) diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index 15ef83cd1dc..7f0b5687228 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -1782,7 +1782,7 @@ static JSStdName standard_class_atoms[] = { {js_InitIteratorClasses, EAGER_ATOM_AND_CLASP(StopIteration)}, #endif {js_InitJSONClass, EAGER_ATOM_AND_CLASP(JSON)}, - {js_InitTypedArrayClasses, EAGER_CLASS_ATOM(ArrayBuffer), &js::ArrayBuffer::slowClass}, + {js_InitTypedArrayClasses, EAGER_CLASS_ATOM(ArrayBuffer), &js::ArrayBufferObject::protoClass}, {js_InitWeakMapClass, EAGER_CLASS_ATOM(WeakMap), &js::WeakMapClass}, {js_InitMapClass, EAGER_CLASS_ATOM(Map), &js::MapObject::class_}, {js_InitSetClass, EAGER_CLASS_ATOM(Set), &js::SetObject::class_}, diff --git a/js/src/jsclone.cpp b/js/src/jsclone.cpp index 65d815edc64..865c44c4c59 100644 --- a/js/src/jsclone.cpp +++ b/js/src/jsclone.cpp @@ -461,9 +461,9 @@ JSStructuredCloneWriter::writeTypedArray(JSObject *obj) bool JSStructuredCloneWriter::writeArrayBuffer(JSObject *obj) { - obj = ArrayBuffer::getArrayBuffer(obj); - return out.writePair(SCTAG_ARRAY_BUFFER_OBJECT, obj->arrayBufferByteLength()) && - out.writeBytes(obj->arrayBufferDataOffset(), obj->arrayBufferByteLength()); + ArrayBufferObject &buffer = obj->asArrayBuffer(); + return out.writePair(SCTAG_ARRAY_BUFFER_OBJECT, buffer.byteLength()) && + out.writeBytes(buffer.dataPointer(), buffer.byteLength()); } bool @@ -573,7 +573,7 @@ JSStructuredCloneWriter::startWrite(const Value &v) return startObject(obj); } else if (obj->isTypedArray()) { return writeTypedArray(obj); - } else if (obj->isArrayBuffer()) { + } else if (obj->isArrayBuffer() && obj->asArrayBuffer().hasData()) { return writeArrayBuffer(obj); } else if (obj->isBoolean()) { return out.writePair(SCTAG_BOOLEAN_OBJECT, obj->asBoolean().unbox()); @@ -778,12 +778,13 @@ JSStructuredCloneReader::readTypedArray(uint32_t tag, uint32_t nelems, Value *vp bool JSStructuredCloneReader::readArrayBuffer(uint32_t nbytes, Value *vp) { - JSObject *obj = ArrayBuffer::create(context(), nbytes); + JSObject *obj = ArrayBufferObject::create(context(), nbytes); if (!obj) return false; vp->setObject(*obj); - JS_ASSERT(obj->arrayBufferByteLength() == nbytes); - return in.readArray(obj->arrayBufferDataOffset(), nbytes); + ArrayBufferObject &buffer = obj->asArrayBuffer(); + JS_ASSERT(buffer.byteLength() == nbytes); + return in.readArray(buffer.dataPointer(), nbytes); } bool diff --git a/js/src/jsinfer.cpp b/js/src/jsinfer.cpp index d50a14182e2..54d3706a1a3 100644 --- a/js/src/jsinfer.cpp +++ b/js/src/jsinfer.cpp @@ -1778,7 +1778,7 @@ TypeSet::getTypedArrayType(JSContext *cx) if (!proto) continue; - int objArrayType = proto->getClass() - TypedArray::slowClasses; + int objArrayType = proto->getClass() - TypedArray::protoClasses; JS_ASSERT(objArrayType >= 0 && objArrayType < TypedArray::TYPE_MAX); /* diff --git a/js/src/jsobj.h b/js/src/jsobj.h index 765b6173e1c..65e85e0c64d 100644 --- a/js/src/jsobj.h +++ b/js/src/jsobj.h @@ -255,6 +255,7 @@ extern Class WithClass; extern Class XMLFilterClass; class ArgumentsObject; +class ArrayBufferObject; class BlockObject; class BooleanObject; class ClonedBlockObject; @@ -627,11 +628,6 @@ struct JSObject : public js::ObjectImpl */ bool arrayGetOwnDataElement(JSContext *cx, size_t i, js::Value *vp); - public: - bool allocateArrayBufferSlots(JSContext *cx, uint32_t size, uint8_t *contents = NULL); - inline uint32_t arrayBufferByteLength(); - inline uint8_t * arrayBufferDataOffset(); - public: /* * Date-specific getters and setters. @@ -965,6 +961,7 @@ struct JSObject : public js::ObjectImpl inline bool isCrossCompartmentWrapper() const; inline js::ArgumentsObject &asArguments(); + inline js::ArrayBufferObject &asArrayBuffer(); inline const js::ArgumentsObject &asArguments() const; inline js::BlockObject &asBlock(); inline js::BooleanObject &asBoolean(); diff --git a/js/src/jstypedarray.cpp b/js/src/jstypedarray.cpp index c8241522485..ea44d7537e8 100644 --- a/js/src/jstypedarray.cpp +++ b/js/src/jstypedarray.cpp @@ -111,7 +111,7 @@ ValueIsLength(JSContext *cx, const Value &v, uint32_t *len) /* * Convert |v| to an array index for an array of length |length| per * the Typed Array Specification section 7.0, |subarray|. If successful, - * the output value is in the range [0, length). + * the output value is in the range [0, length). */ static bool ToClampedIndex(JSContext *cx, const Value &v, int32_t length, int32_t *out) @@ -142,7 +142,7 @@ ToClampedIndex(JSContext *cx, const Value &v, int32_t length, int32_t *out) * first. */ JSObject * -ArrayBuffer::getArrayBuffer(JSObject *obj) +ArrayBufferObject::getArrayBuffer(JSObject *obj) { while (obj && !obj->isArrayBuffer()) obj = obj->getProto(); @@ -150,19 +150,21 @@ ArrayBuffer::getArrayBuffer(JSObject *obj) } JSBool -ArrayBuffer::prop_getByteLength(JSContext *cx, JSObject *obj, jsid id, Value *vp) +ArrayBufferObject::prop_getByteLength(JSContext *cx, JSObject *obj, jsid id, Value *vp) { - JSObject *arrayBuffer = getArrayBuffer(obj); - if (!arrayBuffer) { + JSObject *bufobj = getArrayBuffer(obj); + if (!bufobj) { vp->setInt32(0); return true; } - vp->setInt32(int32_t(arrayBuffer->arrayBufferByteLength())); + + ArrayBufferObject &arrayBuffer = bufobj->asArrayBuffer(); + vp->setInt32(int32_t(arrayBuffer.byteLength())); return true; } JSBool -ArrayBuffer::fun_slice(JSContext *cx, unsigned argc, Value *vp) +ArrayBufferObject::fun_slice(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); @@ -171,12 +173,10 @@ ArrayBuffer::fun_slice(JSContext *cx, unsigned argc, Value *vp) if (!obj) return ok; - JSObject *arrayBuffer = getArrayBuffer(obj); - if (!arrayBuffer) - return true; + ArrayBufferObject &arrayBuffer = obj->asArrayBuffer(); // these are the default values - int32_t length = int32_t(arrayBuffer->arrayBufferByteLength()); + int32_t length = int32_t(arrayBuffer.byteLength()); int32_t begin = 0, end = length; if (args.length() > 0) { @@ -203,13 +203,23 @@ ArrayBuffer::fun_slice(JSContext *cx, unsigned argc, Value *vp) * new ArrayBuffer(byteLength) */ JSBool -ArrayBuffer::class_constructor(JSContext *cx, unsigned argc, Value *vp) +ArrayBufferObject::class_constructor(JSContext *cx, unsigned argc, Value *vp) { int32_t nbytes = 0; if (argc > 0 && !ToInt32(cx, vp[2], &nbytes)) return false; - JSObject *bufobj = create(cx, nbytes); + if (nbytes < 0) { + /* + * We're just not going to support arrays that are bigger than what will fit + * as an integer value; if someone actually ever complains (validly), then we + * can fix. + */ + JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_ARRAY_LENGTH); + return false; + } + + JSObject *bufobj = create(cx, uint32_t(nbytes)); if (!bufobj) return false; vp->setObject(*bufobj); @@ -217,10 +227,10 @@ ArrayBuffer::class_constructor(JSContext *cx, unsigned argc, Value *vp) } bool -JSObject::allocateArrayBufferSlots(JSContext *cx, uint32_t size, uint8_t *contents) +ArrayBufferObject::allocateSlots(JSContext *cx, uint32_t size, uint8_t *contents) { /* - * ArrayBuffer objects delegate added properties to another JSObject, so + * ArrayBufferObjects delegate added properties to another JSObject, so * their internal layout can use the object's fixed slots for storage. * Set up the object to look like an array with an elements header. */ @@ -270,9 +280,9 @@ DelegateObject(JSContext *cx, JSObject *obj) } JSObject * -ArrayBuffer::create(JSContext *cx, int32_t nbytes, uint8_t *contents) +ArrayBufferObject::create(JSContext *cx, uint32_t nbytes, uint8_t *contents) { - JSObject *obj = NewBuiltinClassInstance(cx, &ArrayBuffer::slowClass); + JSObject *obj = NewBuiltinClassInstance(cx, &ArrayBufferObject::protoClass); if (!obj) return NULL; #ifdef JS_THREADSAFE @@ -281,17 +291,7 @@ ArrayBuffer::create(JSContext *cx, int32_t nbytes, uint8_t *contents) JS_ASSERT(obj->getAllocKind() == gc::FINALIZE_OBJECT16); #endif - if (nbytes < 0) { - /* - * We're just not going to support arrays that are bigger than what will fit - * as an integer value; if someone actually ever complains (validly), then we - * can fix. - */ - JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_ARRAY_LENGTH); - return NULL; - } - - JS_ASSERT(obj->getClass() == &ArrayBuffer::slowClass); + JS_ASSERT(obj->getClass() == &ArrayBufferObject::protoClass); js::Shape *empty = EmptyShape::getInitialShape(cx, &ArrayBufferClass, obj->getProto(), obj->getParent(), @@ -304,31 +304,29 @@ ArrayBuffer::create(JSContext *cx, int32_t nbytes, uint8_t *contents) * The first 8 bytes hold the length. * The rest of it is a flat data store for the array buffer. */ - if (!obj->allocateArrayBufferSlots(cx, nbytes, contents)) + if (!obj->asArrayBuffer().allocateSlots(cx, nbytes, contents)) return NULL; return obj; } JSObject * -ArrayBuffer::createSlice(JSContext *cx, JSObject *arrayBuffer, uint32_t begin, uint32_t end) +ArrayBufferObject::createSlice(JSContext *cx, ArrayBufferObject &arrayBuffer, + uint32_t begin, uint32_t end) { - JS_ASSERT(arrayBuffer->isArrayBuffer()); - JS_ASSERT(begin <= arrayBuffer->arrayBufferByteLength()); - JS_ASSERT(end <= arrayBuffer->arrayBufferByteLength()); - + JS_ASSERT(begin <= arrayBuffer.byteLength()); + JS_ASSERT(end <= arrayBuffer.byteLength()); JS_ASSERT(begin <= end); uint32_t length = end - begin; - return create(cx, length, arrayBuffer->arrayBufferDataOffset() + begin); -} + if (arrayBuffer.hasData()) + return create(cx, length, arrayBuffer.dataPointer() + begin); -ArrayBuffer::~ArrayBuffer() -{ + return create(cx, 0); } void -ArrayBuffer::obj_trace(JSTracer *trc, JSObject *obj) +ArrayBufferObject::obj_trace(JSTracer *trc, JSObject *obj) { /* * If this object changes, it will get marked via the private data barrier, @@ -344,8 +342,8 @@ ArrayBuffer::obj_trace(JSTracer *trc, JSObject *obj) static JSProperty * const PROPERTY_FOUND = reinterpret_cast(1); JSBool -ArrayBuffer::obj_lookupGeneric(JSContext *cx, JSObject *obj, jsid id, - JSObject **objp, JSProperty **propp) +ArrayBufferObject::obj_lookupGeneric(JSContext *cx, JSObject *obj, jsid id, + JSObject **objp, JSProperty **propp) { if (JSID_IS_ATOM(id, cx->runtime->atomState.byteLengthAtom)) { *propp = PROPERTY_FOUND; @@ -384,15 +382,15 @@ ArrayBuffer::obj_lookupGeneric(JSContext *cx, JSObject *obj, jsid id, } JSBool -ArrayBuffer::obj_lookupProperty(JSContext *cx, JSObject *obj, PropertyName *name, - JSObject **objp, JSProperty **propp) +ArrayBufferObject::obj_lookupProperty(JSContext *cx, JSObject *obj, PropertyName *name, + JSObject **objp, JSProperty **propp) { return obj_lookupGeneric(cx, obj, ATOM_TO_JSID(name), objp, propp); } JSBool -ArrayBuffer::obj_lookupElement(JSContext *cx, JSObject *obj, uint32_t index, - JSObject **objp, JSProperty **propp) +ArrayBufferObject::obj_lookupElement(JSContext *cx, JSObject *obj, uint32_t index, + JSObject **objp, JSProperty **propp) { JSObject *delegate = DelegateObject(cx, obj); if (!delegate) @@ -422,15 +420,15 @@ ArrayBuffer::obj_lookupElement(JSContext *cx, JSObject *obj, uint32_t index, } JSBool -ArrayBuffer::obj_lookupSpecial(JSContext *cx, JSObject *obj, SpecialId sid, - JSObject **objp, JSProperty **propp) +ArrayBufferObject::obj_lookupSpecial(JSContext *cx, JSObject *obj, SpecialId sid, + JSObject **objp, JSProperty **propp) { return obj_lookupGeneric(cx, obj, SPECIALID_TO_JSID(sid), objp, propp); } JSBool -ArrayBuffer::obj_defineGeneric(JSContext *cx, JSObject *obj, jsid id, const Value *v, - PropertyOp getter, StrictPropertyOp setter, unsigned attrs) +ArrayBufferObject::obj_defineGeneric(JSContext *cx, JSObject *obj, jsid id, const Value *v, + PropertyOp getter, StrictPropertyOp setter, unsigned attrs) { if (JSID_IS_ATOM(id, cx->runtime->atomState.byteLengthAtom)) return true; @@ -442,15 +440,16 @@ ArrayBuffer::obj_defineGeneric(JSContext *cx, JSObject *obj, jsid id, const Valu } JSBool -ArrayBuffer::obj_defineProperty(JSContext *cx, JSObject *obj, PropertyName *name, const Value *v, - PropertyOp getter, StrictPropertyOp setter, unsigned attrs) +ArrayBufferObject::obj_defineProperty(JSContext *cx, JSObject *obj, + PropertyName *name, const Value *v, + PropertyOp getter, StrictPropertyOp setter, unsigned attrs) { return obj_defineGeneric(cx, obj, ATOM_TO_JSID(name), v, getter, setter, attrs); } JSBool -ArrayBuffer::obj_defineElement(JSContext *cx, JSObject *obj, uint32_t index, const Value *v, - PropertyOp getter, StrictPropertyOp setter, unsigned attrs) +ArrayBufferObject::obj_defineElement(JSContext *cx, JSObject *obj, uint32_t index, const Value *v, + PropertyOp getter, StrictPropertyOp setter, unsigned attrs) { JSObject *delegate = DelegateObject(cx, obj); if (!delegate) @@ -459,18 +458,19 @@ ArrayBuffer::obj_defineElement(JSContext *cx, JSObject *obj, uint32_t index, con } JSBool -ArrayBuffer::obj_defineSpecial(JSContext *cx, JSObject *obj, SpecialId sid, const Value *v, - PropertyOp getter, StrictPropertyOp setter, unsigned attrs) +ArrayBufferObject::obj_defineSpecial(JSContext *cx, JSObject *obj, SpecialId sid, const Value *v, + PropertyOp getter, StrictPropertyOp setter, unsigned attrs) { return obj_defineGeneric(cx, obj, SPECIALID_TO_JSID(sid), v, getter, setter, attrs); } JSBool -ArrayBuffer::obj_getGeneric(JSContext *cx, JSObject *obj, JSObject *receiver, jsid id, Value *vp) +ArrayBufferObject::obj_getGeneric(JSContext *cx, JSObject *obj, JSObject *receiver, jsid id, Value *vp) { obj = getArrayBuffer(obj); + JS_ASSERT(obj); if (JSID_IS_ATOM(id, cx->runtime->atomState.byteLengthAtom)) { - vp->setInt32(obj->arrayBufferByteLength()); + vp->setInt32(obj->asArrayBuffer().byteLength()); return true; } @@ -481,12 +481,12 @@ ArrayBuffer::obj_getGeneric(JSContext *cx, JSObject *obj, JSObject *receiver, js } JSBool -ArrayBuffer::obj_getProperty(JSContext *cx, JSObject *obj, JSObject *receiver, PropertyName *name, - Value *vp) +ArrayBufferObject::obj_getProperty(JSContext *cx, JSObject *obj, + JSObject *receiver, PropertyName *name, Value *vp) { obj = getArrayBuffer(obj); if (name == cx->runtime->atomState.byteLengthAtom) { - vp->setInt32(obj->arrayBufferByteLength()); + vp->setInt32(obj->asArrayBuffer().byteLength()); return true; } @@ -497,7 +497,8 @@ ArrayBuffer::obj_getProperty(JSContext *cx, JSObject *obj, JSObject *receiver, P } JSBool -ArrayBuffer::obj_getElement(JSContext *cx, JSObject *obj, JSObject *receiver, uint32_t index, Value *vp) +ArrayBufferObject::obj_getElement(JSContext *cx, JSObject *obj, + JSObject *receiver, uint32_t index, Value *vp) { RootedVarObject delegate(cx, DelegateObject(cx, getArrayBuffer(obj))); if (!delegate) @@ -506,8 +507,8 @@ ArrayBuffer::obj_getElement(JSContext *cx, JSObject *obj, JSObject *receiver, ui } JSBool -ArrayBuffer::obj_getElementIfPresent(JSContext *cx, JSObject *obj, JSObject *receiver, - uint32_t index, Value *vp, bool *present) +ArrayBufferObject::obj_getElementIfPresent(JSContext *cx, JSObject *obj, JSObject *receiver, + uint32_t index, Value *vp, bool *present) { JSObject *delegate = DelegateObject(cx, getArrayBuffer(obj)); if (!delegate) @@ -516,13 +517,14 @@ ArrayBuffer::obj_getElementIfPresent(JSContext *cx, JSObject *obj, JSObject *rec } JSBool -ArrayBuffer::obj_getSpecial(JSContext *cx, JSObject *obj, JSObject *receiver, SpecialId sid, Value *vp) +ArrayBufferObject::obj_getSpecial(JSContext *cx, JSObject *obj, + JSObject *receiver, SpecialId sid, Value *vp) { return obj_getGeneric(cx, obj, receiver, SPECIALID_TO_JSID(sid), vp); } JSBool -ArrayBuffer::obj_setGeneric(JSContext *cx, JSObject *obj, jsid id, Value *vp, JSBool strict) +ArrayBufferObject::obj_setGeneric(JSContext *cx, JSObject *obj, jsid id, Value *vp, JSBool strict) { if (JSID_IS_ATOM(id, cx->runtime->atomState.byteLengthAtom)) return true; @@ -577,13 +579,15 @@ ArrayBuffer::obj_setGeneric(JSContext *cx, JSObject *obj, jsid id, Value *vp, JS } JSBool -ArrayBuffer::obj_setProperty(JSContext *cx, JSObject *obj, PropertyName *name, Value *vp, JSBool strict) +ArrayBufferObject::obj_setProperty(JSContext *cx, JSObject *obj, + PropertyName *name, Value *vp, JSBool strict) { return obj_setGeneric(cx, obj, ATOM_TO_JSID(name), vp, strict); } JSBool -ArrayBuffer::obj_setElement(JSContext *cx, JSObject *obj, uint32_t index, Value *vp, JSBool strict) +ArrayBufferObject::obj_setElement(JSContext *cx, JSObject *obj, + uint32_t index, Value *vp, JSBool strict) { RootedVarObject delegate(cx, DelegateObject(cx, obj)); if (!delegate) @@ -593,13 +597,15 @@ ArrayBuffer::obj_setElement(JSContext *cx, JSObject *obj, uint32_t index, Value } JSBool -ArrayBuffer::obj_setSpecial(JSContext *cx, JSObject *obj, SpecialId sid, Value *vp, JSBool strict) +ArrayBufferObject::obj_setSpecial(JSContext *cx, JSObject *obj, + SpecialId sid, Value *vp, JSBool strict) { return obj_setGeneric(cx, obj, SPECIALID_TO_JSID(sid), vp, strict); } JSBool -ArrayBuffer::obj_getGenericAttributes(JSContext *cx, JSObject *obj, jsid id, unsigned *attrsp) +ArrayBufferObject::obj_getGenericAttributes(JSContext *cx, JSObject *obj, + jsid id, unsigned *attrsp) { if (JSID_IS_ATOM(id, cx->runtime->atomState.byteLengthAtom)) { *attrsp = JSPROP_PERMANENT | JSPROP_READONLY; @@ -613,13 +619,15 @@ ArrayBuffer::obj_getGenericAttributes(JSContext *cx, JSObject *obj, jsid id, uns } JSBool -ArrayBuffer::obj_getPropertyAttributes(JSContext *cx, JSObject *obj, PropertyName *name, unsigned *attrsp) +ArrayBufferObject::obj_getPropertyAttributes(JSContext *cx, JSObject *obj, + PropertyName *name, unsigned *attrsp) { return obj_getGenericAttributes(cx, obj, ATOM_TO_JSID(name), attrsp); } JSBool -ArrayBuffer::obj_getElementAttributes(JSContext *cx, JSObject *obj, uint32_t index, unsigned *attrsp) +ArrayBufferObject::obj_getElementAttributes(JSContext *cx, JSObject *obj, + uint32_t index, unsigned *attrsp) { JSObject *delegate = DelegateObject(cx, obj); if (!delegate) @@ -628,13 +636,15 @@ ArrayBuffer::obj_getElementAttributes(JSContext *cx, JSObject *obj, uint32_t ind } JSBool -ArrayBuffer::obj_getSpecialAttributes(JSContext *cx, JSObject *obj, SpecialId sid, unsigned *attrsp) +ArrayBufferObject::obj_getSpecialAttributes(JSContext *cx, JSObject *obj, + SpecialId sid, unsigned *attrsp) { return obj_getGenericAttributes(cx, obj, SPECIALID_TO_JSID(sid), attrsp); } JSBool -ArrayBuffer::obj_setGenericAttributes(JSContext *cx, JSObject *obj, jsid id, unsigned *attrsp) +ArrayBufferObject::obj_setGenericAttributes(JSContext *cx, JSObject *obj, + jsid id, unsigned *attrsp) { if (JSID_IS_ATOM(id, cx->runtime->atomState.byteLengthAtom)) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, @@ -649,13 +659,15 @@ ArrayBuffer::obj_setGenericAttributes(JSContext *cx, JSObject *obj, jsid id, uns } JSBool -ArrayBuffer::obj_setPropertyAttributes(JSContext *cx, JSObject *obj, PropertyName *name, unsigned *attrsp) +ArrayBufferObject::obj_setPropertyAttributes(JSContext *cx, JSObject *obj, + PropertyName *name, unsigned *attrsp) { return obj_setGenericAttributes(cx, obj, ATOM_TO_JSID(name), attrsp); } JSBool -ArrayBuffer::obj_setElementAttributes(JSContext *cx, JSObject *obj, uint32_t index, unsigned *attrsp) +ArrayBufferObject::obj_setElementAttributes(JSContext *cx, JSObject *obj, + uint32_t index, unsigned *attrsp) { JSObject *delegate = DelegateObject(cx, obj); if (!delegate) @@ -664,13 +676,15 @@ ArrayBuffer::obj_setElementAttributes(JSContext *cx, JSObject *obj, uint32_t ind } JSBool -ArrayBuffer::obj_setSpecialAttributes(JSContext *cx, JSObject *obj, SpecialId sid, unsigned *attrsp) +ArrayBufferObject::obj_setSpecialAttributes(JSContext *cx, JSObject *obj, + SpecialId sid, unsigned *attrsp) { return obj_setGenericAttributes(cx, obj, SPECIALID_TO_JSID(sid), attrsp); } JSBool -ArrayBuffer::obj_deleteProperty(JSContext *cx, JSObject *obj, PropertyName *name, Value *rval, JSBool strict) +ArrayBufferObject::obj_deleteProperty(JSContext *cx, JSObject *obj, + PropertyName *name, Value *rval, JSBool strict) { if (name == cx->runtime->atomState.byteLengthAtom) { rval->setBoolean(false); @@ -684,7 +698,8 @@ ArrayBuffer::obj_deleteProperty(JSContext *cx, JSObject *obj, PropertyName *name } JSBool -ArrayBuffer::obj_deleteElement(JSContext *cx, JSObject *obj, uint32_t index, Value *rval, JSBool strict) +ArrayBufferObject::obj_deleteElement(JSContext *cx, JSObject *obj, + uint32_t index, Value *rval, JSBool strict) { JSObject *delegate = DelegateObject(cx, obj); if (!delegate) @@ -693,7 +708,8 @@ ArrayBuffer::obj_deleteElement(JSContext *cx, JSObject *obj, uint32_t index, Val } JSBool -ArrayBuffer::obj_deleteSpecial(JSContext *cx, JSObject *obj, SpecialId sid, Value *rval, JSBool strict) +ArrayBufferObject::obj_deleteSpecial(JSContext *cx, JSObject *obj, + SpecialId sid, Value *rval, JSBool strict) { JSObject *delegate = DelegateObject(cx, obj); if (!delegate) @@ -702,15 +718,15 @@ ArrayBuffer::obj_deleteSpecial(JSContext *cx, JSObject *obj, SpecialId sid, Valu } JSBool -ArrayBuffer::obj_enumerate(JSContext *cx, JSObject *obj, JSIterateOp enum_op, - Value *statep, jsid *idp) +ArrayBufferObject::obj_enumerate(JSContext *cx, JSObject *obj, + JSIterateOp enum_op, Value *statep, jsid *idp) { statep->setNull(); return true; } JSType -ArrayBuffer::obj_typeOf(JSContext *cx, JSObject *obj) +ArrayBufferObject::obj_typeOf(JSContext *cx, JSObject *obj) { return JSTYPE_OBJECT; } @@ -1019,9 +1035,9 @@ class TypedArrayTemplate static const size_t BYTES_PER_ELEMENT = sizeof(ThisType); - static inline Class *slowClass() + static inline Class *protoClass() { - return &TypedArray::slowClasses[ArrayTypeID()]; + return &TypedArray::protoClasses[ArrayTypeID()]; } static inline Class *fastClass() @@ -1367,8 +1383,7 @@ class TypedArrayTemplate static JSObject * createTypedArray(JSContext *cx, JSObject *bufobj, uint32_t byteOffset, uint32_t len) { - JS_ASSERT(bufobj->isArrayBuffer()); - JSObject *obj = NewBuiltinClassInstance(cx, slowClass()); + JSObject *obj = NewBuiltinClassInstance(cx, protoClass()); if (!obj) return NULL; #ifdef JS_THREADSAFE @@ -1381,7 +1396,7 @@ class TypedArrayTemplate * Specialize the type of the object on the current scripted location, * and mark the type as definitely a typed array. */ - JSProtoKey key = JSCLASS_CACHED_PROTO_KEY(slowClass()); + JSProtoKey key = JSCLASS_CACHED_PROTO_KEY(protoClass()); types::TypeObject *type = types::GetTypeCallerInitObject(cx, key); if (!type) return NULL; @@ -1390,24 +1405,21 @@ class TypedArrayTemplate obj->setSlot(FIELD_TYPE, Int32Value(ArrayTypeID())); obj->setSlot(FIELD_BUFFER, ObjectValue(*bufobj)); + JS_ASSERT(bufobj->isArrayBuffer()); + ArrayBufferObject &buffer = bufobj->asArrayBuffer(); + /* * N.B. The base of the array's data is stored in the object's * private data rather than a slot, to avoid alignment restrictions * on private Values. */ - obj->setPrivate(bufobj->arrayBufferDataOffset() + byteOffset); + obj->setPrivate(buffer.dataPointer() + byteOffset); obj->setSlot(FIELD_LENGTH, Int32Value(len)); obj->setSlot(FIELD_BYTEOFFSET, Int32Value(byteOffset)); obj->setSlot(FIELD_BYTELENGTH, Int32Value(len * sizeof(NativeType))); - DebugOnly bufferByteLength = bufobj->arrayBufferByteLength(); - JS_ASSERT(bufferByteLength - getByteOffset(obj) >= getByteLength(obj)); - JS_ASSERT(getByteOffset(obj) <= bufferByteLength); - JS_ASSERT(getBuffer(obj)->arrayBufferDataOffset() <= getDataOffset(obj)); - JS_ASSERT(getDataOffset(obj) <= offsetData(obj, bufferByteLength)); - - JS_ASSERT(obj->getClass() == slowClass()); + JS_ASSERT(obj->getClass() == protoClass()); js::Shape *empty = EmptyShape::getInitialShape(cx, fastClass(), obj->getProto(), obj->getParent(), @@ -1417,6 +1429,12 @@ class TypedArrayTemplate return NULL; obj->setLastPropertyInfallible(empty); + DebugOnly bufferByteLength = buffer.byteLength(); + JS_ASSERT(bufferByteLength - getByteOffset(obj) >= getByteLength(obj)); + JS_ASSERT(getByteOffset(obj) <= bufferByteLength); + JS_ASSERT(buffer.dataPointer() <= getDataOffset(obj)); + JS_ASSERT(getDataOffset(obj) <= offsetData(obj, bufferByteLength)); + JS_ASSERT(obj->numFixedSlots() == NUM_FIXED_SLOTS); return obj; @@ -1431,7 +1449,7 @@ class TypedArrayTemplate static JSBool class_constructor(JSContext *cx, unsigned argc, Value *vp) { - /* N.B. this is a constructor for slowClass, not fastClass! */ + /* N.B. this is a constructor for protoClass, not fastClass! */ JSObject *obj = create(cx, argc, JS_ARGV(cx, vp)); if (!obj) return false; @@ -1620,20 +1638,22 @@ class TypedArrayTemplate public: static JSObject * - createTypedArrayWithBuffer(JSContext *cx, JSObject *buffer, + createTypedArrayWithBuffer(JSContext *cx, JSObject *bufobj, int32_t byteOffsetInt, int32_t lengthInt) { uint32_t boffset = (byteOffsetInt == -1) ? 0 : uint32_t(byteOffsetInt); - if (boffset > buffer->arrayBufferByteLength() || boffset % sizeof(NativeType) != 0) { + ArrayBufferObject &buffer = bufobj->asArrayBuffer(); + + if (boffset > buffer.byteLength() || boffset % sizeof(NativeType) != 0) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_TYPED_ARRAY_BAD_ARGS); return NULL; // invalid byteOffset } uint32_t len; if (lengthInt == -1) { - len = (buffer->arrayBufferByteLength() - boffset) / sizeof(NativeType); - if (len * sizeof(NativeType) != buffer->arrayBufferByteLength() - boffset) { + len = (buffer.byteLength() - boffset) / sizeof(NativeType); + if (len * sizeof(NativeType) != buffer.byteLength() - boffset) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_TYPED_ARRAY_BAD_ARGS); return NULL; // given byte array doesn't map exactly to sizeof(NativeType) * N } @@ -1648,12 +1668,12 @@ class TypedArrayTemplate return NULL; // overflow when calculating boffset + len * sizeof(NativeType) } - if (arrayByteLength + boffset > buffer->arrayBufferByteLength()) { + if (arrayByteLength + boffset > buffer.byteLength()) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_TYPED_ARRAY_BAD_ARGS); return NULL; // boffset + len is too big for the arraybuffer } - return createTypedArray(cx, buffer, boffset, len); + return createTypedArray(cx, bufobj, boffset, len); } static JSObject * @@ -1768,7 +1788,7 @@ class TypedArrayTemplate static bool copyFromArray(JSContext *cx, JSObject *thisTypedArrayObj, - JSObject *ar, uint32_t len, uint32_t offset = 0) + JSObject *ar, uint32_t len, uint32_t offset = 0) { thisTypedArrayObj = getTypedArray(thisTypedArrayObj); JS_ASSERT(thisTypedArrayObj); @@ -1971,8 +1991,8 @@ class TypedArrayTemplate return NULL; } - int32_t bytelen = size * count; - return ArrayBuffer::create(cx, bytelen); + uint32_t bytelen = size * count; + return ArrayBufferObject::create(cx, bytelen); } }; @@ -2106,11 +2126,11 @@ TypedArrayTemplate::copyIndexToValue(JSContext *cx, JSObject *tarray, ui ***/ /* - * ArrayBuffer (base) + * ArrayBufferObject (base) */ -Class ArrayBuffer::slowClass = { - "ArrayBuffer", +Class ArrayBufferObject::protoClass = { + "ArrayBufferPrototype", JSCLASS_HAS_PRIVATE | JSCLASS_HAS_RESERVED_SLOTS(ARRAYBUFFER_RESERVED_SLOTS) | JSCLASS_HAS_CACHED_PROTO(JSProto_ArrayBuffer), @@ -2142,53 +2162,53 @@ Class js::ArrayBufferClass = { NULL, /* call */ NULL, /* construct */ NULL, /* hasInstance */ - ArrayBuffer::obj_trace, + ArrayBufferObject::obj_trace, JS_NULL_CLASS_EXT, { - ArrayBuffer::obj_lookupGeneric, - ArrayBuffer::obj_lookupProperty, - ArrayBuffer::obj_lookupElement, - ArrayBuffer::obj_lookupSpecial, - ArrayBuffer::obj_defineGeneric, - ArrayBuffer::obj_defineProperty, - ArrayBuffer::obj_defineElement, - ArrayBuffer::obj_defineSpecial, - ArrayBuffer::obj_getGeneric, - ArrayBuffer::obj_getProperty, - ArrayBuffer::obj_getElement, - ArrayBuffer::obj_getElementIfPresent, - ArrayBuffer::obj_getSpecial, - ArrayBuffer::obj_setGeneric, - ArrayBuffer::obj_setProperty, - ArrayBuffer::obj_setElement, - ArrayBuffer::obj_setSpecial, - ArrayBuffer::obj_getGenericAttributes, - ArrayBuffer::obj_getPropertyAttributes, - ArrayBuffer::obj_getElementAttributes, - ArrayBuffer::obj_getSpecialAttributes, - ArrayBuffer::obj_setGenericAttributes, - ArrayBuffer::obj_setPropertyAttributes, - ArrayBuffer::obj_setElementAttributes, - ArrayBuffer::obj_setSpecialAttributes, - ArrayBuffer::obj_deleteProperty, - ArrayBuffer::obj_deleteElement, - ArrayBuffer::obj_deleteSpecial, - ArrayBuffer::obj_enumerate, - ArrayBuffer::obj_typeOf, + ArrayBufferObject::obj_lookupGeneric, + ArrayBufferObject::obj_lookupProperty, + ArrayBufferObject::obj_lookupElement, + ArrayBufferObject::obj_lookupSpecial, + ArrayBufferObject::obj_defineGeneric, + ArrayBufferObject::obj_defineProperty, + ArrayBufferObject::obj_defineElement, + ArrayBufferObject::obj_defineSpecial, + ArrayBufferObject::obj_getGeneric, + ArrayBufferObject::obj_getProperty, + ArrayBufferObject::obj_getElement, + ArrayBufferObject::obj_getElementIfPresent, + ArrayBufferObject::obj_getSpecial, + ArrayBufferObject::obj_setGeneric, + ArrayBufferObject::obj_setProperty, + ArrayBufferObject::obj_setElement, + ArrayBufferObject::obj_setSpecial, + ArrayBufferObject::obj_getGenericAttributes, + ArrayBufferObject::obj_getPropertyAttributes, + ArrayBufferObject::obj_getElementAttributes, + ArrayBufferObject::obj_getSpecialAttributes, + ArrayBufferObject::obj_setGenericAttributes, + ArrayBufferObject::obj_setPropertyAttributes, + ArrayBufferObject::obj_setElementAttributes, + ArrayBufferObject::obj_setSpecialAttributes, + ArrayBufferObject::obj_deleteProperty, + ArrayBufferObject::obj_deleteElement, + ArrayBufferObject::obj_deleteSpecial, + ArrayBufferObject::obj_enumerate, + ArrayBufferObject::obj_typeOf, NULL, /* thisObject */ NULL, /* clear */ } }; -JSPropertySpec ArrayBuffer::jsprops[] = { +JSPropertySpec ArrayBufferObject::jsprops[] = { { "byteLength", -1, JSPROP_SHARED | JSPROP_PERMANENT | JSPROP_READONLY, - ArrayBuffer::prop_getByteLength, JS_StrictPropertyStub }, + ArrayBufferObject::prop_getByteLength, JS_StrictPropertyStub }, {0,0,0,0,0} }; -JSFunctionSpec ArrayBuffer::jsfuncs[] = { - JS_FN("slice", ArrayBuffer::fun_slice, 2, JSFUN_GENERIC_NATIVE), +JSFunctionSpec ArrayBufferObject::jsfuncs[] = { + JS_FN("slice", ArrayBufferObject::fun_slice, 2, JSFUN_GENERIC_NATIVE), JS_FS_END }; @@ -2279,7 +2299,7 @@ IMPL_TYPED_ARRAY_JSAPI_CONSTRUCTORS(Uint32, uint32_t) IMPL_TYPED_ARRAY_JSAPI_CONSTRUCTORS(Float32, float) IMPL_TYPED_ARRAY_JSAPI_CONSTRUCTORS(Float64, double) -#define IMPL_TYPED_ARRAY_SLOW_CLASS(_typedArray) \ +#define IMPL_TYPED_ARRAY_PROTO_CLASS(_typedArray) \ { \ #_typedArray, \ JSCLASS_HAS_RESERVED_SLOTS(TypedArray::FIELD_MAX) | \ @@ -2362,7 +2382,7 @@ template static inline JSObject * InitTypedArrayClass(JSContext *cx, GlobalObject *global) { - JSObject *proto = global->createBlankPrototype(cx, ArrayType::slowClass()); + JSObject *proto = global->createBlankPrototype(cx, ArrayType::protoClass()); if (!proto) return NULL; @@ -2418,27 +2438,27 @@ Class TypedArray::fastClasses[TYPE_MAX] = { IMPL_TYPED_ARRAY_FAST_CLASS(Uint8ClampedArray) }; -Class TypedArray::slowClasses[TYPE_MAX] = { - IMPL_TYPED_ARRAY_SLOW_CLASS(Int8Array), - IMPL_TYPED_ARRAY_SLOW_CLASS(Uint8Array), - IMPL_TYPED_ARRAY_SLOW_CLASS(Int16Array), - IMPL_TYPED_ARRAY_SLOW_CLASS(Uint16Array), - IMPL_TYPED_ARRAY_SLOW_CLASS(Int32Array), - IMPL_TYPED_ARRAY_SLOW_CLASS(Uint32Array), - IMPL_TYPED_ARRAY_SLOW_CLASS(Float32Array), - IMPL_TYPED_ARRAY_SLOW_CLASS(Float64Array), - IMPL_TYPED_ARRAY_SLOW_CLASS(Uint8ClampedArray) +Class TypedArray::protoClasses[TYPE_MAX] = { + IMPL_TYPED_ARRAY_PROTO_CLASS(Int8Array), + IMPL_TYPED_ARRAY_PROTO_CLASS(Uint8Array), + IMPL_TYPED_ARRAY_PROTO_CLASS(Int16Array), + IMPL_TYPED_ARRAY_PROTO_CLASS(Uint16Array), + IMPL_TYPED_ARRAY_PROTO_CLASS(Int32Array), + IMPL_TYPED_ARRAY_PROTO_CLASS(Uint32Array), + IMPL_TYPED_ARRAY_PROTO_CLASS(Float32Array), + IMPL_TYPED_ARRAY_PROTO_CLASS(Float64Array), + IMPL_TYPED_ARRAY_PROTO_CLASS(Uint8ClampedArray) }; static JSObject * InitArrayBufferClass(JSContext *cx, GlobalObject *global) { - JSObject *arrayBufferProto = global->createBlankPrototype(cx, &ArrayBuffer::slowClass); + JSObject *arrayBufferProto = global->createBlankPrototype(cx, &ArrayBufferObject::protoClass); if (!arrayBufferProto) return NULL; JSFunction *ctor = - global->createConstructor(cx, ArrayBuffer::class_constructor, + global->createConstructor(cx, ArrayBufferObject::class_constructor, CLASS_ATOM(cx, ArrayBuffer), 1); if (!ctor) return NULL; @@ -2446,7 +2466,7 @@ InitArrayBufferClass(JSContext *cx, GlobalObject *global) if (!LinkConstructorAndPrototype(cx, ctor, arrayBufferProto)) return NULL; - if (!DefinePropertiesAndBrand(cx, arrayBufferProto, ArrayBuffer::jsprops, ArrayBuffer::jsfuncs)) + if (!DefinePropertiesAndBrand(cx, arrayBufferProto, ArrayBufferObject::jsprops, ArrayBufferObject::jsfuncs)) return NULL; if (!DefineConstructorAndPrototype(cx, global, JSProto_ArrayBuffer, ctor, arrayBufferProto)) @@ -2495,8 +2515,8 @@ js::IsFastTypedArrayClass(const Class *clasp) static inline bool IsSlowTypedArrayClass(const Class *clasp) { - return &TypedArray::slowClasses[0] <= clasp && - clasp < &TypedArray::slowClasses[TypedArray::TYPE_MAX]; + return &TypedArray::protoClasses[0] <= clasp && + clasp < &TypedArray::protoClasses[TypedArray::TYPE_MAX]; } bool @@ -2526,22 +2546,21 @@ JS_FRIEND_API(uint32_t) JS_GetArrayBufferByteLength(JSObject *obj, JSContext *cx) { obj = UnwrapObject(obj); - JS_ASSERT(obj->isArrayBuffer()); - return obj->arrayBufferByteLength(); + return obj->asArrayBuffer().byteLength(); } JS_FRIEND_API(uint8_t *) JS_GetArrayBufferData(JSObject *obj, JSContext *cx) { obj = UnwrapObject(obj); - JS_ASSERT(obj->isArrayBuffer()); - return obj->arrayBufferDataOffset(); + return obj->asArrayBuffer().dataPointer(); } JS_FRIEND_API(JSObject *) JS_NewArrayBuffer(JSContext *cx, uint32_t nbytes) { - return ArrayBuffer::create(cx, nbytes); + JS_ASSERT(nbytes <= INT32_MAX); + return ArrayBufferObject::create(cx, nbytes); } JS_FRIEND_API(uint32_t) diff --git a/js/src/jstypedarray.h b/js/src/jstypedarray.h index d55e88f1c6f..e11a3289be6 100644 --- a/js/src/jstypedarray.h +++ b/js/src/jstypedarray.h @@ -50,15 +50,15 @@ typedef struct JSProperty JSProperty; namespace js { /* - * ArrayBuffer + * ArrayBufferObject * - * This class holds the underlying raw buffer that the TypedArray - * subclasses access. It can be created explicitly and passed to a - * TypedArray subclass, or can be created implicitly by constructing a - * TypedArray with a size. + * This class holds the underlying raw buffer that the various ArrayBufferView + * subclasses (DataView and the TypedArrays) access. It can be created + * explicitly and passed to an ArrayBufferView subclass, or can be created + * implicitly by constructing a TypedArray with a size. */ -struct ArrayBuffer { - static Class slowClass; +struct ArrayBufferObject : public JSObject { + static Class protoClass; static JSPropertySpec jsprops[]; static JSFunctionSpec jsfuncs[]; @@ -68,17 +68,11 @@ struct ArrayBuffer { static JSBool class_constructor(JSContext *cx, unsigned argc, Value *vp); - static JSObject *create(JSContext *cx, int32_t nbytes, uint8_t *contents = NULL); + static JSObject *create(JSContext *cx, uint32_t nbytes, uint8_t *contents = NULL); - static JSObject *createSlice(JSContext *cx, JSObject *arrayBuffer, + static JSObject *createSlice(JSContext *cx, ArrayBufferObject &arrayBuffer, uint32_t begin, uint32_t end); - ArrayBuffer() - { - } - - ~ArrayBuffer(); - static void obj_trace(JSTracer *trc, JSObject *obj); @@ -167,6 +161,19 @@ struct ArrayBuffer { static JSObject * getArrayBuffer(JSObject *obj); + + bool + allocateSlots(JSContext *cx, uint32_t size, uint8_t *contents = NULL); + + inline uint32_t byteLength() const; + + inline uint8_t * dataPointer() const; + + /* + * Check if the arrayBuffer contains any data. This will return false for + * ArrayBuffer.prototype and neutered ArrayBuffers. + */ + inline bool hasData() const; }; /* @@ -211,9 +218,9 @@ struct TypedArray { // and MUST NOT be used to construct new objects. static Class fastClasses[TYPE_MAX]; - // These are the slow/original classes, used + // These are the proto/original classes, used // fo constructing new objects - static Class slowClasses[TYPE_MAX]; + static Class protoClasses[TYPE_MAX]; static JSPropertySpec jsprops[]; @@ -247,7 +254,7 @@ struct TypedArray { static uint32_t getByteOffset(JSObject *obj); static uint32_t getByteLength(JSObject *obj); static uint32_t getType(JSObject *obj); - static JSObject * getBuffer(JSObject *obj); + static ArrayBufferObject * getBuffer(JSObject *obj); static void * getDataOffset(JSObject *obj); public: diff --git a/js/src/jstypedarrayinlines.h b/js/src/jstypedarrayinlines.h index e36f6b01d44..228897e9ae4 100644 --- a/js/src/jstypedarrayinlines.h +++ b/js/src/jstypedarrayinlines.h @@ -44,20 +44,33 @@ #include "jsobj.h" inline uint32_t -JSObject::arrayBufferByteLength() +js::ArrayBufferObject::byteLength() const { JS_ASSERT(isArrayBuffer()); return getElementsHeader()->length; } inline uint8_t * -JSObject::arrayBufferDataOffset() +js::ArrayBufferObject::dataPointer() const { return (uint8_t *) elements; } +inline js::ArrayBufferObject & +JSObject::asArrayBuffer() +{ + JS_ASSERT(isArrayBuffer()); + return *static_cast(this); +} + namespace js { +inline bool +ArrayBufferObject::hasData() const +{ + return getClass() == &ArrayBufferClass; +} + static inline int32_t ClampIntForUint8Array(int32_t x) { @@ -92,10 +105,10 @@ TypedArray::getType(JSObject *obj) { return obj->getFixedSlot(FIELD_TYPE).toInt32(); } -inline JSObject * +inline ArrayBufferObject * TypedArray::getBuffer(JSObject *obj) { JS_ASSERT(IsFastOrSlowTypedArray(obj)); - return &obj->getFixedSlot(FIELD_BUFFER).toObject(); + return &obj->getFixedSlot(FIELD_BUFFER).toObject().asArrayBuffer(); } inline void * @@ -104,5 +117,6 @@ TypedArray::getDataOffset(JSObject *obj) { return (void *)obj->getPrivate(NUM_FIXED_SLOTS); } -} +} /* namespace js */ + #endif /* jstypedarrayinlines_h */ diff --git a/js/src/vm/ObjectImpl.h b/js/src/vm/ObjectImpl.h index c37b299b9c0..dfed5291a10 100644 --- a/js/src/vm/ObjectImpl.h +++ b/js/src/vm/ObjectImpl.h @@ -570,10 +570,12 @@ ElementsHeader::asArrayBufferElements() * pointing to the beginning of that array (the end of this structure). * See below for usage of this structure. */ +class ArrayBufferObject; class ObjectElements { friend struct ::JSObject; friend class ObjectImpl; + friend struct js::ArrayBufferObject; /* Number of allocated slots. */ uint32_t capacity; From d83159318ee44b84cd1a05807bdf0c67345e80c8 Mon Sep 17 00:00:00 2001 From: Steve Fink Date: Tue, 17 Apr 2012 16:10:23 -0700 Subject: [PATCH 042/182] Bug 746382 - save a copy of whatever mozconfig you used into $OBJDIR/.mozconfig to make it easier to automate rebuilds. r=khuey --HG-- extra : rebase_source : 08b3f46644fd97403b9306f9040e05d5b2f20087 --- client.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client.mk b/client.mk index 071b71bacec..ba1131e45b1 100644 --- a/client.mk +++ b/client.mk @@ -324,8 +324,12 @@ configure-preqs = \ configure-files \ $(call mkdir_deps,$(OBJDIR)) \ $(if $(MOZ_BUILD_PROJECTS),$(call mkdir_deps,$(MOZ_OBJDIR))) \ + save-mozconfig \ $(NULL) +save-mozconfig: + -cp $(FOUND_MOZCONFIG) $(OBJDIR)/.mozconfig + configure:: $(configure-preqs) @echo cd $(OBJDIR); @echo $(CONFIGURE) $(CONFIGURE_ARGS) From e7d82123c0d2bb6e4506e0334e3816eeaf127a2c Mon Sep 17 00:00:00 2001 From: Terrence Cole Date: Fri, 13 Apr 2012 14:33:18 -0700 Subject: [PATCH 043/182] Bug 744880 - Make Relocatable HeapValue for use with manual post barriers; r=billm We cannot have implicit post barriers run on any pointer that can be relocated outside of the GC's control. This includes things like HashTables and Vectors. --HG-- extra : rebase_source : 7bae3ab9e319be48c343be58d6858b43b743e581 --- js/src/gc/Barrier-inl.h | 44 +++++++++++++++++++++++++++++++++++++++++ js/src/gc/Barrier.h | 15 ++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/js/src/gc/Barrier-inl.h b/js/src/gc/Barrier-inl.h index 96f07ca1ed5..2628424ee51 100644 --- a/js/src/gc/Barrier-inl.h +++ b/js/src/gc/Barrier-inl.h @@ -186,6 +186,50 @@ HeapValue::post(JSCompartment *comp) { } +inline +RelocatableValue::RelocatableValue() + : EncapsulatedValue(UndefinedValue()) +{ +} + +inline +RelocatableValue::RelocatableValue(const Value &v) + : EncapsulatedValue(v) +{ + JS_ASSERT(!IsPoisonedValue(v)); +} + +inline +RelocatableValue::RelocatableValue(const RelocatableValue &v) + : EncapsulatedValue(v.value) +{ + JS_ASSERT(!IsPoisonedValue(v.value)); +} + +inline +RelocatableValue::~RelocatableValue() +{ + pre(); +} + +inline RelocatableValue & +RelocatableValue::operator=(const Value &v) +{ + pre(); + JS_ASSERT(!IsPoisonedValue(v)); + value = v; + return *this; +} + +inline RelocatableValue & +RelocatableValue::operator=(const RelocatableValue &v) +{ + pre(); + JS_ASSERT(!IsPoisonedValue(v.value)); + value = v.value; + return *this; +} + inline HeapSlot::HeapSlot(JSObject *obj, uint32_t slot, const Value &v) : EncapsulatedValue(v) diff --git a/js/src/gc/Barrier.h b/js/src/gc/Barrier.h index 0654ec7deef..5cb9ba045c3 100644 --- a/js/src/gc/Barrier.h +++ b/js/src/gc/Barrier.h @@ -292,6 +292,9 @@ class EncapsulatedValue ~EncapsulatedValue() {} public: + inline bool operator==(const EncapsulatedValue &v) const { return value == v.value; } + inline bool operator!=(const EncapsulatedValue &v) const { return value != v.value; } + const Value &get() const { return value; } Value *unsafeGet() { return &value; } operator const Value &() const { return value; } @@ -365,6 +368,18 @@ class HeapValue : public EncapsulatedValue inline void post(JSCompartment *comp); }; +class RelocatableValue : public EncapsulatedValue +{ + public: + explicit inline RelocatableValue(); + explicit inline RelocatableValue(const Value &v); + explicit inline RelocatableValue(const RelocatableValue &v); + inline ~RelocatableValue(); + + inline RelocatableValue &operator=(const Value &v); + inline RelocatableValue &operator=(const RelocatableValue &v); +}; + class HeapSlot : public EncapsulatedValue { /* From 2577075a7add05602f52bc625ad9f9142160ebd3 Mon Sep 17 00:00:00 2001 From: Mark Capella Date: Tue, 24 Apr 2012 18:31:28 -0400 Subject: [PATCH 044/182] Bug 744332 - Remove nsXULPrototypeScript::ScriptObjectHolder::mLangID. r=jst, f=Ms2ger --- content/base/src/nsScriptLoader.cpp | 6 ++- content/xbl/src/nsXBLDocumentInfo.cpp | 3 +- content/xul/content/src/nsXULElement.cpp | 47 +++++-------------- content/xul/content/src/nsXULElement.h | 11 ++--- content/xul/document/src/nsXULContentSink.cpp | 46 +++--------------- content/xul/document/src/nsXULContentSink.h | 1 - content/xul/document/src/nsXULDocument.cpp | 9 +--- .../xul/document/src/nsXULPrototypeCache.cpp | 12 ++--- .../xul/document/src/nsXULPrototypeCache.h | 5 +- .../document/src/nsXULPrototypeDocument.cpp | 3 +- dom/base/nsDOMScriptObjectFactory.cpp | 8 ++-- dom/base/nsDOMScriptObjectHolder.h | 9 +--- dom/base/nsGlobalWindow.cpp | 3 +- dom/base/nsIScriptRuntime.h | 2 + dom/base/nsJSEnvironment.cpp | 4 -- 15 files changed, 43 insertions(+), 126 deletions(-) diff --git a/content/base/src/nsScriptLoader.cpp b/content/base/src/nsScriptLoader.cpp index c982127aa1a..56fa5d9a1fd 100644 --- a/content/base/src/nsScriptLoader.cpp +++ b/content/base/src/nsScriptLoader.cpp @@ -464,12 +464,13 @@ nsScriptLoader::ProcessScriptElement(nsIScriptElement *aElement) break; } } + if (isJavaScript) typeID = nsIProgrammingLanguage::JAVASCRIPT; else { // Use the object factory to locate a matching language. nsCOMPtr runtime; - rv = NS_GetScriptRuntime(mimeType, getter_AddRefs(runtime)); + rv = NS_GetJSRuntime(getter_AddRefs(runtime)); if (NS_FAILED(rv) || runtime == nsnull) { // Failed to get the explicitly specified language NS_WARNING("Failed to find a scripting language"); @@ -477,6 +478,7 @@ nsScriptLoader::ProcessScriptElement(nsIScriptElement *aElement) } else typeID = nsIProgrammingLanguage::JAVASCRIPT; } + if (typeID != nsIProgrammingLanguage::UNKNOWN) { // Get the version string, and ensure the language supports it. nsAutoString versionName; @@ -487,7 +489,7 @@ nsScriptLoader::ProcessScriptElement(nsIScriptElement *aElement) return false; } else { nsCOMPtr runtime; - rv = NS_GetScriptRuntimeByID(typeID, getter_AddRefs(runtime)); + rv = NS_GetJSRuntime(getter_AddRefs(runtime)); if (NS_FAILED(rv)) { NS_ERROR("Failed to locate the language with this ID"); return false; diff --git a/content/xbl/src/nsXBLDocumentInfo.cpp b/content/xbl/src/nsXBLDocumentInfo.cpp index ebe991d98e2..a976e0fa8a3 100644 --- a/content/xbl/src/nsXBLDocumentInfo.cpp +++ b/content/xbl/src/nsXBLDocumentInfo.cpp @@ -308,8 +308,7 @@ nsXBLDocGlobalObject::EnsureScriptEnvironment() nsresult rv; nsCOMPtr scriptRuntime; - rv = NS_GetScriptRuntimeByID(nsIProgrammingLanguage::JAVASCRIPT, - getter_AddRefs(scriptRuntime)); + rv = NS_GetJSRuntime(getter_AddRefs(scriptRuntime)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr newCtx = scriptRuntime->CreateContext(); rv = SetScriptContext(newCtx); diff --git a/content/xul/content/src/nsXULElement.cpp b/content/xul/content/src/nsXULElement.cpp index c46c56e4502..7109c9a4e90 100644 --- a/content/xul/content/src/nsXULElement.cpp +++ b/content/xul/content/src/nsXULElement.cpp @@ -2565,18 +2565,16 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_NATIVE_BEGIN(nsXULPrototypeNode) PRUint32 i; for (i = 0; i < elem->mNumAttributes; ++i) { JSObject* handler = elem->mAttributes[i].mEventHandler; - NS_IMPL_CYCLE_COLLECTION_TRACE_CALLBACK(nsIProgrammingLanguage::JAVASCRIPT, - handler, - "mAttributes[i].mEventHandler") + NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(handler, + "mAttributes[i].mEventHandler") } } } else if (tmp->mType == nsXULPrototypeNode::eType_Script) { nsXULPrototypeScript *script = static_cast(tmp); - NS_IMPL_CYCLE_COLLECTION_TRACE_CALLBACK(script->mScriptObject.mLangID, - script->mScriptObject.mObject, - "mScriptObject.mObject") + NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(script->mScriptObject.mObject, + "mScriptObject.mObject") } NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(nsXULPrototypeNode, AddRef) @@ -2653,8 +2651,6 @@ nsXULPrototypeElement::Serialize(nsIObjectOutputStream* aStream, rv |= aStream->Write32(child->mType); nsXULPrototypeScript* script = static_cast(child); - rv |= aStream->Write32(script->mScriptObject.mLangID); - rv |= aStream->Write8(script->mOutOfLine); if (! script->mOutOfLine) { rv |= script->Serialize(aStream, aGlobal, aNodeInfos); @@ -2760,11 +2756,8 @@ nsXULPrototypeElement::Deserialize(nsIObjectInputStream* aStream, aNodeInfos); break; case eType_Script: { - PRUint32 langID = nsIProgrammingLanguage::UNKNOWN; - rv |= aStream->Read32(&langID); - // language version/options obtained during deserialization. - nsXULPrototypeScript* script = new nsXULPrototypeScript(langID, 0, 0); + nsXULPrototypeScript* script = new nsXULPrototypeScript(0, 0); if (! script) return NS_ERROR_OUT_OF_MEMORY; child = script; @@ -2882,17 +2875,15 @@ nsXULPrototypeElement::Unlink() // nsXULPrototypeScript // -nsXULPrototypeScript::nsXULPrototypeScript(PRUint32 aLangID, PRUint32 aLineNo, PRUint32 aVersion) +nsXULPrototypeScript::nsXULPrototypeScript(PRUint32 aLineNo, PRUint32 aVersion) : nsXULPrototypeNode(eType_Script), mLineNo(aLineNo), mSrcLoading(false), mOutOfLine(true), mSrcLoadWaiters(nsnull), mLangVersion(aVersion), - mScriptObject(aLangID) + mScriptObject() { - NS_ASSERTION(aLangID != nsIProgrammingLanguage::UNKNOWN, - "The language ID must be known and constant"); } @@ -3023,23 +3014,10 @@ nsXULPrototypeScript::DeserializeOutOfLine(nsIObjectInputStream* aInput, useXULCache = cache->IsEnabled(); if (useXULCache) { - PRUint32 newLangID = nsIProgrammingLanguage::UNKNOWN; JSScript* newScriptObject = - cache->GetScript(mSrcURI, &newLangID); - if (newScriptObject) { - // Things may blow here if we simply change the script - // language - other code may already have pre-fetched the - // global for the language. (You can see this code by - // setting langID to UNKNOWN in the nsXULPrototypeScript - // ctor and not setting it until the scriptObject is set - - // code that pre-fetches these globals will then start - // asserting.) - if (mScriptObject.mLangID != newLangID) { - NS_ERROR("XUL cache gave different language?"); - return NS_ERROR_UNEXPECTED; - } + cache->GetScript(mSrcURI); + if (newScriptObject) Set(newScriptObject); - } } } @@ -3063,11 +3041,8 @@ nsXULPrototypeScript::DeserializeOutOfLine(nsIObjectInputStream* aInput, if (useXULCache && mSrcURI) { bool isChrome = false; mSrcURI->SchemeIs("chrome", &isChrome); - if (isChrome) { - cache->PutScript(mSrcURI, - mScriptObject.mLangID, - mScriptObject.mObject); - } + if (isChrome) + cache->PutScript(mSrcURI, mScriptObject.mObject); } cache->FinishInputStream(mSrcURI); } else { diff --git a/content/xul/content/src/nsXULElement.h b/content/xul/content/src/nsXULElement.h index 9b98e64b640..b4d93e60f83 100644 --- a/content/xul/content/src/nsXULElement.h +++ b/content/xul/content/src/nsXULElement.h @@ -303,7 +303,7 @@ class nsXULDocument; class nsXULPrototypeScript : public nsXULPrototypeNode { public: - nsXULPrototypeScript(PRUint32 aLangID, PRUint32 aLineNo, PRUint32 version); + nsXULPrototypeScript(PRUint32 aLineNo, PRUint32 version); virtual ~nsXULPrototypeScript(); #ifdef NS_BUILD_REFCNT_LOGGING @@ -332,23 +332,18 @@ public: void Set(nsScriptObjectHolder& aHolder) { - NS_ASSERTION(mScriptObject.mLangID == aHolder.getScriptTypeID(), - "Wrong language, this will leak the previous object."); - - mScriptObject.mLangID = aHolder.getScriptTypeID(); Set(aHolder.get()); } void Set(JSScript* aObject); struct ScriptObjectHolder { - ScriptObjectHolder(PRUint32 aLangID) : mLangID(aLangID), - mObject(nsnull) + ScriptObjectHolder() : mObject(nsnull) { } - PRUint32 mLangID; JSScript* mObject; }; + nsCOMPtr mSrcURI; PRUint32 mLineNo; bool mSrcLoading; diff --git a/content/xul/document/src/nsXULContentSink.cpp b/content/xul/document/src/nsXULContentSink.cpp index d9f4124baba..6ea39269796 100644 --- a/content/xul/document/src/nsXULContentSink.cpp +++ b/content/xul/document/src/nsXULContentSink.cpp @@ -165,39 +165,6 @@ XULContentSinkImpl::ContextStack::GetTopChildren(nsPrototypeArray** aChildren) return NS_OK; } -nsresult -XULContentSinkImpl::ContextStack::GetTopNodeScriptType(PRUint32 *aScriptType) -{ - if (mDepth == 0) - return NS_ERROR_UNEXPECTED; - - // This would be much simpler if nsXULPrototypeNode itself - // stored the language ID - but text elements don't need it! - nsresult rv = NS_OK; - nsRefPtr node; - rv = GetTopNode(node); - if (NS_FAILED(rv)) return rv; - switch (node->mType) { - case nsXULPrototypeNode::eType_Element: { - nsXULPrototypeElement *parent = - reinterpret_cast(node.get()); - *aScriptType = nsIProgrammingLanguage::JAVASCRIPT; - break; - } - case nsXULPrototypeNode::eType_Script: { - nsXULPrototypeScript *parent = - reinterpret_cast(node.get()); - *aScriptType = parent->mScriptObject.mLangID; - break; - } - default: { - NS_WARNING("Unexpected parent node type"); - rv = NS_ERROR_UNEXPECTED; - } - } - return rv; -} - void XULContentSinkImpl::ContextStack::Clear() { @@ -909,10 +876,9 @@ nsresult XULContentSinkImpl::OpenScript(const PRUnichar** aAttributes, const PRUint32 aLineNumber) { - PRUint32 langID; - nsresult rv = mContextStack.GetTopNodeScriptType(&langID); - if (NS_FAILED(rv)) return rv; + PRUint32 langID = nsIProgrammingLanguage::JAVASCRIPT; PRUint32 version = 0; + nsresult rv; // Look for SRC attribute and look for a LANGUAGE attribute nsAutoString src; @@ -964,7 +930,7 @@ XULContentSinkImpl::OpenScript(const PRUnichar** aAttributes, } else { // Use the script object factory to locate the language. nsCOMPtr runtime; - rv = NS_GetScriptRuntime(mimeType, getter_AddRefs(runtime)); + rv = NS_GetJSRuntime(getter_AddRefs(runtime)); if (NS_FAILED(rv) || runtime == nsnull) { // Failed to get the explicitly specified language NS_WARNING("Failed to find a scripting language"); @@ -983,7 +949,7 @@ XULContentSinkImpl::OpenScript(const PRUnichar** aAttributes, // no version specified - version remains the default. } else { nsCOMPtr runtime; - rv = NS_GetScriptRuntimeByID(langID, getter_AddRefs(runtime)); + rv = NS_GetJSRuntime(getter_AddRefs(runtime)); if (NS_FAILED(rv)) return rv; rv = runtime->ParseVersion(versionName, &version); @@ -1027,6 +993,7 @@ XULContentSinkImpl::OpenScript(const PRUnichar** aAttributes, } aAttributes += 2; } + // Not all script languages have a "sandbox" concept. At time of // writing, Python is the only other language, and it does not. // For such languages, neither any inline script nor remote script are @@ -1042,13 +1009,14 @@ XULContentSinkImpl::OpenScript(const PRUnichar** aAttributes, langID = nsIProgrammingLanguage::UNKNOWN; NS_WARNING("Non JS language called from non chrome - ignored"); } + // Don't process scripts that aren't known if (langID != nsIProgrammingLanguage::UNKNOWN) { nsIScriptGlobalObject* globalObject = nsnull; // borrowed reference if (doc) globalObject = doc->GetScriptGlobalObject(); nsRefPtr script = - new nsXULPrototypeScript(langID, aLineNumber, version); + new nsXULPrototypeScript(aLineNumber, version); if (! script) return NS_ERROR_OUT_OF_MEMORY; diff --git a/content/xul/document/src/nsXULContentSink.h b/content/xul/document/src/nsXULContentSink.h index 7139f6acf6a..a6de7370f14 100644 --- a/content/xul/document/src/nsXULContentSink.h +++ b/content/xul/document/src/nsXULContentSink.h @@ -162,7 +162,6 @@ protected: nsresult GetTopNode(nsRefPtr& aNode); nsresult GetTopChildren(nsPrototypeArray** aChildren); - nsresult GetTopNodeScriptType(PRUint32 *aScriptType); void Clear(); }; diff --git a/content/xul/document/src/nsXULDocument.cpp b/content/xul/document/src/nsXULDocument.cpp index 7e000dd841d..67872f0c2a6 100644 --- a/content/xul/document/src/nsXULDocument.cpp +++ b/content/xul/document/src/nsXULDocument.cpp @@ -3383,18 +3383,12 @@ nsXULDocument::LoadScript(nsXULPrototypeScript* aScriptProto, bool* aBlock) bool useXULCache = nsXULPrototypeCache::GetInstance()->IsEnabled(); if (isChromeDoc && useXULCache) { - PRUint32 fetchedLang = nsIProgrammingLanguage::UNKNOWN; JSScript* newScriptObject = nsXULPrototypeCache::GetInstance()->GetScript( - aScriptProto->mSrcURI, - &fetchedLang); + aScriptProto->mSrcURI); if (newScriptObject) { // The script language for a proto must remain constant - we // can't just change it for this unexpected language. - if (aScriptProto->mScriptObject.mLangID != fetchedLang) { - NS_ERROR("XUL cache gave me an incorrect script language"); - return NS_ERROR_UNEXPECTED; - } aScriptProto->Set(newScriptObject); } @@ -3558,7 +3552,6 @@ nsXULDocument::OnStreamComplete(nsIStreamLoader* aLoader, if (useXULCache && IsChromeURI(mDocumentURI)) { nsXULPrototypeCache::GetInstance()->PutScript( scriptProto->mSrcURI, - scriptProto->mScriptObject.mLangID, scriptProto->mScriptObject.mObject); } diff --git a/content/xul/document/src/nsXULPrototypeCache.cpp b/content/xul/document/src/nsXULPrototypeCache.cpp index 7ec84bad0a5..d4ce68b428d 100644 --- a/content/xul/document/src/nsXULPrototypeCache.cpp +++ b/content/xul/document/src/nsXULPrototypeCache.cpp @@ -227,14 +227,12 @@ nsXULPrototypeCache::PutStyleSheet(nsCSSStyleSheet* aStyleSheet) JSScript* -nsXULPrototypeCache::GetScript(nsIURI* aURI, PRUint32 *aLangID) +nsXULPrototypeCache::GetScript(nsIURI* aURI) { CacheScriptEntry entry; if (!mScriptTable.Get(aURI, &entry)) { - *aLangID = nsIProgrammingLanguage::UNKNOWN; return nsnull; } - *aLangID = entry.mScriptTypeID; return entry.mScriptObject; } @@ -244,13 +242,13 @@ static PLDHashOperator ReleaseScriptObjectCallback(nsIURI* aKey, CacheScriptEntry &aData, void* aClosure) { nsCOMPtr rt; - if (NS_SUCCEEDED(NS_GetScriptRuntimeByID(aData.mScriptTypeID, getter_AddRefs(rt)))) + if (NS_SUCCEEDED(NS_GetJSRuntime(getter_AddRefs(rt)))) rt->DropScriptObject(aData.mScriptObject); return PL_DHASH_REMOVE; } nsresult -nsXULPrototypeCache::PutScript(nsIURI* aURI, PRUint32 aLangID, JSScript* aScriptObject) +nsXULPrototypeCache::PutScript(nsIURI* aURI, JSScript* aScriptObject) { CacheScriptEntry existingEntry; if (mScriptTable.Get(aURI, &existingEntry)) { @@ -266,13 +264,13 @@ nsXULPrototypeCache::PutScript(nsIURI* aURI, PRUint32 aLangID, JSScript* aScript ReleaseScriptObjectCallback(aURI, existingEntry, nsnull); } - CacheScriptEntry entry = {aLangID, aScriptObject}; + CacheScriptEntry entry = {aScriptObject}; NS_ENSURE_TRUE(mScriptTable.Put(aURI, entry), NS_ERROR_OUT_OF_MEMORY); // Lock the object from being gc'd until it is removed from the cache nsCOMPtr rt; - nsresult rv = NS_GetScriptRuntimeByID(aLangID, getter_AddRefs(rt)); + nsresult rv = NS_GetJSRuntime(getter_AddRefs(rt)); if (NS_SUCCEEDED(rv)) rv = rt->HoldScriptObject(aScriptObject); NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to GC lock the object"); diff --git a/content/xul/document/src/nsXULPrototypeCache.h b/content/xul/document/src/nsXULPrototypeCache.h index 0bebd27caa8..d9a0ef5c89d 100644 --- a/content/xul/document/src/nsXULPrototypeCache.h +++ b/content/xul/document/src/nsXULPrototypeCache.h @@ -64,7 +64,6 @@ class nsCSSStyleSheet; struct CacheScriptEntry { - PRUint32 mScriptTypeID; // the script language ID. JSScript* mScriptObject; // the script object. }; @@ -107,8 +106,8 @@ public: nsXULPrototypeDocument* GetPrototype(nsIURI* aURI); nsresult PutPrototype(nsXULPrototypeDocument* aDocument); - JSScript* GetScript(nsIURI* aURI, PRUint32* langID); - nsresult PutScript(nsIURI* aURI, PRUint32 langID, JSScript* aScriptObject); + JSScript* GetScript(nsIURI* aURI); + nsresult PutScript(nsIURI* aURI, JSScript* aScriptObject); nsXBLDocumentInfo* GetXBLDocumentInfo(nsIURI* aURL) { return mXBLDocTable.GetWeak(aURL); diff --git a/content/xul/document/src/nsXULPrototypeDocument.cpp b/content/xul/document/src/nsXULPrototypeDocument.cpp index 1ad06c18efe..e0321082db2 100644 --- a/content/xul/document/src/nsXULPrototypeDocument.cpp +++ b/content/xul/document/src/nsXULPrototypeDocument.cpp @@ -724,8 +724,7 @@ nsXULPDGlobalObject::EnsureScriptEnvironment() NS_ASSERTION(!mJSObject, "Have global without context?"); nsCOMPtr languageRuntime; - nsresult rv = NS_GetScriptRuntimeByID(nsIProgrammingLanguage::JAVASCRIPT, - getter_AddRefs(languageRuntime)); + nsresult rv = NS_GetJSRuntime(getter_AddRefs(languageRuntime)); NS_ENSURE_SUCCESS(rv, NS_OK); nsCOMPtr ctxNew = languageRuntime->CreateContext(); diff --git a/dom/base/nsDOMScriptObjectFactory.cpp b/dom/base/nsDOMScriptObjectFactory.cpp index 61c03fe9d68..cef7bad4c51 100644 --- a/dom/base/nsDOMScriptObjectFactory.cpp +++ b/dom/base/nsDOMScriptObjectFactory.cpp @@ -227,8 +227,8 @@ nsDOMScriptObjectFactory::RegisterDOMClassInfo(const char *aName, // Factories -static nsresult -GetJSRuntime(nsIScriptRuntime** aLanguage) +nsresult +NS_GetJSRuntime(nsIScriptRuntime** aLanguage) { nsCOMPtr factory = do_GetService(kDOMScriptObjectFactoryCID); @@ -246,7 +246,7 @@ nsresult NS_GetScriptRuntime(const nsAString &aLanguageName, NS_ENSURE_TRUE(aLanguageName.EqualsLiteral("application/javascript"), NS_ERROR_FAILURE); - return GetJSRuntime(aLanguage); + return NS_GetJSRuntime(aLanguage); } nsresult NS_GetScriptRuntimeByID(PRUint32 aScriptTypeID, @@ -257,7 +257,7 @@ nsresult NS_GetScriptRuntimeByID(PRUint32 aScriptTypeID, NS_ENSURE_TRUE(aScriptTypeID == nsIProgrammingLanguage::JAVASCRIPT, NS_ERROR_FAILURE); - return GetJSRuntime(aLanguage); + return NS_GetJSRuntime(aLanguage); } diff --git a/dom/base/nsDOMScriptObjectHolder.h b/dom/base/nsDOMScriptObjectHolder.h index d70282db159..b66dd11961f 100644 --- a/dom/base/nsDOMScriptObjectHolder.h +++ b/dom/base/nsDOMScriptObjectHolder.h @@ -99,8 +99,6 @@ public: } nsresult set(T* object) { - NS_ASSERTION(getScriptTypeID() != nsIProgrammingLanguage::UNKNOWN, - "Must know the language!"); nsresult rv = drop(); if (NS_FAILED(rv)) return rv; @@ -114,17 +112,12 @@ public: return rv; } nsresult set(const nsScriptObjectHolder &other) { - NS_ASSERTION(getScriptTypeID() == other.getScriptTypeID(), - "Must have identical languages!"); nsresult rv = drop(); if (NS_FAILED(rv)) return rv; return set(other.mObject); } - // Get the language ID. - PRUint32 getScriptTypeID() const { - return nsIProgrammingLanguage::JAVASCRIPT; - } + protected: T* mObject; nsCOMPtr mContext; diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index 45973685041..1e43714903c 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -1633,8 +1633,7 @@ nsGlobalWindow::EnsureScriptEnvironment() "mJSObject is null, but we have an inner window?"); nsCOMPtr scriptRuntime; - nsresult rv = NS_GetScriptRuntimeByID(nsIProgrammingLanguage::JAVASCRIPT, - getter_AddRefs(scriptRuntime)); + nsresult rv = NS_GetJSRuntime(getter_AddRefs(scriptRuntime)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr context = scriptRuntime->CreateContext(); diff --git a/dom/base/nsIScriptRuntime.h b/dom/base/nsIScriptRuntime.h index 8a009fe2c9c..58b09e58e8a 100644 --- a/dom/base/nsIScriptRuntime.h +++ b/dom/base/nsIScriptRuntime.h @@ -74,6 +74,8 @@ public: NS_DEFINE_STATIC_IID_ACCESSOR(nsIScriptRuntime, NS_ISCRIPTRUNTIME_IID) /* helper functions */ +nsresult NS_GetJSRuntime(nsIScriptRuntime** aLanguage); + nsresult NS_GetScriptRuntime(const nsAString &aLanguageName, nsIScriptRuntime **aRuntime); diff --git a/dom/base/nsJSEnvironment.cpp b/dom/base/nsJSEnvironment.cpp index 3406e5393d2..c2734619532 100644 --- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -1543,8 +1543,6 @@ nsJSContext::CompileScript(const PRUnichar* aText, if (!script) { return NS_ERROR_OUT_OF_MEMORY; } - NS_ASSERTION(aScriptObject.getScriptTypeID()==JAVASCRIPT, - "Expecting JS script object holder"); return aScriptObject.set(script); } @@ -1737,8 +1735,6 @@ nsJSContext::CompileEventHandler(nsIAtom *aName, } JSObject *handler = ::JS_GetFunctionObject(fun); - NS_ASSERTION(aHandler.getScriptTypeID()==JAVASCRIPT, - "Expecting JS script object holder"); return aHandler.set(handler); } From 8eed8200496089922d023c8f910c3cca7001e186 Mon Sep 17 00:00:00 2001 From: Lucas Rocha Date: Tue, 24 Apr 2012 18:59:09 -0400 Subject: [PATCH 045/182] Bug 701330 - Show star on "Top Sites" tab rows that are bookmarks (r=margaret) --- mobile/android/base/AwesomeBarTabs.java | 15 +++++++++++++++ mobile/android/base/Makefile.in | 3 +++ mobile/android/base/db/LocalBrowserDB.java | 3 ++- .../drawable-hdpi/ic_awesomebar_star.png | Bin 0 -> 789 bytes .../drawable-xhdpi-v11/ic_awesomebar_star.png | Bin 0 -> 1139 bytes .../resources/drawable/ic_awesomebar_star.png | Bin 0 -> 612 bytes .../base/resources/layout/awesomebar_row.xml | 13 +++++++++++++ 7 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 mobile/android/base/resources/drawable-hdpi/ic_awesomebar_star.png create mode 100644 mobile/android/base/resources/drawable-xhdpi-v11/ic_awesomebar_star.png create mode 100644 mobile/android/base/resources/drawable/ic_awesomebar_star.png diff --git a/mobile/android/base/AwesomeBarTabs.java b/mobile/android/base/AwesomeBarTabs.java index 0283bd92eb2..c53c9f3d1f5 100644 --- a/mobile/android/base/AwesomeBarTabs.java +++ b/mobile/android/base/AwesomeBarTabs.java @@ -82,6 +82,7 @@ import org.json.JSONException; import org.json.JSONObject; import org.mozilla.gecko.db.BrowserContract.Bookmarks; +import org.mozilla.gecko.db.BrowserContract.Combined; import org.mozilla.gecko.db.BrowserDB; import org.mozilla.gecko.db.BrowserDB.URLColumns; @@ -122,6 +123,7 @@ public class AwesomeBarTabs extends TabHost { public TextView titleView; public TextView urlView; public ImageView faviconView; + public ImageView starView; } private class HistoryListAdapter extends SimpleExpandableListAdapter { @@ -644,6 +646,7 @@ public class AwesomeBarTabs extends TabHost { viewHolder.titleView = (TextView) convertView.findViewById(R.id.title); viewHolder.urlView = (TextView) convertView.findViewById(R.id.url); viewHolder.faviconView = (ImageView) convertView.findViewById(R.id.favicon); + viewHolder.starView = (ImageView) convertView.findViewById(R.id.bookmark_star); convertView.setTag(viewHolder); } else { @@ -659,6 +662,7 @@ public class AwesomeBarTabs extends TabHost { updateTitle(viewHolder.titleView, cursor); updateUrl(viewHolder.urlView, cursor); updateFavicon(viewHolder.faviconView, cursor); + updateBookmarkStar(viewHolder.starView, cursor); } else { bindSearchEngineView(position - resultCount, viewHolder); } @@ -697,6 +701,7 @@ public class AwesomeBarTabs extends TabHost { viewHolder.urlView.setText(searchText); Drawable drawable = getDrawableFromDataURI(iconURI); viewHolder.faviconView.setImageDrawable(drawable); + viewHolder.starView.setVisibility(View.GONE); } }; @@ -948,6 +953,16 @@ public class AwesomeBarTabs extends TabHost { urlView.setText(url); } + private void updateBookmarkStar(ImageView starView, Cursor cursor) { + int bookmarkIdIndex = cursor.getColumnIndexOrThrow(Combined.BOOKMARK_ID); + long id = cursor.getLong(bookmarkIdIndex); + + // The bookmark id will be 0 (null in database) when the url + // is not a bookmark. + int visibility = (id == 0 ? View.GONE : View.VISIBLE); + starView.setVisibility(visibility); + } + public void setOnUrlOpenListener(OnUrlOpenListener listener) { mUrlOpenListener = listener; } diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in index c61b188a12d..a850044099b 100644 --- a/mobile/android/base/Makefile.in +++ b/mobile/android/base/Makefile.in @@ -340,6 +340,7 @@ RES_DRAWABLE_BASE = \ res/drawable/ic_addons_empty.png \ res/drawable/ic_awesomebar_go.png \ res/drawable/ic_awesomebar_search.png \ + res/drawable/ic_awesomebar_star.png \ res/drawable/ic_menu_bookmark_add.png \ res/drawable/ic_menu_bookmark_remove.png \ res/drawable/ic_menu_find_in_page.png \ @@ -396,6 +397,7 @@ RES_DRAWABLE_HDPI = \ res/drawable-hdpi/ic_addons_empty.png \ res/drawable-hdpi/ic_awesomebar_go.png \ res/drawable-hdpi/ic_awesomebar_search.png \ + res/drawable-hdpi/ic_awesomebar_star.png \ res/drawable-hdpi/ic_menu_bookmark_add.png \ res/drawable-hdpi/ic_menu_bookmark_remove.png \ res/drawable-hdpi/ic_menu_find_in_page.png \ @@ -464,6 +466,7 @@ RES_DRAWABLE_XHDPI_V11 = \ res/drawable-xhdpi-v11/ic_addons_empty.png \ res/drawable-xhdpi-v11/ic_awesomebar_go.png \ res/drawable-xhdpi-v11/ic_awesomebar_search.png \ + res/drawable-xhdpi-v11/ic_awesomebar_star.png \ res/drawable-xhdpi-v11/ic_menu_bookmark_add.png \ res/drawable-xhdpi-v11/ic_menu_bookmark_remove.png \ res/drawable-xhdpi-v11/ic_menu_find_in_page.png \ diff --git a/mobile/android/base/db/LocalBrowserDB.java b/mobile/android/base/db/LocalBrowserDB.java index b21b8d81478..cc60623a371 100644 --- a/mobile/android/base/db/LocalBrowserDB.java +++ b/mobile/android/base/db/LocalBrowserDB.java @@ -184,7 +184,8 @@ public class LocalBrowserDB implements BrowserDB.BrowserDBIface { new String[] { Combined._ID, Combined.URL, Combined.TITLE, - Combined.FAVICON }, + Combined.FAVICON, + Combined.BOOKMARK_ID }, constraint, limit, null); diff --git a/mobile/android/base/resources/drawable-hdpi/ic_awesomebar_star.png b/mobile/android/base/resources/drawable-hdpi/ic_awesomebar_star.png new file mode 100644 index 0000000000000000000000000000000000000000..7848ddbf1e9fd0396b5ecbd3239e82da9bb53306 GIT binary patch literal 789 zcmV+w1M2*VP)wo)rKkZnr9z>L3Q`eDe}tRTh58S=Euyp)3WCsXYS4<%)}2j!KPK@}O)w9W zG?SUh-08WEii%C59{4zO&pr2>@0|MpD8fwb$756Xhp8_npD9SFeC0JQyCO3R? zqR8E0O4_se*06<04L#E>^5BGQ2&gx7^~I%>n#nOyRdrdCpbE$zlu!z)3cn>usAFs$ z+J%(rYUY(BuvMTZsAQm?jxql7LQ2i#lts@(Wr0my2a-A_!wNdFhJ`ETPR8~~Ig`|k zf8l|1Gy%gk;`kn-0Vx|HyWaptR0MqwL*!&}LInVSO#`lM87USph#uy^G#0>!`5AL> z#0T8fCNObB3I3R*51=Bqo~K3u`6Yzq03{gXu}%9ver;g}T(#wJexv(@n+MSo(Y0Wd z;XZp8l_#yP`wp962V%fw5ZH(W+q(t_xY&MXer$X((b0C>?XdB7>mPVoiew zJ)L_%axiC?BJ;g(eM8jK@zEUS(R{k@zvb_SW6ic(mLuVQIkoiW-KzJ~WM~4%zXpa@ z-OpMoTVMCodz$L3cmGw2743%8&G@}^Ch5#vRH?4umDTNZpno_p@xdFK#PAd%bda)w zKbS^*>-1E%^maMh>TgYXD8*@OS z=8{xxL)#=WF-jzo)Ty9|0|$iY2`cr_TsUw60Vk?fO-faS3KB{s+KMU%I3Ug-IZgs? zs+16?NgJZHg#fA=YCG}YbG*B6nSFLz2mfFo zKym*pm%&H|K_u>@KvjKWfBnH+ftnZ%XLG?zRBJhlgTbnkjLaZ;|Cd!|eU6qDD) zm-+@Jod~T(2(dt5T{G9g$_OF5K+xMDGL<8A9jZ6Nyr`bhhX@!N7-$?J=eUMZs)ZlfTuA!mIuy> zpd_p7r=^S;<;GqyibkzT)9tV}90Z;$HO7))YtUYiG60V9q_rNYNL{s{MsqfO?~+YR z1%R)W7gRlvWv(fk^Xa!R223DI&0{yRvZjDEy|I~4Bqp%78d~uu0(RvgTG8uftThX; zC`J;;C0Zd3(J!qD@f7m8DG($Daszi35x=40O)zpdNn_6%5z+6zLgB+`Of@|+bTb2i zBczvtL0yAj#VA&UqX0X?CY|EIR?icC>3Gy;)x7WoMvn4TRa2m)r_M+1Ic}L1 zRCK5DtC73c|B0sTFLys9NwuvUV-Cl=C&TBz7>Nv_?K=-j_CJZVdToAXcIAHB@#>2{ zfBsG%Awe)H-Z?RTZur|9r^M{QAIHA@rD|*Yb8`0H8SI-%zBSQ0!9eOt8)D|jvbpwu ztu1x=aGTR^iC}lw_;0GG@-d7CNb9uS>9Ebp211^{RK0oMT}i%R-bKOV`asP)L>qx} z&08z$B&Qu%Jo5X9Jw+?n$d%YAOK7veZZLR>ceS4?mo{2!j?iU;9r+_ICFF)+6Oovi zc0KLhPE{dliIBpjmGJ6>;-}YCG`by_zKM`=!Nz7{Qy&g5hNl+R#^qXIx2Jb- zU}vze!`rE;`E4%E6P}4rzdw8{ zbp3Wp5>1NH{<5zm5)8TU)3vYJ)%(dnOaK0kCVxE1R^L1}w`bz4KaTrV>rj@;5kw;* zViJY+r)$cU{;*RLBia%2J#qnc4P1XHgAZGHlH*?i1^^P88Ff6uRdoOW002ovPDHLk FV1jo;5Cux1k3AMV=t03hytWA9sd{NDQo)M|p~l1rUdp0a z(Mv}&(Pw8E-5~7G; zBl@$I*k1(F=fMxXfeLBA13fy2OiYug1jVzEK^CEtLP#Rf+O-UBz6R$m*gzdf)@ke| z=G10ahf;}CF!qoi3P5Sk>Yuox46i_qnnDjH${DSniQEdVJrF z>Z{B58Kb28ETte%PA%N3ecyaa8lS0;*P^qleEpTpjSSZ!pM5==s5F|Rxf2H|9DN*t zN68sT52{@3$4B2~S}`XK>JT0YLq9rP;X8S3%ZSt33R??h`< + + @@ -30,6 +42,7 @@ android:layout_marginTop="2dip" android:layout_below="@id/title" android:layout_alignLeft="@id/title" + android:layout_toLeftOf="@id/bookmark_star" android:includeFontPadding="false" android:singleLine="true" android:ellipsize="middle"/> From 6a88286ff20480192158dd4b2edc691ddf885855 Mon Sep 17 00:00:00 2001 From: Lucas Rocha Date: Tue, 24 Apr 2012 18:59:30 -0400 Subject: [PATCH 046/182] Bug 701330 - Show star on "History" tab rows that are bookmarks (r=margaret) --- mobile/android/base/AwesomeBarTabs.java | 11 +++++++++++ mobile/android/base/db/LocalBrowserDB.java | 15 ++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/mobile/android/base/AwesomeBarTabs.java b/mobile/android/base/AwesomeBarTabs.java index c53c9f3d1f5..1c922a90da0 100644 --- a/mobile/android/base/AwesomeBarTabs.java +++ b/mobile/android/base/AwesomeBarTabs.java @@ -147,6 +147,7 @@ public class AwesomeBarTabs extends TabHost { viewHolder.titleView = (TextView) convertView.findViewById(R.id.title); viewHolder.urlView = (TextView) convertView.findViewById(R.id.url); viewHolder.faviconView = (ImageView) convertView.findViewById(R.id.favicon); + viewHolder.starView = (ImageView) convertView.findViewById(R.id.bookmark_star); convertView.setTag(viewHolder); } else { @@ -175,6 +176,13 @@ public class AwesomeBarTabs extends TabHost { viewHolder.faviconView.setImageBitmap(bitmap); } + Long bookmarkId = (Long) historyItem.get(Combined.BOOKMARK_ID); + + // The bookmark id will be 0 (null in database) when the url + // is not a bookmark. + int visibility = (bookmarkId == 0 ? View.GONE : View.VISIBLE); + viewHolder.starView.setVisibility(visibility); + return convertView; } } @@ -481,6 +489,7 @@ public class AwesomeBarTabs extends TabHost { String url = cursor.getString(cursor.getColumnIndexOrThrow(URLColumns.URL)); String title = cursor.getString(cursor.getColumnIndexOrThrow(URLColumns.TITLE)); byte[] favicon = cursor.getBlob(cursor.getColumnIndexOrThrow(URLColumns.FAVICON)); + Long bookmarkId = cursor.getLong(cursor.getColumnIndexOrThrow(Combined.BOOKMARK_ID)); // Use the URL instead of an empty title for consistency with the normal URL // bar view - this is the equivalent of getDisplayTitle() in Tab.java @@ -493,6 +502,8 @@ public class AwesomeBarTabs extends TabHost { if (favicon != null) historyItem.put(URLColumns.FAVICON, favicon); + historyItem.put(Combined.BOOKMARK_ID, bookmarkId); + return historyItem; } diff --git a/mobile/android/base/db/LocalBrowserDB.java b/mobile/android/base/db/LocalBrowserDB.java index cc60623a371..1ecb26b1862 100644 --- a/mobile/android/base/db/LocalBrowserDB.java +++ b/mobile/android/base/db/LocalBrowserDB.java @@ -270,13 +270,14 @@ public class LocalBrowserDB implements BrowserDB.BrowserDBIface { } public Cursor getRecentHistory(ContentResolver cr, int limit) { - Cursor c = cr.query(historyUriWithLimit(limit), - new String[] { History._ID, - History.URL, - History.TITLE, - History.FAVICON, - History.DATE_LAST_VISITED, - History.VISITS }, + Cursor c = cr.query(combinedUriWithLimit(limit), + new String[] { Combined._ID, + Combined.BOOKMARK_ID, + Combined.URL, + Combined.TITLE, + Combined.FAVICON, + Combined.DATE_LAST_VISITED, + Combined.VISITS }, History.DATE_LAST_VISITED + " > 0", null, History.DATE_LAST_VISITED + " DESC"); From 7078dae3e572278826e4148799b2a653d41d9785 Mon Sep 17 00:00:00 2001 From: Brad Lassey Date: Tue, 24 Apr 2012 23:53:57 +0100 Subject: [PATCH 047/182] Bug 747642 - Followup to fix xul android bustage From 3222823138c682ebdce028cc87b16dd6f8a89727 Mon Sep 17 00:00:00 2001 From: Brad Lassey Date: Tue, 24 Apr 2012 23:53:57 +0100 Subject: [PATCH 048/182] Bug 747642 - Followup to fix xul android bustage --- widget/android/AndroidJNI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widget/android/AndroidJNI.cpp b/widget/android/AndroidJNI.cpp index ba06dd1e6c9..096b30a3059 100644 --- a/widget/android/AndroidJNI.cpp +++ b/widget/android/AndroidJNI.cpp @@ -897,5 +897,5 @@ Java_org_mozilla_gecko_GeckoAppShell_notifyFilePickerResult(JNIEnv* jenv, jclass NS_DispatchToMainThread(runnable); } -} #endif +} From f7b7a7a0eeadc0542f7721172a0e2cc7872394fc Mon Sep 17 00:00:00 2001 From: Michal Novotny Date: Wed, 25 Apr 2012 01:07:06 +0200 Subject: [PATCH 049/182] Bug 745200 - nsDiskCacheStreamIO::Flush() is sometimes called without holding the cache lock --- netwerk/cache/nsDiskCacheBinding.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/netwerk/cache/nsDiskCacheBinding.cpp b/netwerk/cache/nsDiskCacheBinding.cpp index f8cb2a71c95..0d4a1b1dcf2 100644 --- a/netwerk/cache/nsDiskCacheBinding.cpp +++ b/netwerk/cache/nsDiskCacheBinding.cpp @@ -119,6 +119,11 @@ nsDiskCacheBinding::nsDiskCacheBinding(nsCacheEntry* entry, nsDiskCacheRecord * nsDiskCacheBinding::~nsDiskCacheBinding() { + // Grab the cache lock since the binding is stored in nsCacheEntry::mData + // and it is released using nsCacheService::ReleaseObject_Locked() which + // releases the object outside the cache lock. + nsCacheServiceAutoLock lock; + NS_ASSERTION(PR_CLIST_IS_EMPTY(this), "binding deleted while still on list"); if (!PR_CLIST_IS_EMPTY(this)) PR_REMOVE_LINK(this); // XXX why are we still on a list? From 0d58cac1812c83d26f7b7e2f96cfaa61e5f03b72 Mon Sep 17 00:00:00 2001 From: Michal Novotny Date: Wed, 25 Apr 2012 01:11:39 +0200 Subject: [PATCH 050/182] Bug 713203 - nsMemoryCacheDevice::mTotalSize can go negative after clearing the memory cache --- netwerk/cache/nsMemoryCacheDevice.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/netwerk/cache/nsMemoryCacheDevice.cpp b/netwerk/cache/nsMemoryCacheDevice.cpp index a53c731b733..d7816456704 100644 --- a/netwerk/cache/nsMemoryCacheDevice.cpp +++ b/netwerk/cache/nsMemoryCacheDevice.cpp @@ -114,7 +114,7 @@ nsMemoryCacheDevice::Shutdown() PR_REMOVE_AND_INIT_LINK(entry); // update statistics - PRInt32 memoryRecovered = (PRInt32)entry->Size(); + PRInt32 memoryRecovered = (PRInt32)entry->DataSize(); mTotalSize -= memoryRecovered; mInactiveSize -= memoryRecovered; --mEntryCount; @@ -155,7 +155,7 @@ nsMemoryCacheDevice::FindEntry(nsCString * key, bool *collision) PR_REMOVE_AND_INIT_LINK(entry); PR_APPEND_LINK(entry, &mEvictionList[EvictionList(entry, 0)]); - mInactiveSize -= entry->Size(); + mInactiveSize -= entry->DataSize(); return entry; } @@ -183,7 +183,7 @@ nsMemoryCacheDevice::DeactivateEntry(nsCacheEntry * entry) return NS_ERROR_INVALID_POINTER; #endif - mInactiveSize += entry->Size(); + mInactiveSize += entry->DataSize(); EvictEntriesIfNecessary(); return NS_OK; @@ -210,7 +210,7 @@ nsMemoryCacheDevice::BindEntry(nsCacheEntry * entry) ++mEntryCount; if (mMaxEntryCount < mEntryCount) mMaxEntryCount = mEntryCount; - mTotalSize += entry->Size(); + mTotalSize += entry->DataSize(); EvictEntriesIfNecessary(); } @@ -368,7 +368,7 @@ nsMemoryCacheDevice::EvictEntry(nsCacheEntry * entry, bool deleteEntry) PR_REMOVE_AND_INIT_LINK(entry); // update statistics - PRInt32 memoryRecovered = (PRInt32)entry->Size(); + PRInt32 memoryRecovered = (PRInt32)entry->DataSize(); mTotalSize -= memoryRecovered; if (!entry->IsDoomed()) mInactiveSize -= memoryRecovered; @@ -409,7 +409,7 @@ nsMemoryCacheDevice::EvictEntriesIfNecessary(void) if (entry != &mEvictionList[i]) { entryCost = (PRUint64) - (now - entry->LastFetched()) * entry->Size() / + (now - entry->LastFetched()) * entry->DataSize() / PR_MAX(1, entry->FetchCount()); if (!maxEntry || (entryCost > maxCost)) { maxEntry = entry; @@ -436,7 +436,7 @@ nsMemoryCacheDevice::EvictionList(nsCacheEntry * entry, PRInt32 deltaSize) // compute which eviction queue this entry should go into, // based on floor(log2(size/nref)) - PRInt32 size = deltaSize + (PRInt32)entry->Size(); + PRInt32 size = deltaSize + (PRInt32)entry->DataSize(); PRInt32 fetchCount = NS_MAX(1, entry->FetchCount()); return NS_MIN(PR_FloorLog2(size / fetchCount), kQueueCount - 1); From b2e6b4ac1c60bac21d64ba1b808371bfc9e1c5de Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Tue, 24 Apr 2012 15:39:21 -0700 Subject: [PATCH 051/182] Fix class/struct mismatch warnings for js::ArrayBufferObject. Followup to bug 741040, r=chucktesta --HG-- extra : rebase_source : c5f0daa4261896c8c5013872b1aa9cf367adeebc --- js/src/jstypedarray.h | 4 +++- js/src/vm/ObjectImpl.h | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/js/src/jstypedarray.h b/js/src/jstypedarray.h index e11a3289be6..2874179b45d 100644 --- a/js/src/jstypedarray.h +++ b/js/src/jstypedarray.h @@ -57,7 +57,9 @@ namespace js { * explicitly and passed to an ArrayBufferView subclass, or can be created * implicitly by constructing a TypedArray with a size. */ -struct ArrayBufferObject : public JSObject { +class ArrayBufferObject : public JSObject +{ + public: static Class protoClass; static JSPropertySpec jsprops[]; static JSFunctionSpec jsfuncs[]; diff --git a/js/src/vm/ObjectImpl.h b/js/src/vm/ObjectImpl.h index dfed5291a10..616746aaafd 100644 --- a/js/src/vm/ObjectImpl.h +++ b/js/src/vm/ObjectImpl.h @@ -564,18 +564,19 @@ ElementsHeader::asArrayBufferElements() return *static_cast(this); } +class ArrayBufferObject; + /* * Header structure for object element arrays. This structure is immediately * followed by an array of elements, with the elements member in an object * pointing to the beginning of that array (the end of this structure). * See below for usage of this structure. */ -class ArrayBufferObject; class ObjectElements { friend struct ::JSObject; friend class ObjectImpl; - friend struct js::ArrayBufferObject; + friend class ArrayBufferObject; /* Number of allocated slots. */ uint32_t capacity; From 67b7262ea0c3fca44b29b0208d9065ae98712a79 Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Tue, 10 Apr 2012 11:08:28 -0700 Subject: [PATCH 052/182] Bug 745944 - Make PropDesc assert propriety of access in its accessors, and privatize all PropDesc fields. r=jorendorff --HG-- extra : rebase_source : 56e51a95253f95442f09e441620b2fac3f758c53 --- js/src/jsgc.cpp | 8 +- js/src/jsobj.cpp | 188 +++++++++++++++++++-------------------- js/src/jsobjinlines.h | 22 ----- js/src/jsproxy.cpp | 6 +- js/src/vm/Debugger.cpp | 74 +++++---------- js/src/vm/ObjectImpl.cpp | 117 ++++++++++++++++++++++-- js/src/vm/ObjectImpl.h | 86 +++++++++++++----- 7 files changed, 291 insertions(+), 210 deletions(-) diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp index 4d955c02e51..873419c3ec5 100644 --- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -2140,10 +2140,10 @@ AutoGCRooter::trace(JSTracer *trc) static_cast(this)->descriptors; for (size_t i = 0, len = descriptors.length(); i < len; i++) { PropDesc &desc = descriptors[i]; - MarkValueRoot(trc, &desc.pd, "PropDesc::pd"); - MarkValueRoot(trc, &desc.value, "PropDesc::value"); - MarkValueRoot(trc, &desc.get, "PropDesc::get"); - MarkValueRoot(trc, &desc.set, "PropDesc::set"); + MarkValueRoot(trc, &desc.pd_, "PropDesc::pd_"); + MarkValueRoot(trc, &desc.value_, "PropDesc::value_"); + MarkValueRoot(trc, &desc.get_, "PropDesc::get_"); + MarkValueRoot(trc, &desc.set_, "PropDesc::set_"); } return; } diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index 062bfe78219..0f475b58b74 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -1522,39 +1522,39 @@ NewPropertyDescriptorObject(JSContext *cx, const PropertyDescriptor *desc, Value d.initFromPropertyDescriptor(*desc); if (!d.makeObject(cx)) return false; - *vp = d.pd; + *vp = d.pd(); return true; } void PropDesc::initFromPropertyDescriptor(const PropertyDescriptor &desc) { - pd.setUndefined(); + pd_.setUndefined(); attrs = uint8_t(desc.attrs); JS_ASSERT_IF(attrs & JSPROP_READONLY, !(attrs & (JSPROP_GETTER | JSPROP_SETTER))); if (desc.attrs & (JSPROP_GETTER | JSPROP_SETTER)) { - hasGet = true; - get = ((desc.attrs & JSPROP_GETTER) && desc.getter) - ? CastAsObjectJsval(desc.getter) - : UndefinedValue(); - hasSet = true; - set = ((desc.attrs & JSPROP_SETTER) && desc.setter) - ? CastAsObjectJsval(desc.setter) - : UndefinedValue(); - hasValue = false; - value.setUndefined(); - hasWritable = false; + hasGet_ = true; + get_ = ((desc.attrs & JSPROP_GETTER) && desc.getter) + ? CastAsObjectJsval(desc.getter) + : UndefinedValue(); + hasSet_ = true; + set_ = ((desc.attrs & JSPROP_SETTER) && desc.setter) + ? CastAsObjectJsval(desc.setter) + : UndefinedValue(); + hasValue_ = false; + value_.setUndefined(); + hasWritable_ = false; } else { - hasGet = false; - get.setUndefined(); - hasSet = false; - set.setUndefined(); - hasValue = true; - value = desc.value; - hasWritable = true; + hasGet_ = false; + get_.setUndefined(); + hasSet_ = false; + set_.setUndefined(); + hasValue_ = true; + value_ = desc.value; + hasWritable_ = true; } - hasEnumerable = true; - hasConfigurable = true; + hasEnumerable_ = true; + hasConfigurable_ = true; } bool @@ -1565,26 +1565,26 @@ PropDesc::makeObject(JSContext *cx) return false; const JSAtomState &atomState = cx->runtime->atomState; - if ((hasConfigurable && + if ((hasConfigurable() && !obj->defineProperty(cx, atomState.configurableAtom, BooleanValue((attrs & JSPROP_PERMANENT) == 0))) || - (hasEnumerable && + (hasEnumerable() && !obj->defineProperty(cx, atomState.enumerableAtom, BooleanValue((attrs & JSPROP_ENUMERATE) != 0))) || - (hasGet && - !obj->defineProperty(cx, atomState.getAtom, get)) || - (hasSet && - !obj->defineProperty(cx, atomState.setAtom, set)) || - (hasValue && - !obj->defineProperty(cx, atomState.valueAtom, value)) || - (hasWritable && + (hasGet() && + !obj->defineProperty(cx, atomState.getAtom, getterValue())) || + (hasSet() && + !obj->defineProperty(cx, atomState.setAtom, setterValue())) || + (hasValue() && + !obj->defineProperty(cx, atomState.valueAtom, value())) || + (hasWritable() && !obj->defineProperty(cx, atomState.writableAtom, BooleanValue((attrs & JSPROP_READONLY) == 0)))) { return false; } - pd.setObject(*obj); + pd_.setObject(*obj); return true; } @@ -1729,17 +1729,17 @@ HasProperty(JSContext *cx, JSObject *obj, jsid id, Value *vp, bool *foundp) } PropDesc::PropDesc() - : pd(UndefinedValue()), - value(UndefinedValue()), - get(UndefinedValue()), - set(UndefinedValue()), + : pd_(UndefinedValue()), + value_(UndefinedValue()), + get_(UndefinedValue()), + set_(UndefinedValue()), attrs(0), - hasGet(false), - hasSet(false), - hasValue(false), - hasWritable(false), - hasEnumerable(false), - hasConfigurable(false) + hasGet_(false), + hasSet_(false), + hasValue_(false), + hasWritable_(false), + hasEnumerable_(false), + hasConfigurable_(false) { } @@ -1756,7 +1756,7 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) JSObject *desc = &v.toObject(); /* Make a copy of the descriptor. We might need it later. */ - pd = v; + pd_ = v; /* Start with the proper defaults. */ attrs = JSPROP_PERMANENT | JSPROP_READONLY; @@ -1770,7 +1770,7 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) if (!HasProperty(cx, desc, ATOM_TO_JSID(cx->runtime->atomState.enumerableAtom), &v, &found)) return false; if (found) { - hasEnumerable = JS_TRUE; + hasEnumerable_ = true; if (js_ValueToBoolean(v)) attrs |= JSPROP_ENUMERATE; } @@ -1779,7 +1779,7 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) if (!HasProperty(cx, desc, ATOM_TO_JSID(cx->runtime->atomState.configurableAtom), &v, &found)) return false; if (found) { - hasConfigurable = JS_TRUE; + hasConfigurable_ = true; if (js_ValueToBoolean(v)) attrs &= ~JSPROP_PERMANENT; } @@ -1788,15 +1788,15 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) if (!HasProperty(cx, desc, ATOM_TO_JSID(cx->runtime->atomState.valueAtom), &v, &found)) return false; if (found) { - hasValue = true; - value = v; + hasValue_ = true; + value_ = v; } /* 8.10.6 step 6 */ if (!HasProperty(cx, desc, ATOM_TO_JSID(cx->runtime->atomState.writableAtom), &v, &found)) return false; if (found) { - hasWritable = JS_TRUE; + hasWritable_ = true; if (js_ValueToBoolean(v)) attrs &= ~JSPROP_READONLY; } @@ -1805,8 +1805,8 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) if (!HasProperty(cx, desc, ATOM_TO_JSID(cx->runtime->atomState.getAtom), &v, &found)) return false; if (found) { - hasGet = true; - get = v; + hasGet_ = true; + get_ = v; attrs |= JSPROP_GETTER | JSPROP_SHARED; attrs &= ~JSPROP_READONLY; if (checkAccessors && !checkGetter(cx)) @@ -1817,8 +1817,8 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) if (!HasProperty(cx, desc, ATOM_TO_JSID(cx->runtime->atomState.setAtom), &v, &found)) return false; if (found) { - hasSet = true; - set = v; + hasSet_ = true; + set_ = v; attrs |= JSPROP_SETTER | JSPROP_SHARED; attrs &= ~JSPROP_READONLY; if (checkAccessors && !checkSetter(cx)) @@ -1826,7 +1826,7 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) } /* 8.10.7 step 9 */ - if ((hasGet || hasSet) && (hasValue || hasWritable)) { + if ((hasGet() || hasSet()) && (hasValue() || hasWritable())) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_INVALID_DESCRIPTOR); return false; } @@ -1911,8 +1911,10 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD if (desc.isGenericDescriptor() || desc.isDataDescriptor()) { JS_ASSERT(!obj->getOps()->defineProperty); - return js_DefineProperty(cx, obj, id, &desc.value, - JS_PropertyStub, JS_StrictPropertyStub, desc.attrs); + Value v = desc.hasValue() ? desc.value() : UndefinedValue(); + return js_DefineProperty(cx, obj, id, &v, + JS_PropertyStub, JS_StrictPropertyStub, + desc.attributes()); } JS_ASSERT(desc.isAccessorDescriptor()); @@ -1928,7 +1930,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD Value tmp = UndefinedValue(); return js_DefineProperty(cx, obj, id, &tmp, - desc.getter(), desc.setter(), desc.attrs); + desc.getter(), desc.setter(), desc.attributes()); } /* 8.12.9 steps 5-6 (note 5 is merely a special case of 6). */ @@ -1942,7 +1944,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD if (!shape->isAccessorDescriptor()) break; - if (desc.hasGet) { + if (desc.hasGet()) { bool same; if (!SameValue(cx, desc.getterValue(), shape->getterOrUndefined(), &same)) return false; @@ -1950,7 +1952,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD break; } - if (desc.hasSet) { + if (desc.hasSet()) { bool same; if (!SameValue(cx, desc.setterValue(), shape->setterOrUndefined(), &same)) return false; @@ -1979,7 +1981,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD if (!shape->configurable() && (!shape->hasDefaultGetter() || !shape->hasDefaultSetter()) && desc.isDataDescriptor() && - (desc.hasWritable ? desc.writable() : shape->writable())) + (desc.hasWritable() ? desc.writable() : shape->writable())) { return Reject(cx, JSMSG_CANT_REDEFINE_PROP, throwError, id, rval); } @@ -1993,8 +1995,8 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD break; bool same; - if (desc.hasValue) { - if (!SameValue(cx, desc.value, v, &same)) + if (desc.hasValue()) { + if (!SameValue(cx, desc.value(), v, &same)) return false; if (!same) { /* @@ -2021,7 +2023,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD break; } } - if (desc.hasWritable && desc.writable() != shape->writable()) + if (desc.hasWritable() && desc.writable() != shape->writable()) break; } else { /* The only fields in desc will be handled below. */ @@ -2029,28 +2031,20 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD } } - if (desc.hasConfigurable && desc.configurable() != shape->configurable()) + if (desc.hasConfigurable() && desc.configurable() != shape->configurable()) break; - if (desc.hasEnumerable && desc.enumerable() != shape->enumerable()) + if (desc.hasEnumerable() && desc.enumerable() != shape->enumerable()) break; /* The conditions imposed by step 5 or step 6 apply. */ *rval = true; - return JS_TRUE; + return true; } while (0); /* 8.12.9 step 7. */ if (!shape->configurable()) { - /* - * Since [[Configurable]] defaults to false, we don't need to check - * whether it was specified. We can't do likewise for [[Enumerable]] - * because its putative value is used in a comparison -- a comparison - * whose result must always be false per spec if the [[Enumerable]] - * field is not present. Perfectly pellucid logic, eh? - */ - JS_ASSERT_IF(!desc.hasConfigurable, !desc.configurable()); - if (desc.configurable() || - (desc.hasEnumerable && desc.enumerable() != shape->enumerable())) { + if ((desc.hasConfigurable() && desc.configurable()) || + (desc.hasEnumerable() && desc.enumerable() != shape->enumerable())) { return Reject(cx, JSMSG_CANT_REDEFINE_PROP, throwError, id, rval); } } @@ -2067,11 +2061,11 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD /* 8.12.9 step 10. */ JS_ASSERT(shape->isDataDescriptor()); if (!shape->configurable() && !shape->writable()) { - if (desc.hasWritable && desc.writable()) + if (desc.hasWritable() && desc.writable()) return Reject(cx, JSMSG_CANT_REDEFINE_PROP, throwError, id, rval); - if (desc.hasValue) { + if (desc.hasValue()) { bool same; - if (!SameValue(cx, desc.value, v, &same)) + if (!SameValue(cx, desc.value(), v, &same)) return false; if (!same) return Reject(cx, JSMSG_CANT_REDEFINE_PROP, throwError, id, rval); @@ -2083,7 +2077,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD /* 8.12.9 step 11. */ JS_ASSERT(desc.isAccessorDescriptor() && shape->isAccessorDescriptor()); if (!shape->configurable()) { - if (desc.hasSet) { + if (desc.hasSet()) { bool same; if (!SameValue(cx, desc.setterValue(), shape->setterOrUndefined(), &same)) return false; @@ -2091,7 +2085,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD return Reject(cx, JSMSG_CANT_REDEFINE_PROP, throwError, id, rval); } - if (desc.hasGet) { + if (desc.hasGet()) { bool same; if (!SameValue(cx, desc.getterValue(), shape->getterOrUndefined(), &same)) return false; @@ -2107,27 +2101,27 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD StrictPropertyOp setter; if (desc.isGenericDescriptor()) { unsigned changed = 0; - if (desc.hasConfigurable) + if (desc.hasConfigurable()) changed |= JSPROP_PERMANENT; - if (desc.hasEnumerable) + if (desc.hasEnumerable()) changed |= JSPROP_ENUMERATE; - attrs = (shape->attributes() & ~changed) | (desc.attrs & changed); + attrs = (shape->attributes() & ~changed) | (desc.attributes() & changed); getter = shape->getter(); setter = shape->setter(); } else if (desc.isDataDescriptor()) { unsigned unchanged = 0; - if (!desc.hasConfigurable) + if (!desc.hasConfigurable()) unchanged |= JSPROP_PERMANENT; - if (!desc.hasEnumerable) + if (!desc.hasEnumerable()) unchanged |= JSPROP_ENUMERATE; /* Watch out for accessor -> data transformations here. */ - if (!desc.hasWritable && shape->isDataDescriptor()) + if (!desc.hasWritable() && shape->isDataDescriptor()) unchanged |= JSPROP_READONLY; - if (desc.hasValue) - v = desc.value; - attrs = (desc.attrs & ~unchanged) | (shape->attributes() & unchanged); + if (desc.hasValue()) + v = desc.value(); + attrs = (desc.attributes() & ~unchanged) | (shape->attributes() & unchanged); getter = JS_PropertyStub; setter = JS_StrictPropertyStub; } else { @@ -2143,24 +2137,24 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD /* 8.12.9 step 12. */ unsigned changed = 0; - if (desc.hasConfigurable) + if (desc.hasConfigurable()) changed |= JSPROP_PERMANENT; - if (desc.hasEnumerable) + if (desc.hasEnumerable()) changed |= JSPROP_ENUMERATE; - if (desc.hasGet) + if (desc.hasGet()) changed |= JSPROP_GETTER | JSPROP_SHARED | JSPROP_READONLY; - if (desc.hasSet) + if (desc.hasSet()) changed |= JSPROP_SETTER | JSPROP_SHARED | JSPROP_READONLY; - attrs = (desc.attrs & changed) | (shape->attributes() & ~changed); - if (desc.hasGet) { + attrs = (desc.attributes() & changed) | (shape->attributes() & ~changed); + if (desc.hasGet()) { getter = desc.getter(); } else { getter = (shape->hasDefaultGetter() && !shape->hasGetterValue()) ? JS_PropertyStub : shape->getter(); } - if (desc.hasSet) { + if (desc.hasSet()) { setter = desc.setter(); } else { setter = (shape->hasDefaultSetter() && !shape->hasSetterValue()) @@ -2252,7 +2246,7 @@ DefineProperty(JSContext *cx, HandleObject obj, HandleId id, const PropDesc &des if (obj->getOps()->lookupGeneric) { if (obj->isProxy()) - return Proxy::defineProperty(cx, obj, id, desc.pd); + return Proxy::defineProperty(cx, obj, id, desc.pd()); return Reject(cx, obj, JSMSG_OBJECT_NOT_EXTENSIBLE, throwError, rval); } diff --git a/js/src/jsobjinlines.h b/js/src/jsobjinlines.h index 938e6cafac8..bab8e86e29d 100644 --- a/js/src/jsobjinlines.h +++ b/js/src/jsobjinlines.h @@ -1651,28 +1651,6 @@ DefineConstructorAndPrototype(JSContext *cx, GlobalObject *global, return true; } -bool -PropDesc::checkGetter(JSContext *cx) -{ - if (hasGet && !js_IsCallable(get) && !get.isUndefined()) { - JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_GET_SET_FIELD, - js_getter_str); - return false; - } - return true; -} - -bool -PropDesc::checkSetter(JSContext *cx) -{ - if (hasSet && !js_IsCallable(set) && !set.isUndefined()) { - JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_GET_SET_FIELD, - js_setter_str); - return false; - } - return true; -} - inline bool ObjectClassIs(JSObject &obj, ESClassValue classValue, JSContext *cx) { diff --git a/js/src/jsproxy.cpp b/js/src/jsproxy.cpp index 9cbea364171..1db444d561e 100644 --- a/js/src/jsproxy.cpp +++ b/js/src/jsproxy.cpp @@ -466,9 +466,9 @@ ParsePropertyDescriptorObject(JSContext *cx, JSObject *obj, jsid id, const Value if (!d || !d->initialize(cx, v)) return false; desc->obj = obj; - desc->value = d->value; - JS_ASSERT(!(d->attrs & JSPROP_SHORTID)); - desc->attrs = d->attrs; + desc->value = d->hasValue() ? d->value() : UndefinedValue(); + JS_ASSERT(!(d->attributes() & JSPROP_SHORTID)); + desc->attrs = d->attributes(); desc->getter = d->getter(); desc->setter = d->setter(); desc->shortid = 0; diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp index c9bc3c740b9..59613aeca10 100644 --- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -3811,52 +3811,6 @@ DebuggerObject_getOwnPropertyNames(JSContext *cx, unsigned argc, Value *vp) return true; } -static bool -CheckArgCompartment(JSContext *cx, JSObject *obj, const Value &v, - const char *methodname, const char *propname) -{ - if (v.isObject() && v.toObject().compartment() != obj->compartment()) { - JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEBUG_COMPARTMENT_MISMATCH, - methodname, propname); - return false; - } - return true; -} - -/* - * Convert Debugger.Objects in desc to debuggee values. - * Reject non-callable getters and setters. - */ -static bool -UnwrapPropDesc(JSContext *cx, Debugger *dbg, JSObject *obj, PropDesc *desc) -{ - return (!desc->hasValue || (dbg->unwrapDebuggeeValue(cx, &desc->value) && - CheckArgCompartment(cx, obj, desc->value, "defineProperty", - "value"))) && - (!desc->hasGet || (dbg->unwrapDebuggeeValue(cx, &desc->get) && - CheckArgCompartment(cx, obj, desc->get, "defineProperty", "get") && - desc->checkGetter(cx))) && - (!desc->hasSet || (dbg->unwrapDebuggeeValue(cx, &desc->set) && - CheckArgCompartment(cx, obj, desc->set, "defineProperty", "set") && - desc->checkSetter(cx))); -} - -/* - * Rewrap *idp and the fields of *desc for the current compartment. Also: - * defining a property on a proxy requires the pd field to contain a descriptor - * object, so reconstitute desc->pd if needed. - */ -static bool -WrapIdAndPropDesc(JSContext *cx, JSObject *obj, jsid *idp, PropDesc *desc) -{ - JSCompartment *comp = cx->compartment; - return comp->wrapId(cx, idp) && - comp->wrap(cx, &desc->value) && - comp->wrap(cx, &desc->get) && - comp->wrap(cx, &desc->set) && - (!IsProxy(obj) || desc->makeObject(cx)); -} - static JSBool DebuggerObject_defineProperty(JSContext *cx, unsigned argc, Value *vp) { @@ -3872,19 +3826,25 @@ DebuggerObject_defineProperty(JSContext *cx, unsigned argc, Value *vp) PropDesc *desc = descs.append(); if (!desc || !desc->initialize(cx, descval, false)) return false; + desc->clearPd(); - desc->pd.setUndefined(); - if (!UnwrapPropDesc(cx, dbg, obj, desc)) + PropDesc *unwrappedDesc = descs.append(); + if (!unwrappedDesc || !desc->unwrapDebuggerObjectsInto(cx, dbg, obj, unwrappedDesc)) return false; { + PropDesc *rewrappedDesc = descs.append(); + if (!rewrappedDesc) + return false; + RootedVarId wrappedId(cx); + AutoCompartment ac(cx, obj); - if (!ac.enter() || !WrapIdAndPropDesc(cx, obj, id.address(), desc)) + if (!ac.enter() || !unwrappedDesc->wrapInto(cx, obj, id, wrappedId.address(), rewrappedDesc)) return false; ErrorCopier ec(ac, dbg->toJSObject()); bool dummy; - if (!DefineProperty(cx, obj, id, *desc, true, &dummy)) + if (!DefineProperty(cx, obj, wrappedId, *rewrappedDesc, true, &dummy)) return false; } @@ -3907,24 +3867,32 @@ DebuggerObject_defineProperties(JSContext *cx, unsigned argc, Value *vp) return false; size_t n = ids.length(); + AutoPropDescArrayRooter unwrappedDescs(cx); for (size_t i = 0; i < n; i++) { - if (!UnwrapPropDesc(cx, dbg, obj, &descs[i])) + if (!unwrappedDescs.append()) + return false; + if (!descs[i].unwrapDebuggerObjectsInto(cx, dbg, obj, &unwrappedDescs[i])) return false; } { + AutoIdVector rewrappedIds(cx); + AutoPropDescArrayRooter rewrappedDescs(cx); + AutoCompartment ac(cx, obj); if (!ac.enter()) return false; for (size_t i = 0; i < n; i++) { - if (!WrapIdAndPropDesc(cx, obj, &ids[i], &descs[i])) + if (!rewrappedIds.append(jsid()) || !rewrappedDescs.append()) + return false; + if (!unwrappedDescs[i].wrapInto(cx, obj, ids[i], &rewrappedIds[i], &rewrappedDescs[i])) return false; } ErrorCopier ec(ac, dbg->toJSObject()); for (size_t i = 0; i < n; i++) { bool dummy; - if (!DefineProperty(cx, obj, RootedVarId(cx, ids[i]), descs[i], true, &dummy)) + if (!DefineProperty(cx, obj, RootedVarId(cx, rewrappedIds[i]), rewrappedDescs[i], true, &dummy)) return false; } } diff --git a/js/src/vm/ObjectImpl.cpp b/js/src/vm/ObjectImpl.cpp index e726841352b..caf22adaac1 100644 --- a/js/src/vm/ObjectImpl.cpp +++ b/js/src/vm/ObjectImpl.cpp @@ -11,6 +11,7 @@ #include "jsscope.h" #include "jsobjinlines.h" +#include "Debugger.h" #include "ObjectImpl.h" #include "gc/Barrier-inl.h" @@ -19,6 +20,108 @@ using namespace js; +bool +PropDesc::checkGetter(JSContext *cx) +{ + if (hasGet()) { + const Value &get = getterValue(); + if (!js_IsCallable(get) && !get.isUndefined()) { + JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_GET_SET_FIELD, + js_getter_str); + return false; + } + } + return true; +} + +bool +PropDesc::checkSetter(JSContext *cx) +{ + if (hasSet()) { + const Value &set = setterValue(); + if (!js_IsCallable(set) && !set.isUndefined()) { + JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_GET_SET_FIELD, + js_setter_str); + return false; + } + } + return true; +} + +static bool +CheckArgCompartment(JSContext *cx, JSObject *obj, const Value &v, + const char *methodname, const char *propname) +{ + if (v.isObject() && v.toObject().compartment() != obj->compartment()) { + JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEBUG_COMPARTMENT_MISMATCH, + methodname, propname); + return false; + } + return true; +} + +/* + * Convert Debugger.Objects in desc to debuggee values. + * Reject non-callable getters and setters. + */ +bool +PropDesc::unwrapDebuggerObjectsInto(JSContext *cx, Debugger *dbg, JSObject *obj, + PropDesc *unwrapped) const +{ + *unwrapped = *this; + + if (unwrapped->hasValue()) { + if (!dbg->unwrapDebuggeeValue(cx, &unwrapped->value_) || + !CheckArgCompartment(cx, obj, unwrapped->value_, "defineProperty", "value")) + { + return false; + } + } + + if (unwrapped->hasGet()) { + if (!dbg->unwrapDebuggeeValue(cx, &unwrapped->get_) || + !CheckArgCompartment(cx, obj, unwrapped->get_, "defineProperty", "get")) + { + return false; + } + } + + if (unwrapped->hasSet()) { + if (!dbg->unwrapDebuggeeValue(cx, &unwrapped->set_) || + !CheckArgCompartment(cx, obj, unwrapped->set_, "defineProperty", "set")) + { + return false; + } + } + + return true; +} + +/* + * Rewrap *idp and the fields of *desc for the current compartment. Also: + * defining a property on a proxy requires pd_ to contain a descriptor object, + * so reconstitute desc->pd_ if needed. + */ +bool +PropDesc::wrapInto(JSContext *cx, JSObject *obj, const jsid &id, jsid *wrappedId, + PropDesc *desc) const +{ + JSCompartment *comp = cx->compartment; + + *wrappedId = id; + if (!comp->wrapId(cx, wrappedId)) + return false; + + *desc = *this; + if (!comp->wrap(cx, &desc->value_)) + return false; + if (!comp->wrap(cx, &desc->get_)) + return false; + if (!comp->wrap(cx, &desc->set_)) + return false; + return !obj->isProxy() || desc->makeObject(cx); +} + static ObjectElements emptyElementsHeader(0, 0); /* Objects with no elements share one empty set of elements. */ @@ -183,17 +286,17 @@ DenseElementsHeader::defineElement(JSContext *cx, ObjectImpl *obj, uint32_t inde { MOZ_ASSERT(this == &obj->elementsHeader()); - MOZ_ASSERT_IF(desc.hasGet || desc.hasSet, !desc.hasValue && !desc.hasWritable); - MOZ_ASSERT_IF(desc.hasValue || desc.hasWritable, !desc.hasGet && !desc.hasSet); + MOZ_ASSERT_IF(desc.hasGet() || desc.hasSet(), !desc.hasValue() && !desc.hasWritable()); + MOZ_ASSERT_IF(desc.hasValue() || desc.hasWritable(), !desc.hasGet() && !desc.hasSet()); /* * If desc is an accessor descriptor or a data descriptor with atypical * attributes, convert to sparse and retry. */ - if (desc.hasGet || desc.hasSet || - (desc.hasEnumerable && !desc.enumerable()) || - (desc.hasConfigurable && !desc.configurable()) || - (desc.hasWritable && !desc.writable())) + if (desc.hasGet() || desc.hasSet() || + (desc.hasEnumerable() && !desc.enumerable()) || + (desc.hasConfigurable() && !desc.configurable()) || + (desc.hasWritable() && !desc.writable())) { if (!obj->makeElementsSparse(cx)) return false; @@ -246,7 +349,7 @@ DenseElementsHeader::defineElement(JSContext *cx, ObjectImpl *obj, uint32_t inde /* But if we were able to ensure the element's existence, we're good. */ MOZ_ASSERT(res == ObjectImpl::Succeeded); - obj->elements[index].set(obj->asObjectPtr(), index, desc.value); + obj->elements[index].set(obj->asObjectPtr(), index, desc.value()); *succeeded = true; return true; } diff --git a/js/src/vm/ObjectImpl.h b/js/src/vm/ObjectImpl.h index 616746aaafd..32a9647f381 100644 --- a/js/src/vm/ObjectImpl.h +++ b/js/src/vm/ObjectImpl.h @@ -19,6 +19,7 @@ namespace js { +class Debugger; class ObjectImpl; class AutoPropDescArrayRooter; @@ -40,26 +41,29 @@ CastAsStrictPropertyOp(JSObject *object) * structure. */ struct PropDesc { + private: /* * Original object from which this descriptor derives, passed through for - * the benefit of proxies. + * the benefit of proxies. FIXME: Remove this when direct proxies happen. */ - Value pd; + Value pd_; - Value value, get, set; + Value value_, get_, set_; /* Property descriptor boolean fields. */ uint8_t attrs; /* Bits indicating which values are set. */ - bool hasGet : 1; - bool hasSet : 1; - bool hasValue : 1; - bool hasWritable : 1; - bool hasEnumerable : 1; - bool hasConfigurable : 1; + bool hasGet_ : 1; + bool hasSet_ : 1; + bool hasValue_ : 1; + bool hasWritable_ : 1; + bool hasEnumerable_ : 1; + bool hasConfigurable_ : 1; + public: friend class AutoPropDescArrayRooter; + friend void JS::AutoGCRooter::trace(JSTracer *trc); PropDesc(); @@ -87,14 +91,26 @@ struct PropDesc { void initFromPropertyDescriptor(const PropertyDescriptor &desc); bool makeObject(JSContext *cx); + bool hasGet() const { return hasGet_; } + bool hasSet() const { return hasSet_; } + bool hasValue() const { return hasValue_; } + bool hasWritable() const { return hasWritable_; } + bool hasEnumerable() const { return hasEnumerable_; } + bool hasConfigurable() const { return hasConfigurable_; } + + Value pd() const { return pd_; } + void clearPd() { pd_ = UndefinedValue(); } + + uint8_t attributes() const { return attrs; } + /* 8.10.1 IsAccessorDescriptor(desc) */ bool isAccessorDescriptor() const { - return hasGet || hasSet; + return hasGet_ || hasSet_; } /* 8.10.2 IsDataDescriptor(desc) */ bool isDataDescriptor() const { - return hasValue || hasWritable; + return hasValue_ || hasWritable_; } /* 8.10.3 IsGenericDescriptor(desc) */ @@ -103,36 +119,52 @@ struct PropDesc { } bool configurable() const { + MOZ_ASSERT(hasConfigurable_); return (attrs & JSPROP_PERMANENT) == 0; } bool enumerable() const { + MOZ_ASSERT(hasEnumerable_); return (attrs & JSPROP_ENUMERATE) != 0; } bool writable() const { + MOZ_ASSERT(hasWritable_); return (attrs & JSPROP_READONLY) == 0; } - JSObject* getterObject() const { - return get.isUndefined() ? NULL : &get.toObject(); - } - JSObject* setterObject() const { - return set.isUndefined() ? NULL : &set.toObject(); + const Value & value() const { + MOZ_ASSERT(hasValue_); + return value_; } - const Value &getterValue() const { - return get; + JSObject * getterObject() const { + MOZ_ASSERT(hasGet_); + return get_.isUndefined() ? NULL : &get_.toObject(); } - const Value &setterValue() const { - return set; + JSObject * setterObject() const { + MOZ_ASSERT(hasSet_); + return set_.isUndefined() ? NULL : &set_.toObject(); } + const Value & getterValue() const { + MOZ_ASSERT(hasGet_); + return get_; + } + const Value & setterValue() const { + MOZ_ASSERT(hasSet_); + return set_; + } + + /* + * Unfortunately the values produced by these methods are used such that + * we can't assert anything here. :-( + */ PropertyOp getter() const { - return CastAsPropertyOp(getterObject()); + return CastAsPropertyOp(get_.isUndefined() ? NULL : &get_.toObject()); } StrictPropertyOp setter() const { - return CastAsStrictPropertyOp(setterObject()); + return CastAsStrictPropertyOp(set_.isUndefined() ? NULL : &set_.toObject()); } /* @@ -140,8 +172,14 @@ struct PropDesc { * nor undefined. These methods do exactly the type checks that are skipped * by passing false as the checkAccessors parameter of initialize. */ - inline bool checkGetter(JSContext *cx); - inline bool checkSetter(JSContext *cx); + bool checkGetter(JSContext *cx); + bool checkSetter(JSContext *cx); + + bool unwrapDebuggerObjectsInto(JSContext *cx, Debugger *dbg, JSObject *obj, + PropDesc *unwrapped) const; + + bool wrapInto(JSContext *cx, JSObject *obj, const jsid &id, jsid *wrappedId, + PropDesc *wrappedDesc) const; }; class DenseElementsHeader; From fe0c58dc729f9f87b878355de621916d4c573fdc Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Wed, 18 Apr 2012 15:06:30 -0700 Subject: [PATCH 053/182] Bug 746262 - Augment PropDesc so that it can represent the absence of a property by adding an isUndefined() method and bit, and checking it in all the relevant accessors. r=jorendorff --HG-- extra : rebase_source : 50294d6b3abd9c6730d7e369220efc831f240c6a --- js/src/jsobj.cpp | 25 +++++++------------ js/src/vm/ObjectImpl.cpp | 30 ++++++++++++++++++----- js/src/vm/ObjectImpl.h | 52 +++++++++++++++++++++++++--------------- 3 files changed, 66 insertions(+), 41 deletions(-) diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index 0f475b58b74..53197137646 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -1529,6 +1529,7 @@ NewPropertyDescriptorObject(JSContext *cx, const PropertyDescriptor *desc, Value void PropDesc::initFromPropertyDescriptor(const PropertyDescriptor &desc) { + isUndefined_ = false; pd_.setUndefined(); attrs = uint8_t(desc.attrs); JS_ASSERT_IF(attrs & JSPROP_READONLY, !(attrs & (JSPROP_GETTER | JSPROP_SETTER))); @@ -1560,6 +1561,8 @@ PropDesc::initFromPropertyDescriptor(const PropertyDescriptor &desc) bool PropDesc::makeObject(JSContext *cx) { + MOZ_ASSERT(!isUndefined()); + JSObject *obj = NewBuiltinClassInstance(cx, &ObjectClass); if (!obj) return false; @@ -1728,21 +1731,6 @@ HasProperty(JSContext *cx, JSObject *obj, jsid id, Value *vp, bool *foundp) return !!obj->getGeneric(cx, id, vp); } -PropDesc::PropDesc() - : pd_(UndefinedValue()), - value_(UndefinedValue()), - get_(UndefinedValue()), - set_(UndefinedValue()), - attrs(0), - hasGet_(false), - hasSet_(false), - hasValue_(false), - hasWritable_(false), - hasEnumerable_(false), - hasConfigurable_(false) -{ -} - bool PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) { @@ -1758,7 +1746,12 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) /* Make a copy of the descriptor. We might need it later. */ pd_ = v; - /* Start with the proper defaults. */ + isUndefined_ = false; + + /* + * Start with the proper defaults. XXX shouldn't be necessary when we get + * rid of PropDesc::attributes() + */ attrs = JSPROP_PERMANENT | JSPROP_READONLY; bool found; diff --git a/js/src/vm/ObjectImpl.cpp b/js/src/vm/ObjectImpl.cpp index caf22adaac1..64dd1952dc6 100644 --- a/js/src/vm/ObjectImpl.cpp +++ b/js/src/vm/ObjectImpl.cpp @@ -20,12 +20,27 @@ using namespace js; +PropDesc::PropDesc() + : pd_(UndefinedValue()), + value_(UndefinedValue()), + get_(UndefinedValue()), + set_(UndefinedValue()), + attrs(0), + hasGet_(false), + hasSet_(false), + hasValue_(false), + hasWritable_(false), + hasEnumerable_(false), + hasConfigurable_(false), + isUndefined_(true) +{ +} + bool PropDesc::checkGetter(JSContext *cx) { - if (hasGet()) { - const Value &get = getterValue(); - if (!js_IsCallable(get) && !get.isUndefined()) { + if (hasGet_) { + if (!js_IsCallable(get_) && !get_.isUndefined()) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_GET_SET_FIELD, js_getter_str); return false; @@ -37,9 +52,8 @@ PropDesc::checkGetter(JSContext *cx) bool PropDesc::checkSetter(JSContext *cx) { - if (hasSet()) { - const Value &set = setterValue(); - if (!js_IsCallable(set) && !set.isUndefined()) { + if (hasSet_) { + if (!js_IsCallable(set_) && !set_.isUndefined()) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_GET_SET_FIELD, js_setter_str); return false; @@ -68,6 +82,8 @@ bool PropDesc::unwrapDebuggerObjectsInto(JSContext *cx, Debugger *dbg, JSObject *obj, PropDesc *unwrapped) const { + MOZ_ASSERT(!isUndefined()); + *unwrapped = *this; if (unwrapped->hasValue()) { @@ -106,6 +122,8 @@ bool PropDesc::wrapInto(JSContext *cx, JSObject *obj, const jsid &id, jsid *wrappedId, PropDesc *desc) const { + MOZ_ASSERT(!isUndefined()); + JSCompartment *comp = cx->compartment; *wrappedId = id; diff --git a/js/src/vm/ObjectImpl.h b/js/src/vm/ObjectImpl.h index 32a9647f381..d29190b3897 100644 --- a/js/src/vm/ObjectImpl.h +++ b/js/src/vm/ObjectImpl.h @@ -61,6 +61,9 @@ struct PropDesc { bool hasEnumerable_ : 1; bool hasConfigurable_ : 1; + /* Or maybe this represents a property's absence, and it's undefined. */ + bool isUndefined_ : 1; + public: friend class AutoPropDescArrayRooter; friend void JS::AutoGCRooter::trace(JSTracer *trc); @@ -91,68 +94,79 @@ struct PropDesc { void initFromPropertyDescriptor(const PropertyDescriptor &desc); bool makeObject(JSContext *cx); - bool hasGet() const { return hasGet_; } - bool hasSet() const { return hasSet_; } - bool hasValue() const { return hasValue_; } - bool hasWritable() const { return hasWritable_; } - bool hasEnumerable() const { return hasEnumerable_; } - bool hasConfigurable() const { return hasConfigurable_; } + void setUndefined() { isUndefined_ = true; } - Value pd() const { return pd_; } + bool isUndefined() const { return isUndefined_; } + + bool hasGet() const { MOZ_ASSERT(!isUndefined()); return hasGet_; } + bool hasSet() const { MOZ_ASSERT(!isUndefined()); return hasSet_; } + bool hasValue() const { MOZ_ASSERT(!isUndefined()); return hasValue_; } + bool hasWritable() const { MOZ_ASSERT(!isUndefined()); return hasWritable_; } + bool hasEnumerable() const { MOZ_ASSERT(!isUndefined()); return hasEnumerable_; } + bool hasConfigurable() const { MOZ_ASSERT(!isUndefined()); return hasConfigurable_; } + + Value pd() const { MOZ_ASSERT(!isUndefined()); return pd_; } void clearPd() { pd_ = UndefinedValue(); } - uint8_t attributes() const { return attrs; } + uint8_t attributes() const { MOZ_ASSERT(!isUndefined()); return attrs; } /* 8.10.1 IsAccessorDescriptor(desc) */ bool isAccessorDescriptor() const { - return hasGet_ || hasSet_; + return !isUndefined() && (hasGet() || hasSet()); } /* 8.10.2 IsDataDescriptor(desc) */ bool isDataDescriptor() const { - return hasValue_ || hasWritable_; + return !isUndefined() && (hasValue() || hasWritable()); } /* 8.10.3 IsGenericDescriptor(desc) */ bool isGenericDescriptor() const { - return !isAccessorDescriptor() && !isDataDescriptor(); + return !isUndefined() && !isAccessorDescriptor() && !isDataDescriptor(); } bool configurable() const { - MOZ_ASSERT(hasConfigurable_); + MOZ_ASSERT(!isUndefined()); + MOZ_ASSERT(hasConfigurable()); return (attrs & JSPROP_PERMANENT) == 0; } bool enumerable() const { - MOZ_ASSERT(hasEnumerable_); + MOZ_ASSERT(!isUndefined()); + MOZ_ASSERT(hasEnumerable()); return (attrs & JSPROP_ENUMERATE) != 0; } bool writable() const { - MOZ_ASSERT(hasWritable_); + MOZ_ASSERT(!isUndefined()); + MOZ_ASSERT(hasWritable()); return (attrs & JSPROP_READONLY) == 0; } const Value & value() const { - MOZ_ASSERT(hasValue_); + MOZ_ASSERT(hasValue()); return value_; } JSObject * getterObject() const { - MOZ_ASSERT(hasGet_); + MOZ_ASSERT(!isUndefined()); + MOZ_ASSERT(hasGet()); return get_.isUndefined() ? NULL : &get_.toObject(); } JSObject * setterObject() const { - MOZ_ASSERT(hasSet_); + MOZ_ASSERT(!isUndefined()); + MOZ_ASSERT(hasSet()); return set_.isUndefined() ? NULL : &set_.toObject(); } const Value & getterValue() const { - MOZ_ASSERT(hasGet_); + MOZ_ASSERT(!isUndefined()); + MOZ_ASSERT(hasGet()); return get_; } const Value & setterValue() const { - MOZ_ASSERT(hasSet_); + MOZ_ASSERT(!isUndefined()); + MOZ_ASSERT(hasSet()); return set_; } From 104f1b9521c88db41f5b656192a006bb3c6dccc3 Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Thu, 19 Apr 2012 16:18:24 -0700 Subject: [PATCH 054/182] Bug 747197 - Move basic numeric conversion operations (double->uint32_t, double->int32_t, double->integer, but not Value->* just yet) into vm/NumericConversions.h, a header with minimized dependencies. r=luke --HG-- extra : rebase_source : a564ba8f6a4350c1c49359f08e9de44670b89aeb --- js/src/frontend/FoldConstants.cpp | 21 +-- js/src/jsapi.cpp | 7 +- js/src/jsarray.cpp | 3 +- js/src/jsdate.cpp | 9 +- js/src/jsdate.h | 29 ++- js/src/jsgc.h | 2 +- js/src/jsnum.cpp | 5 +- js/src/jsnum.h | 273 +--------------------------- js/src/jsnuminlines.h | 3 +- js/src/jsstr.cpp | 5 +- js/src/jstypedarray.cpp | 9 +- js/src/methodjit/FastOps.cpp | 17 +- js/src/methodjit/PunboxAssembler.h | 11 +- js/src/methodjit/StubCalls.cpp | 4 +- js/src/methodjit/TypedArrayIC.h | 5 +- js/src/vm/NumericConversions.h | 281 +++++++++++++++++++++++++++++ js/src/vm/Xdr.h | 49 +++-- 17 files changed, 400 insertions(+), 333 deletions(-) create mode 100644 js/src/vm/NumericConversions.h diff --git a/js/src/frontend/FoldConstants.cpp b/js/src/frontend/FoldConstants.cpp index ba7d9b7c5b5..f397cbdbbf5 100644 --- a/js/src/frontend/FoldConstants.cpp +++ b/js/src/frontend/FoldConstants.cpp @@ -40,17 +40,16 @@ #include "mozilla/FloatingPoint.h" -#include "frontend/FoldConstants.h" - #include "jslibmath.h" - -#include "frontend/BytecodeEmitter.h" -#include "frontend/ParseNode.h" - #if JS_HAS_XML_SUPPORT #include "jsxml.h" #endif +#include "frontend/BytecodeEmitter.h" +#include "frontend/FoldConstants.h" +#include "frontend/ParseNode.h" +#include "vm/NumericConversions.h" + #include "jsatominlines.h" #include "vm/String-inl.h" @@ -157,16 +156,16 @@ FoldBinaryNumeric(JSContext *cx, JSOp op, ParseNode *pn1, ParseNode *pn2, switch (op) { case JSOP_LSH: case JSOP_RSH: - i = js_DoubleToECMAInt32(d); - j = js_DoubleToECMAInt32(d2); + i = ToInt32(d); + j = ToInt32(d2); j &= 31; d = (op == JSOP_LSH) ? i << j : i >> j; break; case JSOP_URSH: - j = js_DoubleToECMAInt32(d2); + j = ToInt32(d2); j &= 31; - d = js_DoubleToECMAUint32(d) >> j; + d = ToUint32(d) >> j; break; case JSOP_ADD: @@ -828,7 +827,7 @@ js::FoldConstants(JSContext *cx, ParseNode *pn, TreeContext *tc, bool inCond) d = pn1->pn_dval; switch (pn->getOp()) { case JSOP_BITNOT: - d = ~js_DoubleToECMAInt32(d); + d = ~ToInt32(d); break; case JSOP_NEG: diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index 7f0b5687228..49d9e1f2460 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -95,6 +95,7 @@ #include "js/MemoryMetrics.h" #include "yarr/BumpPointerAllocator.h" #include "vm/MethodGuard.h" +#include "vm/NumericConversions.h" #include "vm/StringBuffer.h" #include "vm/Xdr.h" @@ -345,7 +346,7 @@ JS_ConvertArgumentsVA(JSContext *cx, unsigned argc, jsval *argv, const char *for case 'I': if (!JS_ValueToNumber(cx, *sp, &d)) return JS_FALSE; - *va_arg(ap, double *) = js_DoubleToInteger(d); + *va_arg(ap, double *) = ToInteger(d); break; case 'S': case 'W': @@ -556,13 +557,13 @@ JS_DoubleIsInt32(double d, int32_t *ip) JS_PUBLIC_API(int32_t) JS_DoubleToInt32(double d) { - return js_DoubleToECMAInt32(d); + return ToInt32(d); } JS_PUBLIC_API(uint32_t) JS_DoubleToUint32(double d) { - return js_DoubleToECMAUint32(d); + return ToUint32(d); } JS_PUBLIC_API(JSBool) diff --git a/js/src/jsarray.cpp b/js/src/jsarray.cpp index a14e17c025f..7b6c4d5a842 100644 --- a/js/src/jsarray.cpp +++ b/js/src/jsarray.cpp @@ -129,6 +129,7 @@ #include "vm/ArgumentsObject.h" #include "vm/MethodGuard.h" +#include "vm/NumericConversions.h" #include "vm/StringBuffer.h" #include "ds/Sort.h" @@ -3709,7 +3710,7 @@ js_Array(JSContext *cx, unsigned argc, Value *vp) length = uint32_t(i); } else { double d = args[0].toDouble(); - length = js_DoubleToECMAUint32(d); + length = ToUint32(d); if (d != double(length)) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_ARRAY_LENGTH); return false; diff --git a/js/src/jsdate.cpp b/js/src/jsdate.cpp index 1a30deadc28..17718ab949e 100644 --- a/js/src/jsdate.cpp +++ b/js/src/jsdate.cpp @@ -75,6 +75,7 @@ #include "jslibmath.h" #include "vm/GlobalObject.h" +#include "vm/NumericConversions.h" #include "vm/StringBuffer.h" #include "jsinferinlines.h" @@ -614,7 +615,7 @@ date_msecFromArgs(JSContext *cx, CallArgs args, double *rval) *rval = js_NaN; return JS_TRUE; } - array[loop] = js_DoubleToInteger(d); + array[loop] = ToInteger(d); } else { if (loop == 2) { array[loop] = 1; /* Default the date argument to 1. */ @@ -1785,7 +1786,7 @@ date_makeTime(JSContext *cx, Native native, unsigned maxargs, JSBool local, unsi if (!MOZ_DOUBLE_IS_FINITE(nums[i])) { argIsNotFinite = true; } else { - nums[i] = js_DoubleToInteger(nums[i]); + nums[i] = ToInteger(nums[i]); } } @@ -1921,7 +1922,7 @@ date_makeDate(JSContext *cx, Native native, unsigned maxargs, JSBool local, unsi if (!MOZ_DOUBLE_IS_FINITE(nums[i])) { argIsNotFinite = true; } else { - nums[i] = js_DoubleToInteger(nums[i]); + nums[i] = ToInteger(nums[i]); } } @@ -2036,7 +2037,7 @@ date_setYear(JSContext *cx, unsigned argc, Value *vp) SetDateToNaN(cx, obj, &args.rval()); return true; } - year = js_DoubleToInteger(year); + year = ToInteger(year); if (year >= 0 && year <= 99) year += 1900; diff --git a/js/src/jsdate.h b/js/src/jsdate.h index b891a96e178..0e793624aff 100644 --- a/js/src/jsdate.h +++ b/js/src/jsdate.h @@ -46,13 +46,32 @@ #include "mozilla/FloatingPoint.h" -#include "jscntxt.h" +#include -#define HalfTimeDomain 8.64e15 +#include "jstypes.h" -#define TIMECLIP(d) ((MOZ_DOUBLE_IS_FINITE(d) \ - && !((d < 0 ? -d : d) > HalfTimeDomain)) \ - ? js_DoubleToInteger(d + (+0.)) : js_NaN) +#include "vm/NumericConversions.h" + +extern "C" { +struct JSObject; +struct JSContext; +} + +namespace js { + +/* ES5 15.9.1.14. */ +inline double +TIMECLIP(double time) +{ + /* Steps 1-2. */ + if (!MOZ_DOUBLE_IS_FINITE(time) || abs(time) > 8.64e15) + return js_NaN; + + /* Step 3. */ + return ToInteger(time + (+0.0)); +} + +} /* namespace js */ extern JSObject * js_InitDateClass(JSContext *cx, JSObject *obj); diff --git a/js/src/jsgc.h b/js/src/jsgc.h index 617afec943d..4d09ca8ed28 100644 --- a/js/src/jsgc.h +++ b/js/src/jsgc.h @@ -64,7 +64,7 @@ struct JSCompartment; -extern "C" void +extern void js_TraceXML(JSTracer *trc, JSXML* thing); #if JS_STACK_GROWTH_DIRECTION > 0 diff --git a/js/src/jsnum.cpp b/js/src/jsnum.cpp index db72988b5e2..a9ceba1a8d6 100644 --- a/js/src/jsnum.cpp +++ b/js/src/jsnum.cpp @@ -79,6 +79,7 @@ #include "vm/GlobalObject.h" #include "vm/MethodGuard.h" +#include "vm/NumericConversions.h" #include "vm/StringBuffer.h" #include "jsatominlines.h" @@ -1274,7 +1275,7 @@ ToInt32Slow(JSContext *cx, const Value &v, int32_t *out) if (!ToNumberSlow(cx, v, &d)) return false; } - *out = js_DoubleToECMAInt32(d); + *out = ToInt32(d); return true; } @@ -1289,7 +1290,7 @@ ToUint32Slow(JSContext *cx, const Value &v, uint32_t *out) if (!ToNumberSlow(cx, v, &d)) return false; } - *out = js_DoubleToECMAUint32(d); + *out = ToUint32(d); return true; } diff --git a/js/src/jsnum.h b/js/src/jsnum.h index 0d424f8bc1a..3ad946c1eac 100644 --- a/js/src/jsnum.h +++ b/js/src/jsnum.h @@ -46,6 +46,8 @@ #include "jsobj.h" +#include "vm/NumericConversions.h" + extern double js_NaN; extern double js_PositiveInfinity; extern double js_NegativeInfinity; @@ -221,275 +223,6 @@ num_parseInt(JSContext *cx, unsigned argc, Value *vp); } /* namespace js */ -union jsdpun { - struct { -#if defined(IS_LITTLE_ENDIAN) && !defined(FPU_IS_ARM_FPA) - uint32_t lo, hi; -#else - uint32_t hi, lo; -#endif - } s; - uint64_t u64; - double d; -}; - -/* - * Specialized ToInt32 and ToUint32 converters for doubles. - */ -/* - * From the ES3 spec, 9.5 - * 2. If Result(1) is NaN, +0, -0, +Inf, or -Inf, return +0. - * 3. Compute sign(Result(1)) * floor(abs(Result(1))). - * 4. Compute Result(3) modulo 2^32; that is, a finite integer value k of Number - * type with positive sign and less than 2^32 in magnitude such the mathematical - * difference of Result(3) and k is mathematically an integer multiple of 2^32. - * 5. If Result(4) is greater than or equal to 2^31, return Result(4)- 2^32, - * otherwise return Result(4). - */ -static inline int32_t -js_DoubleToECMAInt32(double d) -{ -#if defined(__i386__) || defined(__i386) || defined(__x86_64__) || \ - defined(_M_IX86) || defined(_M_X64) - jsdpun du, duh, two32; - uint32_t di_h, u_tmp, expon, shift_amount; - int32_t mask32; - - /* - * Algorithm Outline - * Step 1. If d is NaN, +/-Inf or |d|>=2^84 or |d|<1, then return 0 - * All of this is implemented based on an exponent comparison. - * Step 2. If |d|<2^31, then return (int)d - * The cast to integer (conversion in RZ mode) returns the correct result. - * Step 3. If |d|>=2^32, d:=fmod(d, 2^32) is taken -- but without a call - * Step 4. If |d|>=2^31, then the fractional bits are cleared before - * applying the correction by 2^32: d - sign(d)*2^32 - * Step 5. Return (int)d - */ - - du.d = d; - di_h = du.s.hi; - - u_tmp = (di_h & 0x7ff00000) - 0x3ff00000; - if (u_tmp >= (0x45300000-0x3ff00000)) { - // d is Nan, +/-Inf or +/-0, or |d|>=2^(32+52) or |d|<1, in which case result=0 - return 0; - } - - if (u_tmp < 0x01f00000) { - // |d|<2^31 - return int32_t(d); - } - - if (u_tmp > 0x01f00000) { - // |d|>=2^32 - expon = u_tmp >> 20; - shift_amount = expon - 21; - duh.u64 = du.u64; - mask32 = 0x80000000; - if (shift_amount < 32) { - mask32 >>= shift_amount; - duh.s.hi = du.s.hi & mask32; - duh.s.lo = 0; - } else { - mask32 >>= (shift_amount-32); - duh.s.hi = du.s.hi; - duh.s.lo = du.s.lo & mask32; - } - du.d -= duh.d; - } - - di_h = du.s.hi; - - // eliminate fractional bits - u_tmp = (di_h & 0x7ff00000); - if (u_tmp >= 0x41e00000) { - // |d|>=2^31 - expon = u_tmp >> 20; - shift_amount = expon - (0x3ff - 11); - mask32 = 0x80000000; - if (shift_amount < 32) { - mask32 >>= shift_amount; - du.s.hi &= mask32; - du.s.lo = 0; - } else { - mask32 >>= (shift_amount-32); - du.s.lo &= mask32; - } - two32.s.hi = 0x41f00000 ^ (du.s.hi & 0x80000000); - two32.s.lo = 0; - du.d -= two32.d; - } - - return int32_t(du.d); -#elif defined (__arm__) && defined (__GNUC__) - int32_t i; - uint32_t tmp0; - uint32_t tmp1; - uint32_t tmp2; - asm ( - // We use a pure integer solution here. In the 'softfp' ABI, the argument - // will start in r0 and r1, and VFP can't do all of the necessary ECMA - // conversions by itself so some integer code will be required anyway. A - // hybrid solution is faster on A9, but this pure integer solution is - // notably faster for A8. - - // %0 is the result register, and may alias either of the %[QR]1 registers. - // %Q4 holds the lower part of the mantissa. - // %R4 holds the sign, exponent, and the upper part of the mantissa. - // %1, %2 and %3 are used as temporary values. - - // Extract the exponent. -" mov %1, %R4, LSR #20\n" -" bic %1, %1, #(1 << 11)\n" // Clear the sign. - - // Set the implicit top bit of the mantissa. This clobbers a bit of the - // exponent, but we have already extracted that. -" orr %R4, %R4, #(1 << 20)\n" - - // Special Cases - // We should return zero in the following special cases: - // - Exponent is 0x000 - 1023: +/-0 or subnormal. - // - Exponent is 0x7ff - 1023: +/-INFINITY or NaN - // - This case is implicitly handled by the standard code path anyway, - // as shifting the mantissa up by the exponent will result in '0'. - // - // The result is composed of the mantissa, prepended with '1' and - // bit-shifted left by the (decoded) exponent. Note that because the r1[20] - // is the bit with value '1', r1 is effectively already shifted (left) by - // 20 bits, and r0 is already shifted by 52 bits. - - // Adjust the exponent to remove the encoding offset. If the decoded - // exponent is negative, quickly bail out with '0' as such values round to - // zero anyway. This also catches +/-0 and subnormals. -" sub %1, %1, #0xff\n" -" subs %1, %1, #0x300\n" -" bmi 8f\n" - - // %1 = (decoded) exponent >= 0 - // %R4 = upper mantissa and sign - - // ---- Lower Mantissa ---- -" subs %3, %1, #52\n" // Calculate exp-52 -" bmi 1f\n" - - // Shift r0 left by exp-52. - // Ensure that we don't overflow ARM's 8-bit shift operand range. - // We need to handle anything up to an 11-bit value here as we know that - // 52 <= exp <= 1024 (0x400). Any shift beyond 31 bits results in zero - // anyway, so as long as we don't touch the bottom 5 bits, we can use - // a logical OR to push long shifts into the 32 <= (exp&0xff) <= 255 range. -" bic %2, %3, #0xff\n" -" orr %3, %3, %2, LSR #3\n" - // We can now perform a straight shift, avoiding the need for any - // conditional instructions or extra branches. -" mov %Q4, %Q4, LSL %3\n" -" b 2f\n" -"1:\n" // Shift r0 right by 52-exp. - // We know that 0 <= exp < 52, and we can shift up to 255 bits so 52-exp - // will always be a valid shift and we can sk%3 the range check for this case. -" rsb %3, %1, #52\n" -" mov %Q4, %Q4, LSR %3\n" - - // %1 = (decoded) exponent - // %R4 = upper mantissa and sign - // %Q4 = partially-converted integer - -"2:\n" - // ---- Upper Mantissa ---- - // This is much the same as the lower mantissa, with a few different - // boundary checks and some masking to hide the exponent & sign bit in the - // upper word. - // Note that the upper mantissa is pre-shifted by 20 in %R4, but we shift - // it left more to remove the sign and exponent so it is effectively - // pre-shifted by 31 bits. -" subs %3, %1, #31\n" // Calculate exp-31 -" mov %1, %R4, LSL #11\n" // Re-use %1 as a temporary register. -" bmi 3f\n" - - // Shift %R4 left by exp-31. - // Avoid overflowing the 8-bit shift range, as before. -" bic %2, %3, #0xff\n" -" orr %3, %3, %2, LSR #3\n" - // Perform the shift. -" mov %2, %1, LSL %3\n" -" b 4f\n" -"3:\n" // Shift r1 right by 31-exp. - // We know that 0 <= exp < 31, and we can shift up to 255 bits so 31-exp - // will always be a valid shift and we can skip the range check for this case. -" rsb %3, %3, #0\n" // Calculate 31-exp from -(exp-31) -" mov %2, %1, LSR %3\n" // Thumb-2 can't do "LSR %3" in "orr". - - // %Q4 = partially-converted integer (lower) - // %R4 = upper mantissa and sign - // %2 = partially-converted integer (upper) - -"4:\n" - // Combine the converted parts. -" orr %Q4, %Q4, %2\n" - // Negate the result if we have to, and move it to %0 in the process. To - // avoid conditionals, we can do this by inverting on %R4[31], then adding - // %R4[31]>>31. -" eor %Q4, %Q4, %R4, ASR #31\n" -" add %0, %Q4, %R4, LSR #31\n" -" b 9f\n" -"8:\n" - // +/-INFINITY, +/-0, subnormals, NaNs, and anything else out-of-range that - // will result in a conversion of '0'. -" mov %0, #0\n" -"9:\n" - : "=r" (i), "=&r" (tmp0), "=&r" (tmp1), "=&r" (tmp2) - : "r" (d) - : "cc" - ); - return i; -#else - int32_t i; - double two32, two31; - - if (!MOZ_DOUBLE_IS_FINITE(d)) - return 0; - - i = (int32_t) d; - if ((double) i == d) - return i; - - two32 = 4294967296.0; - two31 = 2147483648.0; - d = fmod(d, two32); - d = (d >= 0) ? floor(d) : ceil(d) + two32; - return (int32_t) (d >= two31 ? d - two32 : d); -#endif -} - -inline uint32_t -js_DoubleToECMAUint32(double d) -{ - return uint32_t(js_DoubleToECMAInt32(d)); -} - -/* - * Convert a double to an integral number, stored in a double. - * If d is NaN, return 0. If d is an infinity, return it without conversion. - */ -static inline double -js_DoubleToInteger(double d) -{ - if (d == 0) - return d; - - if (!MOZ_DOUBLE_IS_FINITE(d)) { - if (MOZ_DOUBLE_IS_NaN(d)) - return 0; - return d; - } - - JSBool neg = (d < 0); - d = floor(neg ? -d : d); - - return neg ? -d : d; -} - /* * Similar to strtod except that it replaces overflows with infinities of the * correct sign, and underflows with zeros of the correct sign. Guaranteed to @@ -560,7 +293,7 @@ ToInteger(JSContext *cx, const js::Value &v, double *dp) if (!ToNumberSlow(cx, v, dp)) return false; } - *dp = js_DoubleToInteger(*dp); + *dp = ToInteger(*dp); return true; } diff --git a/js/src/jsnuminlines.h b/js/src/jsnuminlines.h index 169fb022cbb..e438743643c 100644 --- a/js/src/jsnuminlines.h +++ b/js/src/jsnuminlines.h @@ -40,6 +40,7 @@ #ifndef jsnuminlines_h___ #define jsnuminlines_h___ +#include "vm/NumericConversions.h" #include "vm/Unicode.h" #include "jsstrinlines.h" @@ -51,7 +52,7 @@ template struct NumberTraits { }; template<> struct NumberTraits { static JS_ALWAYS_INLINE int32_t NaN() { return 0; } static JS_ALWAYS_INLINE int32_t toSelfType(int32_t i) { return i; } - static JS_ALWAYS_INLINE int32_t toSelfType(double d) { return js_DoubleToECMAUint32(d); } + static JS_ALWAYS_INLINE int32_t toSelfType(double d) { return ToUint32(d); } }; template<> struct NumberTraits { static JS_ALWAYS_INLINE double NaN() { return js_NaN; } diff --git a/js/src/jsstr.cpp b/js/src/jsstr.cpp index 928a9031775..202b972c04d 100644 --- a/js/src/jsstr.cpp +++ b/js/src/jsstr.cpp @@ -76,6 +76,7 @@ #include "builtin/RegExp.h" #include "vm/GlobalObject.h" +#include "vm/NumericConversions.h" #include "vm/RegExpObject.h" #include "vm/StringBuffer.h" @@ -1242,7 +1243,7 @@ str_lastIndexOf(JSContext *cx, unsigned argc, Value *vp) if (!ToNumber(cx, args[1], &d)) return false; if (!MOZ_DOUBLE_IS_NaN(d)) { - d = js_DoubleToInteger(d); + d = ToInteger(d); if (d <= 0) i = 0; else if (d < i) @@ -2603,7 +2604,7 @@ js::str_split(JSContext *cx, unsigned argc, Value *vp) double d; if (!ToNumber(cx, args[1], &d)) return false; - limit = js_DoubleToECMAUint32(d); + limit = ToUint32(d); } else { limit = UINT32_MAX; } diff --git a/js/src/jstypedarray.cpp b/js/src/jstypedarray.cpp index ea44d7537e8..bef0f455038 100644 --- a/js/src/jstypedarray.cpp +++ b/js/src/jstypedarray.cpp @@ -61,6 +61,7 @@ #include "jstypedarray.h" #include "vm/GlobalObject.h" +#include "vm/NumericConversions.h" #include "jsatominlines.h" #include "jsinferinlines.h" @@ -1186,7 +1187,7 @@ class TypedArrayTemplate setIndex(tarray, index, NativeType(d)); } else if (ArrayTypeIsUnsigned()) { JS_ASSERT(sizeof(NativeType) <= 4); - uint32_t n = js_DoubleToECMAUint32(d); + uint32_t n = ToUint32(d); setIndex(tarray, index, NativeType(n)); } else if (ArrayTypeID() == TypedArray::TYPE_UINT8_CLAMPED) { // The uint8_clamped type has a special rounding converter @@ -1194,7 +1195,7 @@ class TypedArrayTemplate setIndex(tarray, index, NativeType(d)); } else { JS_ASSERT(sizeof(NativeType) <= 4); - int32_t n = js_DoubleToECMAInt32(d); + int32_t n = ToInt32(d); setIndex(tarray, index, NativeType(n)); } @@ -1758,8 +1759,8 @@ class TypedArrayTemplate if (TypeIsFloatingPoint()) return NativeType(d); if (TypeIsUnsigned()) - return NativeType(js_DoubleToECMAUint32(d)); - return NativeType(js_DoubleToECMAInt32(d)); + return NativeType(ToUint32(d)); + return NativeType(ToInt32(d)); } static NativeType diff --git a/js/src/methodjit/FastOps.cpp b/js/src/methodjit/FastOps.cpp index bcb047dd284..3a6acea2165 100644 --- a/js/src/methodjit/FastOps.cpp +++ b/js/src/methodjit/FastOps.cpp @@ -41,16 +41,18 @@ #include "jsbool.h" #include "jscntxt.h" #include "jslibmath.h" -#include "jsnum.h" #include "jsscope.h" -#include "jsobjinlines.h" -#include "jsscriptinlines.h" -#include "jstypedarrayinlines.h" #include "frontend/BytecodeEmitter.h" #include "methodjit/MethodJIT.h" #include "methodjit/Compiler.h" #include "methodjit/StubCalls.h" +#include "vm/NumericConversions.h" + +#include "jsobjinlines.h" +#include "jsscriptinlines.h" +#include "jstypedarrayinlines.h" + #include "methodjit/FrameState-inl.h" #include "jsautooplen.h" @@ -1262,7 +1264,7 @@ mjit::Compiler::convertForTypedArray(int atype, ValueRemat *vr, bool *allocated) } else { i32 = (atype == TypedArray::TYPE_UINT8_CLAMPED) ? ClampDoubleToUint8(v.toDouble()) - : js_DoubleToECMAInt32(v.toDouble()); + : ToInt32(v.toDouble()); } *vr = ValueRemat::FromConstant(Int32Value(i32)); } @@ -1698,9 +1700,8 @@ mjit::Compiler::jsop_setelem(bool popGuaranteed) ic.fastPathRejoin = masm.label(); // When generating typed array stubs, it may be necessary to call - // js_DoubleToECMAInt32(), which would clobber registers. To deal with - // this, we tell the IC exactly which registers need to be saved - // across calls. + // ToInt32(), which would clobber registers. To deal with this, we tell the + // IC exactly which registers need to be saved across calls. ic.volatileMask = frame.regsInUse(); // If the RHS will be popped, and doesn't overlap any live values, then diff --git a/js/src/methodjit/PunboxAssembler.h b/js/src/methodjit/PunboxAssembler.h index db1b42aa445..d363988e319 100644 --- a/js/src/methodjit/PunboxAssembler.h +++ b/js/src/methodjit/PunboxAssembler.h @@ -43,7 +43,7 @@ #include "assembler/assembler/MacroAssembler.h" #include "methodjit/MachineRegs.h" #include "methodjit/RematInfo.h" -#include "jsnum.h" +#include "jsval.h" namespace js { namespace mjit { @@ -397,9 +397,12 @@ class PunboxAssembler : public JSC::MacroAssembler } void loadStaticDouble(const double *dp, FPRegisterID dest, RegisterID scratch) { - jsdpun du; - du.d = *dp; - move(ImmPtr(reinterpret_cast(du.u64)), scratch); + union DoublePun { + double d; + uint64_t u; + } pun; + pun.d = *dp; + move(ImmPtr(reinterpret_cast(pun.u)), scratch); m_assembler.movq_rr(scratch, dest); } diff --git a/js/src/methodjit/StubCalls.cpp b/js/src/methodjit/StubCalls.cpp index ca0309e4736..3ff2c8a8a9b 100644 --- a/js/src/methodjit/StubCalls.cpp +++ b/js/src/methodjit/StubCalls.cpp @@ -51,7 +51,9 @@ #include "jsbool.h" #include "assembler/assembler/MacroAssemblerCodeRef.h" #include "jstypes.h" + #include "vm/Debugger.h" +#include "vm/NumericConversions.h" #include "vm/String.h" #include "methodjit/Compiler.h" #include "methodjit/StubCalls.h" @@ -1734,7 +1736,7 @@ stubs::ConvertToTypedInt(JSContext *cx, Value *vp) if (vp->isDouble()) { if (Clamped) return ClampDoubleToUint8(vp->toDouble()); - return js_DoubleToECMAInt32(vp->toDouble()); + return ToInt32(vp->toDouble()); } if (vp->isNull() || vp->isObject() || vp->isUndefined()) diff --git a/js/src/methodjit/TypedArrayIC.h b/js/src/methodjit/TypedArrayIC.h index 5841249178c..f7618dea908 100644 --- a/js/src/methodjit/TypedArrayIC.h +++ b/js/src/methodjit/TypedArrayIC.h @@ -42,7 +42,8 @@ #include "jscntxt.h" #include "jstypedarray.h" -#include "jstypedarrayinlines.h" + +#include "vm/NumericConversions.h" #include "jsnuminlines.h" #include "jstypedarrayinlines.h" @@ -129,7 +130,7 @@ ConstantFoldForIntArray(JSContext *cx, JSObject *tarray, ValueRemat *vr) if (v.isDouble()) { i32 = (TypedArray::getType(tarray) == js::TypedArray::TYPE_UINT8_CLAMPED) ? ClampDoubleToUint8(v.toDouble()) - : js_DoubleToECMAInt32(v.toDouble()); + : ToInt32(v.toDouble()); } else if (v.isInt32()) { i32 = v.toInt32(); if (TypedArray::getType(tarray) == js::TypedArray::TYPE_UINT8_CLAMPED) diff --git a/js/src/vm/NumericConversions.h b/js/src/vm/NumericConversions.h new file mode 100644 index 00000000000..dc201c26e8c --- /dev/null +++ b/js/src/vm/NumericConversions.h @@ -0,0 +1,281 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sw=4 et tw=78: + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef NumericConversions_h___ +#define NumericConversions_h___ + +#include "mozilla/FloatingPoint.h" + +#include + +/* A NaN whose bit pattern conforms to JS::Value's bit pattern restrictions. */ +extern double js_NaN; + +namespace js { + +namespace detail { + +union DoublePun { + struct { +#if defined(IS_LITTLE_ENDIAN) && !defined(FPU_IS_ARM_FPA) + uint32_t lo, hi; +#else + uint32_t hi, lo; +#endif + } s; + uint64_t u64; + double d; +}; + +} /* namespace detail */ + +/* ES5 9.5 ToInt32 (specialized for doubles). */ +inline int32_t +ToInt32(double d) +{ +#if defined(__i386__) || defined(__i386) || defined(__x86_64__) || \ + defined(_M_IX86) || defined(_M_X64) + detail::DoublePun du, duh, two32; + uint32_t di_h, u_tmp, expon, shift_amount; + int32_t mask32; + + /* + * Algorithm Outline + * Step 1. If d is NaN, +/-Inf or |d|>=2^84 or |d|<1, then return 0 + * All of this is implemented based on an exponent comparison. + * Step 2. If |d|<2^31, then return (int)d + * The cast to integer (conversion in RZ mode) returns the correct result. + * Step 3. If |d|>=2^32, d:=fmod(d, 2^32) is taken -- but without a call + * Step 4. If |d|>=2^31, then the fractional bits are cleared before + * applying the correction by 2^32: d - sign(d)*2^32 + * Step 5. Return (int)d + */ + + du.d = d; + di_h = du.s.hi; + + u_tmp = (di_h & 0x7ff00000) - 0x3ff00000; + if (u_tmp >= (0x45300000-0x3ff00000)) { + // d is Nan, +/-Inf or +/-0, or |d|>=2^(32+52) or |d|<1, in which case result=0 + return 0; + } + + if (u_tmp < 0x01f00000) { + // |d|<2^31 + return int32_t(d); + } + + if (u_tmp > 0x01f00000) { + // |d|>=2^32 + expon = u_tmp >> 20; + shift_amount = expon - 21; + duh.u64 = du.u64; + mask32 = 0x80000000; + if (shift_amount < 32) { + mask32 >>= shift_amount; + duh.s.hi = du.s.hi & mask32; + duh.s.lo = 0; + } else { + mask32 >>= (shift_amount-32); + duh.s.hi = du.s.hi; + duh.s.lo = du.s.lo & mask32; + } + du.d -= duh.d; + } + + di_h = du.s.hi; + + // eliminate fractional bits + u_tmp = (di_h & 0x7ff00000); + if (u_tmp >= 0x41e00000) { + // |d|>=2^31 + expon = u_tmp >> 20; + shift_amount = expon - (0x3ff - 11); + mask32 = 0x80000000; + if (shift_amount < 32) { + mask32 >>= shift_amount; + du.s.hi &= mask32; + du.s.lo = 0; + } else { + mask32 >>= (shift_amount-32); + du.s.lo &= mask32; + } + two32.s.hi = 0x41f00000 ^ (du.s.hi & 0x80000000); + two32.s.lo = 0; + du.d -= two32.d; + } + + return int32_t(du.d); +#elif defined (__arm__) && defined (__GNUC__) + int32_t i; + uint32_t tmp0; + uint32_t tmp1; + uint32_t tmp2; + asm ( + // We use a pure integer solution here. In the 'softfp' ABI, the argument + // will start in r0 and r1, and VFP can't do all of the necessary ECMA + // conversions by itself so some integer code will be required anyway. A + // hybrid solution is faster on A9, but this pure integer solution is + // notably faster for A8. + + // %0 is the result register, and may alias either of the %[QR]1 registers. + // %Q4 holds the lower part of the mantissa. + // %R4 holds the sign, exponent, and the upper part of the mantissa. + // %1, %2 and %3 are used as temporary values. + + // Extract the exponent. +" mov %1, %R4, LSR #20\n" +" bic %1, %1, #(1 << 11)\n" // Clear the sign. + + // Set the implicit top bit of the mantissa. This clobbers a bit of the + // exponent, but we have already extracted that. +" orr %R4, %R4, #(1 << 20)\n" + + // Special Cases + // We should return zero in the following special cases: + // - Exponent is 0x000 - 1023: +/-0 or subnormal. + // - Exponent is 0x7ff - 1023: +/-INFINITY or NaN + // - This case is implicitly handled by the standard code path anyway, + // as shifting the mantissa up by the exponent will result in '0'. + // + // The result is composed of the mantissa, prepended with '1' and + // bit-shifted left by the (decoded) exponent. Note that because the r1[20] + // is the bit with value '1', r1 is effectively already shifted (left) by + // 20 bits, and r0 is already shifted by 52 bits. + + // Adjust the exponent to remove the encoding offset. If the decoded + // exponent is negative, quickly bail out with '0' as such values round to + // zero anyway. This also catches +/-0 and subnormals. +" sub %1, %1, #0xff\n" +" subs %1, %1, #0x300\n" +" bmi 8f\n" + + // %1 = (decoded) exponent >= 0 + // %R4 = upper mantissa and sign + + // ---- Lower Mantissa ---- +" subs %3, %1, #52\n" // Calculate exp-52 +" bmi 1f\n" + + // Shift r0 left by exp-52. + // Ensure that we don't overflow ARM's 8-bit shift operand range. + // We need to handle anything up to an 11-bit value here as we know that + // 52 <= exp <= 1024 (0x400). Any shift beyond 31 bits results in zero + // anyway, so as long as we don't touch the bottom 5 bits, we can use + // a logical OR to push long shifts into the 32 <= (exp&0xff) <= 255 range. +" bic %2, %3, #0xff\n" +" orr %3, %3, %2, LSR #3\n" + // We can now perform a straight shift, avoiding the need for any + // conditional instructions or extra branches. +" mov %Q4, %Q4, LSL %3\n" +" b 2f\n" +"1:\n" // Shift r0 right by 52-exp. + // We know that 0 <= exp < 52, and we can shift up to 255 bits so 52-exp + // will always be a valid shift and we can sk%3 the range check for this case. +" rsb %3, %1, #52\n" +" mov %Q4, %Q4, LSR %3\n" + + // %1 = (decoded) exponent + // %R4 = upper mantissa and sign + // %Q4 = partially-converted integer + +"2:\n" + // ---- Upper Mantissa ---- + // This is much the same as the lower mantissa, with a few different + // boundary checks and some masking to hide the exponent & sign bit in the + // upper word. + // Note that the upper mantissa is pre-shifted by 20 in %R4, but we shift + // it left more to remove the sign and exponent so it is effectively + // pre-shifted by 31 bits. +" subs %3, %1, #31\n" // Calculate exp-31 +" mov %1, %R4, LSL #11\n" // Re-use %1 as a temporary register. +" bmi 3f\n" + + // Shift %R4 left by exp-31. + // Avoid overflowing the 8-bit shift range, as before. +" bic %2, %3, #0xff\n" +" orr %3, %3, %2, LSR #3\n" + // Perform the shift. +" mov %2, %1, LSL %3\n" +" b 4f\n" +"3:\n" // Shift r1 right by 31-exp. + // We know that 0 <= exp < 31, and we can shift up to 255 bits so 31-exp + // will always be a valid shift and we can skip the range check for this case. +" rsb %3, %3, #0\n" // Calculate 31-exp from -(exp-31) +" mov %2, %1, LSR %3\n" // Thumb-2 can't do "LSR %3" in "orr". + + // %Q4 = partially-converted integer (lower) + // %R4 = upper mantissa and sign + // %2 = partially-converted integer (upper) + +"4:\n" + // Combine the converted parts. +" orr %Q4, %Q4, %2\n" + // Negate the result if we have to, and move it to %0 in the process. To + // avoid conditionals, we can do this by inverting on %R4[31], then adding + // %R4[31]>>31. +" eor %Q4, %Q4, %R4, ASR #31\n" +" add %0, %Q4, %R4, LSR #31\n" +" b 9f\n" +"8:\n" + // +/-INFINITY, +/-0, subnormals, NaNs, and anything else out-of-range that + // will result in a conversion of '0'. +" mov %0, #0\n" +"9:\n" + : "=r" (i), "=&r" (tmp0), "=&r" (tmp1), "=&r" (tmp2) + : "r" (d) + : "cc" + ); + return i; +#else + int32_t i; + double two32, two31; + + if (!MOZ_DOUBLE_IS_FINITE(d)) + return 0; + + /* FIXME: This relies on undefined behavior; see bug 667739. */ + i = (int32_t) d; + if ((double) i == d) + return i; + + two32 = 4294967296.0; + two31 = 2147483648.0; + d = fmod(d, two32); + d = (d >= 0) ? floor(d) : ceil(d) + two32; + return (int32_t) (d >= two31 ? d - two32 : d); +#endif +} + +/* ES5 9.6 (specialized for doubles). */ +inline uint32_t +ToUint32(double d) +{ + return uint32_t(ToInt32(d)); +} + +/* ES5 9.4 ToInteger (specialized for doubles). */ +inline double +ToInteger(double d) +{ + if (d == 0) + return d; + + if (!MOZ_DOUBLE_IS_FINITE(d)) { + if (MOZ_DOUBLE_IS_NaN(d)) + return 0; + return d; + } + + bool neg = (d < 0); + d = floor(neg ? -d : d); + return neg ? -d : d; +} + +} /* namespace js */ + +#endif /* NumericConversions_h__ */ diff --git a/js/src/vm/Xdr.h b/js/src/vm/Xdr.h index 1ca4fce95c8..78f3a6be44f 100644 --- a/js/src/vm/Xdr.h +++ b/js/src/vm/Xdr.h @@ -44,6 +44,8 @@ #include "jsprvtd.h" #include "jsnum.h" +#include "vm/NumericConversions.h" + namespace js { /* @@ -212,28 +214,47 @@ class XDRState { return true; } - bool codeDouble(double *dp) { - jsdpun tmp; + bool codeUint64(uint64_t *n) { if (mode == XDR_ENCODE) { - uint8_t *ptr = buf.write(sizeof tmp); + uint8_t *ptr = buf.write(sizeof(*n)); if (!ptr) return false; - tmp.d = *dp; - tmp.s.lo = NormalizeByteOrder32(tmp.s.lo); - tmp.s.hi = NormalizeByteOrder32(tmp.s.hi); - memcpy(ptr, &tmp.s.lo, sizeof tmp.s.lo); - memcpy(ptr + sizeof tmp.s.lo, &tmp.s.hi, sizeof tmp.s.hi); + ptr[0] = (*n >> 0) & 0xFF; + ptr[1] = (*n >> 8) & 0xFF; + ptr[2] = (*n >> 16) & 0xFF; + ptr[3] = (*n >> 24) & 0xFF; + ptr[4] = (*n >> 32) & 0xFF; + ptr[5] = (*n >> 40) & 0xFF; + ptr[6] = (*n >> 48) & 0xFF; + ptr[7] = (*n >> 56) & 0xFF; } else { - const uint8_t *ptr = buf.read(sizeof tmp); - memcpy(&tmp.s.lo, ptr, sizeof tmp.s.lo); - memcpy(&tmp.s.hi, ptr + sizeof tmp.s.lo, sizeof tmp.s.hi); - tmp.s.lo = NormalizeByteOrder32(tmp.s.lo); - tmp.s.hi = NormalizeByteOrder32(tmp.s.hi); - *dp = tmp.d; + const uint8_t *ptr = buf.read(sizeof(*n)); + *n = (uint64_t(ptr[0]) << 0) | + (uint64_t(ptr[1]) << 8) | + (uint64_t(ptr[2]) << 16) | + (uint64_t(ptr[3]) << 24) | + (uint64_t(ptr[4]) << 32) | + (uint64_t(ptr[5]) << 40) | + (uint64_t(ptr[6]) << 48) | + (uint64_t(ptr[7]) << 56); } return true; } + bool codeDouble(double *dp) { + union DoublePun { + double d; + uint64_t u; + } pun; + if (mode == XDR_ENCODE) + pun.d = *dp; + if (!codeUint64(&pun.u)) + return false; + if (mode == XDR_DECODE) + *dp = pun.d; + return true; + } + bool codeBytes(void *bytes, size_t len) { if (mode == XDR_ENCODE) { uint8_t *ptr = buf.write(len); From 3518781dd9907e779165360255fbf7b4f9580c77 Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Thu, 19 Apr 2012 16:22:08 -0700 Subject: [PATCH 055/182] Bug 747197 - Rename TIMECLIP to TimeClip to match the spec spelling (also as it's no longer a macro). r=luke --HG-- extra : rebase_source : 28083b4eeeee68c829b8804545d3ad6bb5660561 --- js/src/jsclone.cpp | 4 +++- js/src/jsdate.cpp | 18 +++++++++--------- js/src/jsdate.h | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/js/src/jsclone.cpp b/js/src/jsclone.cpp index 865c44c4c59..3bd33dd43e4 100644 --- a/js/src/jsclone.cpp +++ b/js/src/jsclone.cpp @@ -36,6 +36,8 @@ * * ***** END LICENSE BLOCK ***** */ +#include "mozilla/FloatingPoint.h" + #include "jsclone.h" #include "jsdate.h" #include "jstypedarray.h" @@ -835,7 +837,7 @@ JSStructuredCloneReader::startRead(Value *vp) double d; if (!in.readDouble(&d) || !checkDouble(d)) return false; - if (d == d && d != TIMECLIP(d)) { + if (!MOZ_DOUBLE_IS_NaN(d) && d != TimeClip(d)) { JS_ReportErrorNumber(context(), js_GetErrorMessage, NULL, JSMSG_SC_BAD_SERIALIZED_DATA, "date"); return false; diff --git a/js/src/jsdate.cpp b/js/src/jsdate.cpp index 17718ab949e..678c3bb2d14 100644 --- a/js/src/jsdate.cpp +++ b/js/src/jsdate.cpp @@ -647,7 +647,7 @@ date_UTC(JSContext *cx, unsigned argc, Value *vp) if (!date_msecFromArgs(cx, args, &msec_time)) return JS_FALSE; - msec_time = TIMECLIP(msec_time); + msec_time = TimeClip(msec_time); args.rval().setNumber(msec_time); return JS_TRUE; @@ -1206,7 +1206,7 @@ date_parse(JSContext *cx, unsigned argc, Value *vp) return true; } - result = TIMECLIP(result); + result = TimeClip(result); vp->setNumber(result); return true; } @@ -1747,7 +1747,7 @@ date_setTime(JSContext *cx, unsigned argc, Value *vp) if (!ToNumber(cx, args[0], &result)) return false; - return SetUTCTime(cx, obj, TIMECLIP(result), &args.rval()); + return SetUTCTime(cx, obj, TimeClip(result), &args.rval()); } static JSBool @@ -1843,7 +1843,7 @@ date_makeTime(JSContext *cx, Native native, unsigned maxargs, JSBool local, unsi if (local) result = UTC(result, cx); - return SetUTCTime(cx, obj, TIMECLIP(result), &args.rval()); + return SetUTCTime(cx, obj, TimeClip(result), &args.rval()); } static JSBool @@ -1973,7 +1973,7 @@ date_makeDate(JSContext *cx, Native native, unsigned maxargs, JSBool local, unsi if (local) result = UTC(result, cx); - return SetUTCTime(cx, obj, TIMECLIP(result), &args.rval()); + return SetUTCTime(cx, obj, TimeClip(result), &args.rval()); } static JSBool @@ -2046,7 +2046,7 @@ date_setYear(JSContext *cx, unsigned argc, Value *vp) result = MakeDate(day, TimeWithinDay(t)); result = UTC(result, cx); - return SetUTCTime(cx, obj, TIMECLIP(result), &args.rval()); + return SetUTCTime(cx, obj, TimeClip(result), &args.rval()); } /* constants for toString, toUTCString */ @@ -2623,7 +2623,7 @@ js_Date(JSContext *cx, unsigned argc, Value *vp) /* the argument is a millisecond number */ if (!ToNumber(cx, args[0], &d)) return false; - d = TIMECLIP(d); + d = TimeClip(d); } else { /* the argument is a string; parse it. */ JSString *str = ToString(cx, args[0]); @@ -2637,7 +2637,7 @@ js_Date(JSContext *cx, unsigned argc, Value *vp) if (!date_parseString(linearStr, &d, cx)) d = js_NaN; else - d = TIMECLIP(d); + d = TimeClip(d); } } else { double msec_time; @@ -2646,7 +2646,7 @@ js_Date(JSContext *cx, unsigned argc, Value *vp) if (MOZ_DOUBLE_IS_FINITE(msec_time)) { msec_time = UTC(msec_time, cx); - msec_time = TIMECLIP(msec_time); + msec_time = TimeClip(msec_time); } d = msec_time; } diff --git a/js/src/jsdate.h b/js/src/jsdate.h index 0e793624aff..39309f9b978 100644 --- a/js/src/jsdate.h +++ b/js/src/jsdate.h @@ -61,7 +61,7 @@ namespace js { /* ES5 15.9.1.14. */ inline double -TIMECLIP(double time) +TimeClip(double time) { /* Steps 1-2. */ if (!MOZ_DOUBLE_IS_FINITE(time) || abs(time) > 8.64e15) From e07abf10ae3fd2496f52bb8839f995d260e1c8ee Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Tue, 10 Apr 2012 16:33:44 -0700 Subject: [PATCH 056/182] Bug 739380 - Start to implement the default [[GetP]] hook from the proto-climbing refactoring for the various element types. r=bhackett --HG-- extra : rebase_source : 0270610c88d3315023a4cc582abbaf62dcf8a1cc --- js/src/jsapi.h | 57 ++++++++++++++ js/src/vm/ObjectImpl.cpp | 165 ++++++++++++++++++++++++++++++++++++++- js/src/vm/ObjectImpl.h | 55 ++++++++++++- 3 files changed, 272 insertions(+), 5 deletions(-) diff --git a/js/src/jsapi.h b/js/src/jsapi.h index 0184bd47b42..cfdeddbb5ba 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -703,6 +703,14 @@ MagicValue(JSWhyMagic why) return v; } +static JS_ALWAYS_INLINE Value +NumberValue(float f) +{ + Value v; + v.setNumber(f); + return v; +} + static JS_ALWAYS_INLINE Value NumberValue(double dbl) { @@ -711,6 +719,55 @@ NumberValue(double dbl) return v; } +static JS_ALWAYS_INLINE Value +NumberValue(size_t s) +{ + Value v; + if (s > JSVAL_INT_MAX) + v.setDouble(s); + else + v.setInt32(int32_t(s)); + return v; +} + +static JS_ALWAYS_INLINE Value +NumberValue(int8_t i) +{ + return Int32Value(i); +} + +static JS_ALWAYS_INLINE Value +NumberValue(uint8_t i) +{ + return Int32Value(i); +} + +static JS_ALWAYS_INLINE Value +NumberValue(int16_t i) +{ + return Int32Value(i); +} + +static JS_ALWAYS_INLINE Value +NumberValue(uint16_t i) +{ + return Int32Value(i); +} + +static JS_ALWAYS_INLINE Value +NumberValue(int32_t i) +{ + return Int32Value(i); +} + +static JS_ALWAYS_INLINE Value +NumberValue(uint32_t i) +{ + Value v; + v.setNumber(i); + return v; +} + static JS_ALWAYS_INLINE Value ObjectOrNullValue(JSObject *obj) { diff --git a/js/src/vm/ObjectImpl.cpp b/js/src/vm/ObjectImpl.cpp index 64dd1952dc6..02d3c6e78e2 100644 --- a/js/src/vm/ObjectImpl.cpp +++ b/js/src/vm/ObjectImpl.cpp @@ -11,6 +11,8 @@ #include "jsscope.h" #include "jsobjinlines.h" +#include "js/TemplateLib.h" + #include "Debugger.h" #include "ObjectImpl.h" @@ -288,6 +290,63 @@ js::ObjectImpl::markChildren(JSTracer *trc) MarkObjectSlots(trc, obj, 0, obj->slotSpan()); } +bool +DenseElementsHeader::getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc) +{ + MOZ_ASSERT(this == &obj->elementsHeader()); + + uint32_t len = initializedLength(); + if (index >= len) { + *desc = PropDesc::undefined(); + return true; + } + + HeapSlot &slot = obj->elements[index]; + if (slot.isMagic(JS_ARRAY_HOLE)) { + *desc = PropDesc::undefined(); + return true; + } + + *desc = PropDesc(slot, PropDesc::Writable, PropDesc::Enumerable, PropDesc::Configurable); + return true; +} + +bool +SparseElementsHeader::getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc) +{ + MOZ_ASSERT(this == &obj->elementsHeader()); + + MOZ_NOT_REACHED("NYI"); + return false; +} + +template +bool +TypedElementsHeader::getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, + PropDesc *desc) +{ + MOZ_ASSERT(this == &obj->elementsHeader()); + + if (index >= length()) { + *desc = PropDesc::undefined(); + return true; + } + + *desc = PropDesc(NumberValue(getElement(index)), PropDesc::Writable, + PropDesc::Enumerable, PropDesc::Configurable); + return false; +} + +bool +ArrayBufferElementsHeader::getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, + PropDesc *desc) +{ + MOZ_ASSERT(this == &obj->elementsHeader()); + + MOZ_NOT_REACHED("NYI"); + return false; +} + bool SparseElementsHeader::defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded) @@ -345,7 +404,7 @@ DenseElementsHeader::defineElement(JSContext *cx, ObjectImpl *obj, uint32_t inde return true; MOZ_ALWAYS_FALSE(js_ReportValueErrorFlags(cx, JSREPORT_ERROR, JSMSG_OBJECT_NOT_EXTENSIBLE, JSDVG_IGNORE_STACK, - ObjectValue(*obj->asObjectPtr()), + ObjectValue(*obj), NULL, NULL, NULL)); return false; } @@ -393,7 +452,7 @@ TypedElementsHeader::defineElement(JSContext *cx, ObjectImpl *obj, *succeeded = false; js_ReportValueErrorFlags(cx, JSREPORT_ERROR, JSMSG_OBJECT_NOT_EXTENSIBLE, JSDVG_IGNORE_STACK, - ObjectValue(*(JSObject*)obj), // XXX jwalden dodgy cast + ObjectValue(*obj), NULL, NULL, NULL); return false; } @@ -411,6 +470,108 @@ ArrayBufferElementsHeader::defineElement(JSContext *cx, ObjectImpl *obj, return DefineElement(cx, delegate, index, desc, shouldThrow, succeeded); } +bool +js::GetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, + Value *vp) +{ + NEW_OBJECT_REPRESENTATION_ONLY(); + + do { + MOZ_ASSERT(obj); + + if (static_cast(obj)->isProxy()) { // XXX + MOZ_NOT_REACHED("NYI: proxy [[GetP]]"); + return false; + } + + ElementsHeader &header = obj->elementsHeader(); + + bool res; + PropDesc desc; + switch (header.kind()) { + case DenseElements: + res = header.asDenseElements().getOwnElement(cx, obj, index, &desc); + break; + case SparseElements: + res = header.asSparseElements().getOwnElement(cx, obj, index, &desc); + break; + case Uint8Elements: + res = header.asUint8Elements().getOwnElement(cx, obj, index, &desc); + break; + case Int8Elements: + res = header.asInt8Elements().getOwnElement(cx, obj, index, &desc); + break; + case Uint16Elements: + res = header.asUint16Elements().getOwnElement(cx, obj, index, &desc); + break; + case Int16Elements: + res = header.asInt16Elements().getOwnElement(cx, obj, index, &desc); + break; + case Uint32Elements: + res = header.asUint32Elements().getOwnElement(cx, obj, index, &desc); + break; + case Int32Elements: + res = header.asInt32Elements().getOwnElement(cx, obj, index, &desc); + break; + case Uint8ClampedElements: + res = header.asUint8ClampedElements().getOwnElement(cx, obj, index, &desc); + break; + case Float32Elements: + res = header.asFloat32Elements().getOwnElement(cx, obj, index, &desc); + break; + case Float64Elements: + res = header.asFloat64Elements().getOwnElement(cx, obj, index, &desc); + break; + case ArrayBufferElements: + res = header.asArrayBufferElements().getOwnElement(cx, obj, index, &desc); + break; + } + if (!res) + return false; + + /* No property? Recur or bottom out. */ + if (desc.isUndefined()) { + obj = obj->getProto(); + if (obj) + continue; + + vp->setUndefined(); + return true; + } + + /* If it's a data property, return the value. */ + if (desc.isDataDescriptor()) { + *vp = desc.value(); + return true; + } + + /* If it's an accessor property, call its [[Get]] with the receiver. */ + if (desc.isAccessorDescriptor()) { + Value get = desc.getterValue(); + if (get.isUndefined()) { + vp->setUndefined(); + return true; + } + + InvokeArgsGuard args; + if (!cx->stack.pushInvokeArgs(cx, 0, &args)) + return false; + + /* Push fval, thisv, and the args. */ + args.calleev() = get; + args.thisv() = ObjectValue(*receiver); + + bool ok = Invoke(cx, args); + *vp = args.rval(); + return ok; + } + + /* Otherwise it's a PropertyOp-based property. XXX handle this! */ + MOZ_NOT_REACHED("NYI: handle PropertyOp'd properties here"); + return false; + } while (false); +} + bool js::DefineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded) diff --git a/js/src/vm/ObjectImpl.h b/js/src/vm/ObjectImpl.h index d29190b3897..40ec3297466 100644 --- a/js/src/vm/ObjectImpl.h +++ b/js/src/vm/ObjectImpl.h @@ -68,8 +68,27 @@ struct PropDesc { friend class AutoPropDescArrayRooter; friend void JS::AutoGCRooter::trace(JSTracer *trc); + enum Enumerability { Enumerable = true, NonEnumerable = false }; + enum Configurability { Configurable = true, NonConfigurable = false }; + enum Writability { Writable = true, NonWritable = false }; + PropDesc(); + static PropDesc undefined() { return PropDesc(); } + + PropDesc(const Value &v, Writability writable, + Enumerability enumerable, Configurability configurable) + : pd_(UndefinedValue()), + value_(v), + get_(UndefinedValue()), set_(UndefinedValue()), + attrs((writable ? 0 : JSPROP_READONLY) | + (enumerable ? JSPROP_ENUMERATE : 0) | + (configurable ? 0 : JSPROP_PERMANENT)), + hasGet_(false), hasSet_(false), + hasValue_(true), hasWritable_(true), hasEnumerable_(true), hasConfigurable_(true), + isUndefined_(false) + {} + /* * 8.10.5 ToPropertyDescriptor(Obj) * @@ -94,8 +113,6 @@ struct PropDesc { void initFromPropertyDescriptor(const PropertyDescriptor &desc); bool makeObject(JSContext *cx); - void setUndefined() { isUndefined_ = true; } - bool isUndefined() const { return isUndefined_; } bool hasGet() const { MOZ_ASSERT(!isUndefined()); return hasGet_; } @@ -304,6 +321,8 @@ class DenseElementsHeader : public ElementsHeader return ElementsHeader::length; } + bool getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc); + bool defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); @@ -328,6 +347,8 @@ class SparseElementsHeader : public ElementsHeader return ElementsHeader::length; } + bool getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc); + bool defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); @@ -431,11 +452,20 @@ template<> inline const bool TypeIsUint8Clamped() { return true; template class TypedElementsHeader : public ElementsHeader { + T getElement(uint32_t index) { + MOZ_ASSERT(index < length()); + return reinterpret_cast(this + 1)[index]; + } + public: - uint32_t byteLength() const { + uint32_t length() const { + MOZ_ASSERT(Uint8Elements <= kind()); + MOZ_ASSERT(kind() <= Float64Elements); return ElementsHeader::length; } + bool getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc); + bool defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); @@ -521,6 +551,8 @@ class Uint8ClampedElementsHeader : public TypedElementsHeader class ArrayBufferElementsHeader : public ElementsHeader { public: + bool getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc); + bool defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); @@ -686,6 +718,9 @@ struct Shape; class NewObjectCache; +inline Value +ObjectValue(ObjectImpl &obj); + /* * ObjectImpl specifies the internal implementation of an object. (In contrast * JSObject specifies an "external" interface, at the conceptual level of that @@ -772,6 +807,8 @@ class ObjectImpl : public gc::Cell JSObject * asObjectPtr() { return reinterpret_cast(this); } + friend inline Value ObjectValue(ObjectImpl &obj); + /* These functions are public, and they should remain public. */ public: @@ -1082,6 +1119,18 @@ class ObjectImpl : public gc::Cell static size_t offsetOfSlots() { return offsetof(ObjectImpl, slots); } }; +inline Value +ObjectValue(ObjectImpl &obj) +{ + Value v; + v.setObject(*obj.asObjectPtr()); + return v; +} + +/* Proposed default [[GetP]](Receiver, P) method. */ +extern bool +GetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, Value *vp); + extern bool DefineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); From 19307f19cec31561931250d3abe2d6c265587036 Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Mon, 9 Apr 2012 16:03:23 -0700 Subject: [PATCH 057/182] Bug 739380 - Start to implement the [[SetP]] hook from the proto-climbing refactoring. r=bhackett --HG-- extra : rebase_source : 80de606a7e0128b0e61b35af0f31b6b4876e6b6f --- js/src/vm/ObjectImpl.cpp | 221 +++++++++++++++++++++++++++++++-------- js/src/vm/ObjectImpl.h | 123 +++++++++++++++++++++- 2 files changed, 296 insertions(+), 48 deletions(-) diff --git a/js/src/vm/ObjectImpl.cpp b/js/src/vm/ObjectImpl.cpp index 02d3c6e78e2..53d891e23e6 100644 --- a/js/src/vm/ObjectImpl.cpp +++ b/js/src/vm/ObjectImpl.cpp @@ -470,6 +470,41 @@ ArrayBufferElementsHeader::defineElement(JSContext *cx, ObjectImpl *obj, return DefineElement(cx, delegate, index, desc, shouldThrow, succeeded); } +bool +js::GetOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc) +{ + ElementsHeader &header = obj->elementsHeader(); + switch (header.kind()) { + case DenseElements: + return header.asDenseElements().getOwnElement(cx, obj, index, desc); + case SparseElements: + return header.asSparseElements().getOwnElement(cx, obj, index, desc); + case Uint8Elements: + return header.asUint8Elements().getOwnElement(cx, obj, index, desc); + case Int8Elements: + return header.asInt8Elements().getOwnElement(cx, obj, index, desc); + case Uint16Elements: + return header.asUint16Elements().getOwnElement(cx, obj, index, desc); + case Int16Elements: + return header.asInt16Elements().getOwnElement(cx, obj, index, desc); + case Uint32Elements: + return header.asUint32Elements().getOwnElement(cx, obj, index, desc); + case Int32Elements: + return header.asInt32Elements().getOwnElement(cx, obj, index, desc); + case Uint8ClampedElements: + return header.asUint8ClampedElements().getOwnElement(cx, obj, index, desc); + case Float32Elements: + return header.asFloat32Elements().getOwnElement(cx, obj, index, desc); + case Float64Elements: + return header.asFloat64Elements().getOwnElement(cx, obj, index, desc); + case ArrayBufferElements: + return header.asArrayBufferElements().getOwnElement(cx, obj, index, desc); + } + + MOZ_NOT_REACHED("bad elements kind!"); + return false; +} + bool js::GetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, Value *vp) @@ -484,49 +519,8 @@ js::GetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t in return false; } - ElementsHeader &header = obj->elementsHeader(); - - bool res; PropDesc desc; - switch (header.kind()) { - case DenseElements: - res = header.asDenseElements().getOwnElement(cx, obj, index, &desc); - break; - case SparseElements: - res = header.asSparseElements().getOwnElement(cx, obj, index, &desc); - break; - case Uint8Elements: - res = header.asUint8Elements().getOwnElement(cx, obj, index, &desc); - break; - case Int8Elements: - res = header.asInt8Elements().getOwnElement(cx, obj, index, &desc); - break; - case Uint16Elements: - res = header.asUint16Elements().getOwnElement(cx, obj, index, &desc); - break; - case Int16Elements: - res = header.asInt16Elements().getOwnElement(cx, obj, index, &desc); - break; - case Uint32Elements: - res = header.asUint32Elements().getOwnElement(cx, obj, index, &desc); - break; - case Int32Elements: - res = header.asInt32Elements().getOwnElement(cx, obj, index, &desc); - break; - case Uint8ClampedElements: - res = header.asUint8ClampedElements().getOwnElement(cx, obj, index, &desc); - break; - case Float32Elements: - res = header.asFloat32Elements().getOwnElement(cx, obj, index, &desc); - break; - case Float64Elements: - res = header.asFloat64Elements().getOwnElement(cx, obj, index, &desc); - break; - case ArrayBufferElements: - res = header.asArrayBufferElements().getOwnElement(cx, obj, index, &desc); - break; - } - if (!res) + if (!GetOwnElement(cx, obj, index, &desc)) return false; /* No property? Recur or bottom out. */ @@ -557,7 +551,7 @@ js::GetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t in if (!cx->stack.pushInvokeArgs(cx, 0, &args)) return false; - /* Push fval, thisv, and the args. */ + /* Push get, receiver, and no args. */ args.calleev() = get; args.thisv() = ObjectValue(*receiver); @@ -622,3 +616,144 @@ js::DefineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc MOZ_NOT_REACHED("bad elements kind!"); return false; } + +bool +SparseElementsHeader::setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, + uint32_t index, const Value &v, bool *succeeded) +{ + MOZ_ASSERT(this == &obj->elementsHeader()); + + MOZ_NOT_REACHED("NYI"); + return false; +} + +bool +DenseElementsHeader::setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, + uint32_t index, const Value &v, bool *succeeded) +{ + MOZ_ASSERT(this == &obj->elementsHeader()); + + MOZ_NOT_REACHED("NYI"); + return false; +} + +template +bool +TypedElementsHeader::setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, + uint32_t index, const Value &v, bool *succeeded) +{ + MOZ_ASSERT(this == &obj->elementsHeader()); + + uint32_t len = length(); + if (index >= len) { + /* + * Silent ignore is better than an exception here, because at some + * point we may want to support other properties on these objects. + */ + *succeeded = true; + return true; + } + + /* Convert the value being set to the element type. */ + double d; + if (v.isNumber()) { + d = v.toNumber(); + } else if (v.isNull()) { + d = 0.0; + } else if (v.isPrimitive()) { + if (v.isString()) { + if (!ToNumber(cx, v, &d)) + return false; + } else if (v.isUndefined()) { + d = js_NaN; + } else { + d = double(v.toBoolean()); + } + } else { + // non-primitive assignments become NaN or 0 (for float/int arrays) + d = js_NaN; + } + + assign(index, d); + *succeeded = true; + return true; +} + +bool +ArrayBufferElementsHeader::setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, + uint32_t index, const Value &v, bool *succeeded) +{ + MOZ_ASSERT(this == &obj->elementsHeader()); + + JSObject *delegate = ArrayBufferDelegate(cx, obj); + if (!delegate) + return false; + return SetElement(cx, obj, receiver, index, v, succeeded); +} + +bool +js::SetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, + const Value &v, bool *succeeded) +{ + NEW_OBJECT_REPRESENTATION_ONLY(); + + do { + MOZ_ASSERT(obj); + + if (static_cast(obj)->isProxy()) { // XXX + MOZ_NOT_REACHED("NYI: proxy [[SetP]]"); + return false; + } + + PropDesc ownDesc; + if (!GetOwnElement(cx, obj, index, &ownDesc)) + return false; + + if (!ownDesc.isUndefined()) { + if (ownDesc.isDataDescriptor()) { + if (!ownDesc.writable()) { + *succeeded = false; + return true; + } + + if (receiver == obj) { + PropDesc updateDesc = PropDesc::valueOnly(v); + return DefineElement(cx, receiver, index, updateDesc, false, succeeded); + } + + PropDesc newDesc; + return DefineElement(cx, receiver, index, newDesc, false, succeeded); + } + + if (ownDesc.isAccessorDescriptor()) { + Value setter = ownDesc.setterValue(); + if (setter.isUndefined()) { + *succeeded = false; + return true; + } + + InvokeArgsGuard args; + if (!cx->stack.pushInvokeArgs(cx, 1, &args)) + return false; + + /* Push set, receiver, and v as the sole argument. */ + args.calleev() = setter; + args.thisv() = ObjectValue(*receiver); + args[0] = v; + + *succeeded = true; + return Invoke(cx, args); + } + + MOZ_NOT_REACHED("NYI: setting PropertyOp-based property"); + return false; + } + + obj = obj->getProto(); + if (obj) + continue; + + PropDesc newDesc(v, PropDesc::Writable, PropDesc::Enumerable, PropDesc::Configurable); + return DefineElement(cx, receiver, index, newDesc, false, succeeded); + } while (false); +} diff --git a/js/src/vm/ObjectImpl.h b/js/src/vm/ObjectImpl.h index 40ec3297466..f38f24487a8 100644 --- a/js/src/vm/ObjectImpl.h +++ b/js/src/vm/ObjectImpl.h @@ -16,6 +16,7 @@ #include "jsval.h" #include "gc/Barrier.h" +#include "vm/NumericConversions.h" namespace js { @@ -64,6 +65,17 @@ struct PropDesc { /* Or maybe this represents a property's absence, and it's undefined. */ bool isUndefined_ : 1; + PropDesc(const Value &v) + : pd_(UndefinedValue()), + value_(v), + get_(UndefinedValue()), set_(UndefinedValue()), + attrs(0), + hasGet_(false), hasSet_(false), + hasValue_(true), hasWritable_(false), hasEnumerable_(false), hasConfigurable_(false), + isUndefined_(false) + { + } + public: friend class AutoPropDescArrayRooter; friend void JS::AutoGCRooter::trace(JSTracer *trc); @@ -75,6 +87,7 @@ struct PropDesc { PropDesc(); static PropDesc undefined() { return PropDesc(); } + static PropDesc valueOnly(const Value &v) { return PropDesc(v); } PropDesc(const Value &v, Writability writable, Enumerability enumerable, Configurability configurable) @@ -224,11 +237,16 @@ class Int32ElementsHeader; class Uint8ClampedElementsHeader; class Float32ElementsHeader; class Float64ElementsHeader; +class Uint8ClampedElementsHeader; class ArrayBufferElementsHeader; enum ElementsKind { DenseElements, SparseElements, + + ArrayBufferElements, + + /* These typed element types must remain contiguous. */ Uint8Elements, Int8Elements, Uint16Elements, @@ -237,15 +255,14 @@ enum ElementsKind { Int32Elements, Uint8ClampedElements, Float32Elements, - Float64Elements, - ArrayBufferElements + Float64Elements }; class ElementsHeader { protected: uint32_t type; - uint32_t length; /* Array length, byte length of ArrayBuffer */ + uint32_t length; /* Array length, ArrayBuffer length, typed array length */ union { class { @@ -272,6 +289,7 @@ class ElementsHeader inline bool isDenseElements() const { return kind() == DenseElements; } inline bool isSparseElements() const { return kind() == SparseElements; } + inline bool isArrayBufferElements() const { return kind() == ArrayBufferElements; } inline bool isUint8Elements() const { return kind() == Uint8Elements; } inline bool isInt8Elements() const { return kind() == Int8Elements; } inline bool isUint16Elements() const { return kind() == Uint16Elements; } @@ -281,10 +299,10 @@ class ElementsHeader inline bool isUint8ClampedElements() const { return kind() == Uint8ClampedElements; } inline bool isFloat32Elements() const { return kind() == Float32Elements; } inline bool isFloat64Elements() const { return kind() == Float64Elements; } - inline bool isArrayBufferElements() const { return kind() == ArrayBufferElements; } inline DenseElementsHeader & asDenseElements(); inline SparseElementsHeader & asSparseElements(); + inline ArrayBufferElementsHeader & asArrayBufferElements(); inline Uint8ElementsHeader & asUint8Elements(); inline Int8ElementsHeader & asInt8Elements(); inline Uint16ElementsHeader & asUint16Elements(); @@ -294,7 +312,6 @@ class ElementsHeader inline Uint8ClampedElementsHeader & asUint8ClampedElements(); inline Float32ElementsHeader & asFloat32Elements(); inline Float64ElementsHeader & asFloat64Elements(); - inline ArrayBufferElementsHeader & asArrayBufferElements(); static ElementsHeader * fromElements(HeapSlot *elems) { return reinterpret_cast(uintptr_t(elems) - sizeof(ElementsHeader)); @@ -326,6 +343,9 @@ class DenseElementsHeader : public ElementsHeader bool defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); + bool setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, + const Value &v, bool *succeeded); + private: inline bool isDenseElements() const MOZ_DELETE; inline DenseElementsHeader & asDenseElements() MOZ_DELETE; @@ -352,6 +372,9 @@ class SparseElementsHeader : public ElementsHeader bool defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); + bool setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, + const Value &v, bool *succeeded); + private: inline bool isSparseElements() const MOZ_DELETE; inline SparseElementsHeader & asSparseElements() MOZ_DELETE; @@ -457,6 +480,13 @@ class TypedElementsHeader : public ElementsHeader return reinterpret_cast(this + 1)[index]; } + inline void assign(uint32_t index, double d); + + void setElement(uint32_t index, T value) { + MOZ_ASSERT(index < length()); + reinterpret_cast(this + 1)[index] = value; + } + public: uint32_t length() const { MOZ_ASSERT(Uint8Elements <= kind()); @@ -469,11 +499,83 @@ class TypedElementsHeader : public ElementsHeader bool defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); + bool setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, + const Value &v, bool *succeeded); + private: TypedElementsHeader(const TypedElementsHeader &other) MOZ_DELETE; void operator=(const TypedElementsHeader &other) MOZ_DELETE; }; +template inline void +TypedElementsHeader::assign(uint32_t index, double d) +{ + MOZ_NOT_REACHED("didn't specialize for this element type"); +} + +template<> inline void +TypedElementsHeader::assign(uint32_t index, double d) +{ + double i = ToInteger(d); + uint8_t u = (i <= 0) + ? 0 + : (i >= 255) + ? 255 + : uint8_t(i); + setElement(index, uint8_clamped(u)); +} + +template<> inline void +TypedElementsHeader::assign(uint32_t index, double d) +{ + setElement(index, uint8_t(ToUint32(d))); +} + +template<> inline void +TypedElementsHeader::assign(uint32_t index, double d) +{ + /* FIXME: Casting out-of-range signed integers has undefined behavior! */ + setElement(index, int8_t(ToInt32(d))); +} + +template<> inline void +TypedElementsHeader::assign(uint32_t index, double d) +{ + setElement(index, uint16_t(ToUint32(d))); +} + +template<> inline void +TypedElementsHeader::assign(uint32_t index, double d) +{ + /* FIXME: Casting out-of-range signed integers has undefined behavior! */ + setElement(index, int16_t(ToInt32(d))); +} + +template<> inline void +TypedElementsHeader::assign(uint32_t index, double d) +{ + setElement(index, ToUint32(d)); +} + +template<> inline void +TypedElementsHeader::assign(uint32_t index, double d) +{ + /* FIXME: Casting out-of-range signed integers has undefined behavior! */ + setElement(index, int32_t(ToInt32(d))); +} + +template<> inline void +TypedElementsHeader::assign(uint32_t index, double d) +{ + setElement(index, float(d)); +} + +template<> inline void +TypedElementsHeader::assign(uint32_t index, double d) +{ + setElement(index, d); +} + class Uint8ElementsHeader : public TypedElementsHeader { private: @@ -556,6 +658,9 @@ class ArrayBufferElementsHeader : public ElementsHeader bool defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); + bool setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, + const Value &v, bool *succeeded); + private: inline bool isArrayBufferElements() const MOZ_DELETE; inline ArrayBufferElementsHeader & asArrayBufferElements() MOZ_DELETE; @@ -1127,6 +1232,9 @@ ObjectValue(ObjectImpl &obj) return v; } +bool +GetOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc); + /* Proposed default [[GetP]](Receiver, P) method. */ extern bool GetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, Value *vp); @@ -1135,6 +1243,11 @@ extern bool DefineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); +/* Proposed default [[SetP]](Receiver, P, V) method. */ +extern bool +SetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, const Value &v, + bool *succeeded); + } /* namespace js */ #endif /* ObjectImpl_h__ */ From 102e57eba99087c01ee5ada85706fe77c2cb220c Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Tue, 10 Apr 2012 16:33:44 -0700 Subject: [PATCH 058/182] Bug 739380 - Start to implement a [[HasProperty]] hook, per the proto-climbing refactoring, for elements. r=bhackett --HG-- extra : rebase_source : a48f4fc318145fd1c089cfb5b4df05eb1ff4350c --- js/src/vm/ObjectImpl.cpp | 31 +++++++++++++++++++++++++++++++ js/src/vm/ObjectImpl.h | 3 +++ 2 files changed, 34 insertions(+) diff --git a/js/src/vm/ObjectImpl.cpp b/js/src/vm/ObjectImpl.cpp index 53d891e23e6..933272a028e 100644 --- a/js/src/vm/ObjectImpl.cpp +++ b/js/src/vm/ObjectImpl.cpp @@ -566,6 +566,37 @@ js::GetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t in } while (false); } +bool +js::HasElement(JSContext *cx, ObjectImpl *obj, uint32_t index, bool *found) +{ + NEW_OBJECT_REPRESENTATION_ONLY(); + + do { + MOZ_ASSERT(obj); + + if (static_cast(obj)->isProxy()) { // XXX + MOZ_NOT_REACHED("NYI: proxy [[HasProperty]]"); + return false; + } + + PropDesc prop; + if (!GetOwnElement(cx, obj, index, &prop)) + return false; + + if (!prop.isUndefined()) { + *found = true; + return true; + } + + obj = obj->getProto(); + if (obj) + continue; + + *found = false; + return true; + } while (false); +} + bool js::DefineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded) diff --git a/js/src/vm/ObjectImpl.h b/js/src/vm/ObjectImpl.h index f38f24487a8..c69f50f37cb 100644 --- a/js/src/vm/ObjectImpl.h +++ b/js/src/vm/ObjectImpl.h @@ -1248,6 +1248,9 @@ extern bool SetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, const Value &v, bool *succeeded); +extern bool +HasElement(JSContext *cx, ObjectImpl *obj, uint32_t index, bool *found); + } /* namespace js */ #endif /* ObjectImpl_h__ */ From c9c6ded92fa8e3b67aa5d3d75770e6ddc42c3a83 Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Tue, 24 Apr 2012 16:29:42 -0700 Subject: [PATCH 059/182] Add a NumberValue(uint64_t) overload, and remove the size_t overload, as it might be the case that size_t and uint32_t, say, are the same type. Followup to bug 747197, r=bustage --- js/src/jsapi.h | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/js/src/jsapi.h b/js/src/jsapi.h index cfdeddbb5ba..41162acd5e7 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -719,17 +719,6 @@ NumberValue(double dbl) return v; } -static JS_ALWAYS_INLINE Value -NumberValue(size_t s) -{ - Value v; - if (s > JSVAL_INT_MAX) - v.setDouble(s); - else - v.setInt32(int32_t(s)); - return v; -} - static JS_ALWAYS_INLINE Value NumberValue(int8_t i) { @@ -768,6 +757,18 @@ NumberValue(uint32_t i) return v; } +static JS_ALWAYS_INLINE Value +NumberValue(uint64_t i) +{ + MOZ_ASSERT(uint64_t(double(i)) == i, "value creation from uint64_t was lossy"); + Value v; + if (i > JSVAL_INT_MAX) + v.setDouble(i); + else + v.setInt32(int32_t(i)); + return v; +} + static JS_ALWAYS_INLINE Value ObjectOrNullValue(JSObject *obj) { From 27d927a1595c7da32a2ba6a6e49ec1f92d8653f9 Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Tue, 24 Apr 2012 16:47:28 -0700 Subject: [PATCH 060/182] Back out a9764c9ec124, d8aac2bd90db, d167f7fbb53e, and ca7b13e02cd5 for not-entirely-trivial build bustage. r=bustage --- js/src/jsapi.h | 58 ------- js/src/vm/ObjectImpl.cpp | 331 +-------------------------------------- js/src/vm/ObjectImpl.h | 181 +-------------------- 3 files changed, 10 insertions(+), 560 deletions(-) diff --git a/js/src/jsapi.h b/js/src/jsapi.h index 41162acd5e7..0184bd47b42 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -703,14 +703,6 @@ MagicValue(JSWhyMagic why) return v; } -static JS_ALWAYS_INLINE Value -NumberValue(float f) -{ - Value v; - v.setNumber(f); - return v; -} - static JS_ALWAYS_INLINE Value NumberValue(double dbl) { @@ -719,56 +711,6 @@ NumberValue(double dbl) return v; } -static JS_ALWAYS_INLINE Value -NumberValue(int8_t i) -{ - return Int32Value(i); -} - -static JS_ALWAYS_INLINE Value -NumberValue(uint8_t i) -{ - return Int32Value(i); -} - -static JS_ALWAYS_INLINE Value -NumberValue(int16_t i) -{ - return Int32Value(i); -} - -static JS_ALWAYS_INLINE Value -NumberValue(uint16_t i) -{ - return Int32Value(i); -} - -static JS_ALWAYS_INLINE Value -NumberValue(int32_t i) -{ - return Int32Value(i); -} - -static JS_ALWAYS_INLINE Value -NumberValue(uint32_t i) -{ - Value v; - v.setNumber(i); - return v; -} - -static JS_ALWAYS_INLINE Value -NumberValue(uint64_t i) -{ - MOZ_ASSERT(uint64_t(double(i)) == i, "value creation from uint64_t was lossy"); - Value v; - if (i > JSVAL_INT_MAX) - v.setDouble(i); - else - v.setInt32(int32_t(i)); - return v; -} - static JS_ALWAYS_INLINE Value ObjectOrNullValue(JSObject *obj) { diff --git a/js/src/vm/ObjectImpl.cpp b/js/src/vm/ObjectImpl.cpp index 933272a028e..64dd1952dc6 100644 --- a/js/src/vm/ObjectImpl.cpp +++ b/js/src/vm/ObjectImpl.cpp @@ -11,8 +11,6 @@ #include "jsscope.h" #include "jsobjinlines.h" -#include "js/TemplateLib.h" - #include "Debugger.h" #include "ObjectImpl.h" @@ -290,63 +288,6 @@ js::ObjectImpl::markChildren(JSTracer *trc) MarkObjectSlots(trc, obj, 0, obj->slotSpan()); } -bool -DenseElementsHeader::getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc) -{ - MOZ_ASSERT(this == &obj->elementsHeader()); - - uint32_t len = initializedLength(); - if (index >= len) { - *desc = PropDesc::undefined(); - return true; - } - - HeapSlot &slot = obj->elements[index]; - if (slot.isMagic(JS_ARRAY_HOLE)) { - *desc = PropDesc::undefined(); - return true; - } - - *desc = PropDesc(slot, PropDesc::Writable, PropDesc::Enumerable, PropDesc::Configurable); - return true; -} - -bool -SparseElementsHeader::getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc) -{ - MOZ_ASSERT(this == &obj->elementsHeader()); - - MOZ_NOT_REACHED("NYI"); - return false; -} - -template -bool -TypedElementsHeader::getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, - PropDesc *desc) -{ - MOZ_ASSERT(this == &obj->elementsHeader()); - - if (index >= length()) { - *desc = PropDesc::undefined(); - return true; - } - - *desc = PropDesc(NumberValue(getElement(index)), PropDesc::Writable, - PropDesc::Enumerable, PropDesc::Configurable); - return false; -} - -bool -ArrayBufferElementsHeader::getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, - PropDesc *desc) -{ - MOZ_ASSERT(this == &obj->elementsHeader()); - - MOZ_NOT_REACHED("NYI"); - return false; -} - bool SparseElementsHeader::defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded) @@ -404,7 +345,7 @@ DenseElementsHeader::defineElement(JSContext *cx, ObjectImpl *obj, uint32_t inde return true; MOZ_ALWAYS_FALSE(js_ReportValueErrorFlags(cx, JSREPORT_ERROR, JSMSG_OBJECT_NOT_EXTENSIBLE, JSDVG_IGNORE_STACK, - ObjectValue(*obj), + ObjectValue(*obj->asObjectPtr()), NULL, NULL, NULL)); return false; } @@ -452,7 +393,7 @@ TypedElementsHeader::defineElement(JSContext *cx, ObjectImpl *obj, *succeeded = false; js_ReportValueErrorFlags(cx, JSREPORT_ERROR, JSMSG_OBJECT_NOT_EXTENSIBLE, JSDVG_IGNORE_STACK, - ObjectValue(*obj), + ObjectValue(*(JSObject*)obj), // XXX jwalden dodgy cast NULL, NULL, NULL); return false; } @@ -470,133 +411,6 @@ ArrayBufferElementsHeader::defineElement(JSContext *cx, ObjectImpl *obj, return DefineElement(cx, delegate, index, desc, shouldThrow, succeeded); } -bool -js::GetOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc) -{ - ElementsHeader &header = obj->elementsHeader(); - switch (header.kind()) { - case DenseElements: - return header.asDenseElements().getOwnElement(cx, obj, index, desc); - case SparseElements: - return header.asSparseElements().getOwnElement(cx, obj, index, desc); - case Uint8Elements: - return header.asUint8Elements().getOwnElement(cx, obj, index, desc); - case Int8Elements: - return header.asInt8Elements().getOwnElement(cx, obj, index, desc); - case Uint16Elements: - return header.asUint16Elements().getOwnElement(cx, obj, index, desc); - case Int16Elements: - return header.asInt16Elements().getOwnElement(cx, obj, index, desc); - case Uint32Elements: - return header.asUint32Elements().getOwnElement(cx, obj, index, desc); - case Int32Elements: - return header.asInt32Elements().getOwnElement(cx, obj, index, desc); - case Uint8ClampedElements: - return header.asUint8ClampedElements().getOwnElement(cx, obj, index, desc); - case Float32Elements: - return header.asFloat32Elements().getOwnElement(cx, obj, index, desc); - case Float64Elements: - return header.asFloat64Elements().getOwnElement(cx, obj, index, desc); - case ArrayBufferElements: - return header.asArrayBufferElements().getOwnElement(cx, obj, index, desc); - } - - MOZ_NOT_REACHED("bad elements kind!"); - return false; -} - -bool -js::GetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, - Value *vp) -{ - NEW_OBJECT_REPRESENTATION_ONLY(); - - do { - MOZ_ASSERT(obj); - - if (static_cast(obj)->isProxy()) { // XXX - MOZ_NOT_REACHED("NYI: proxy [[GetP]]"); - return false; - } - - PropDesc desc; - if (!GetOwnElement(cx, obj, index, &desc)) - return false; - - /* No property? Recur or bottom out. */ - if (desc.isUndefined()) { - obj = obj->getProto(); - if (obj) - continue; - - vp->setUndefined(); - return true; - } - - /* If it's a data property, return the value. */ - if (desc.isDataDescriptor()) { - *vp = desc.value(); - return true; - } - - /* If it's an accessor property, call its [[Get]] with the receiver. */ - if (desc.isAccessorDescriptor()) { - Value get = desc.getterValue(); - if (get.isUndefined()) { - vp->setUndefined(); - return true; - } - - InvokeArgsGuard args; - if (!cx->stack.pushInvokeArgs(cx, 0, &args)) - return false; - - /* Push get, receiver, and no args. */ - args.calleev() = get; - args.thisv() = ObjectValue(*receiver); - - bool ok = Invoke(cx, args); - *vp = args.rval(); - return ok; - } - - /* Otherwise it's a PropertyOp-based property. XXX handle this! */ - MOZ_NOT_REACHED("NYI: handle PropertyOp'd properties here"); - return false; - } while (false); -} - -bool -js::HasElement(JSContext *cx, ObjectImpl *obj, uint32_t index, bool *found) -{ - NEW_OBJECT_REPRESENTATION_ONLY(); - - do { - MOZ_ASSERT(obj); - - if (static_cast(obj)->isProxy()) { // XXX - MOZ_NOT_REACHED("NYI: proxy [[HasProperty]]"); - return false; - } - - PropDesc prop; - if (!GetOwnElement(cx, obj, index, &prop)) - return false; - - if (!prop.isUndefined()) { - *found = true; - return true; - } - - obj = obj->getProto(); - if (obj) - continue; - - *found = false; - return true; - } while (false); -} - bool js::DefineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded) @@ -647,144 +461,3 @@ js::DefineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc MOZ_NOT_REACHED("bad elements kind!"); return false; } - -bool -SparseElementsHeader::setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, - uint32_t index, const Value &v, bool *succeeded) -{ - MOZ_ASSERT(this == &obj->elementsHeader()); - - MOZ_NOT_REACHED("NYI"); - return false; -} - -bool -DenseElementsHeader::setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, - uint32_t index, const Value &v, bool *succeeded) -{ - MOZ_ASSERT(this == &obj->elementsHeader()); - - MOZ_NOT_REACHED("NYI"); - return false; -} - -template -bool -TypedElementsHeader::setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, - uint32_t index, const Value &v, bool *succeeded) -{ - MOZ_ASSERT(this == &obj->elementsHeader()); - - uint32_t len = length(); - if (index >= len) { - /* - * Silent ignore is better than an exception here, because at some - * point we may want to support other properties on these objects. - */ - *succeeded = true; - return true; - } - - /* Convert the value being set to the element type. */ - double d; - if (v.isNumber()) { - d = v.toNumber(); - } else if (v.isNull()) { - d = 0.0; - } else if (v.isPrimitive()) { - if (v.isString()) { - if (!ToNumber(cx, v, &d)) - return false; - } else if (v.isUndefined()) { - d = js_NaN; - } else { - d = double(v.toBoolean()); - } - } else { - // non-primitive assignments become NaN or 0 (for float/int arrays) - d = js_NaN; - } - - assign(index, d); - *succeeded = true; - return true; -} - -bool -ArrayBufferElementsHeader::setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, - uint32_t index, const Value &v, bool *succeeded) -{ - MOZ_ASSERT(this == &obj->elementsHeader()); - - JSObject *delegate = ArrayBufferDelegate(cx, obj); - if (!delegate) - return false; - return SetElement(cx, obj, receiver, index, v, succeeded); -} - -bool -js::SetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, - const Value &v, bool *succeeded) -{ - NEW_OBJECT_REPRESENTATION_ONLY(); - - do { - MOZ_ASSERT(obj); - - if (static_cast(obj)->isProxy()) { // XXX - MOZ_NOT_REACHED("NYI: proxy [[SetP]]"); - return false; - } - - PropDesc ownDesc; - if (!GetOwnElement(cx, obj, index, &ownDesc)) - return false; - - if (!ownDesc.isUndefined()) { - if (ownDesc.isDataDescriptor()) { - if (!ownDesc.writable()) { - *succeeded = false; - return true; - } - - if (receiver == obj) { - PropDesc updateDesc = PropDesc::valueOnly(v); - return DefineElement(cx, receiver, index, updateDesc, false, succeeded); - } - - PropDesc newDesc; - return DefineElement(cx, receiver, index, newDesc, false, succeeded); - } - - if (ownDesc.isAccessorDescriptor()) { - Value setter = ownDesc.setterValue(); - if (setter.isUndefined()) { - *succeeded = false; - return true; - } - - InvokeArgsGuard args; - if (!cx->stack.pushInvokeArgs(cx, 1, &args)) - return false; - - /* Push set, receiver, and v as the sole argument. */ - args.calleev() = setter; - args.thisv() = ObjectValue(*receiver); - args[0] = v; - - *succeeded = true; - return Invoke(cx, args); - } - - MOZ_NOT_REACHED("NYI: setting PropertyOp-based property"); - return false; - } - - obj = obj->getProto(); - if (obj) - continue; - - PropDesc newDesc(v, PropDesc::Writable, PropDesc::Enumerable, PropDesc::Configurable); - return DefineElement(cx, receiver, index, newDesc, false, succeeded); - } while (false); -} diff --git a/js/src/vm/ObjectImpl.h b/js/src/vm/ObjectImpl.h index c69f50f37cb..d29190b3897 100644 --- a/js/src/vm/ObjectImpl.h +++ b/js/src/vm/ObjectImpl.h @@ -16,7 +16,6 @@ #include "jsval.h" #include "gc/Barrier.h" -#include "vm/NumericConversions.h" namespace js { @@ -65,43 +64,12 @@ struct PropDesc { /* Or maybe this represents a property's absence, and it's undefined. */ bool isUndefined_ : 1; - PropDesc(const Value &v) - : pd_(UndefinedValue()), - value_(v), - get_(UndefinedValue()), set_(UndefinedValue()), - attrs(0), - hasGet_(false), hasSet_(false), - hasValue_(true), hasWritable_(false), hasEnumerable_(false), hasConfigurable_(false), - isUndefined_(false) - { - } - public: friend class AutoPropDescArrayRooter; friend void JS::AutoGCRooter::trace(JSTracer *trc); - enum Enumerability { Enumerable = true, NonEnumerable = false }; - enum Configurability { Configurable = true, NonConfigurable = false }; - enum Writability { Writable = true, NonWritable = false }; - PropDesc(); - static PropDesc undefined() { return PropDesc(); } - static PropDesc valueOnly(const Value &v) { return PropDesc(v); } - - PropDesc(const Value &v, Writability writable, - Enumerability enumerable, Configurability configurable) - : pd_(UndefinedValue()), - value_(v), - get_(UndefinedValue()), set_(UndefinedValue()), - attrs((writable ? 0 : JSPROP_READONLY) | - (enumerable ? JSPROP_ENUMERATE : 0) | - (configurable ? 0 : JSPROP_PERMANENT)), - hasGet_(false), hasSet_(false), - hasValue_(true), hasWritable_(true), hasEnumerable_(true), hasConfigurable_(true), - isUndefined_(false) - {} - /* * 8.10.5 ToPropertyDescriptor(Obj) * @@ -126,6 +94,8 @@ struct PropDesc { void initFromPropertyDescriptor(const PropertyDescriptor &desc); bool makeObject(JSContext *cx); + void setUndefined() { isUndefined_ = true; } + bool isUndefined() const { return isUndefined_; } bool hasGet() const { MOZ_ASSERT(!isUndefined()); return hasGet_; } @@ -237,16 +207,11 @@ class Int32ElementsHeader; class Uint8ClampedElementsHeader; class Float32ElementsHeader; class Float64ElementsHeader; -class Uint8ClampedElementsHeader; class ArrayBufferElementsHeader; enum ElementsKind { DenseElements, SparseElements, - - ArrayBufferElements, - - /* These typed element types must remain contiguous. */ Uint8Elements, Int8Elements, Uint16Elements, @@ -255,14 +220,15 @@ enum ElementsKind { Int32Elements, Uint8ClampedElements, Float32Elements, - Float64Elements + Float64Elements, + ArrayBufferElements }; class ElementsHeader { protected: uint32_t type; - uint32_t length; /* Array length, ArrayBuffer length, typed array length */ + uint32_t length; /* Array length, byte length of ArrayBuffer */ union { class { @@ -289,7 +255,6 @@ class ElementsHeader inline bool isDenseElements() const { return kind() == DenseElements; } inline bool isSparseElements() const { return kind() == SparseElements; } - inline bool isArrayBufferElements() const { return kind() == ArrayBufferElements; } inline bool isUint8Elements() const { return kind() == Uint8Elements; } inline bool isInt8Elements() const { return kind() == Int8Elements; } inline bool isUint16Elements() const { return kind() == Uint16Elements; } @@ -299,10 +264,10 @@ class ElementsHeader inline bool isUint8ClampedElements() const { return kind() == Uint8ClampedElements; } inline bool isFloat32Elements() const { return kind() == Float32Elements; } inline bool isFloat64Elements() const { return kind() == Float64Elements; } + inline bool isArrayBufferElements() const { return kind() == ArrayBufferElements; } inline DenseElementsHeader & asDenseElements(); inline SparseElementsHeader & asSparseElements(); - inline ArrayBufferElementsHeader & asArrayBufferElements(); inline Uint8ElementsHeader & asUint8Elements(); inline Int8ElementsHeader & asInt8Elements(); inline Uint16ElementsHeader & asUint16Elements(); @@ -312,6 +277,7 @@ class ElementsHeader inline Uint8ClampedElementsHeader & asUint8ClampedElements(); inline Float32ElementsHeader & asFloat32Elements(); inline Float64ElementsHeader & asFloat64Elements(); + inline ArrayBufferElementsHeader & asArrayBufferElements(); static ElementsHeader * fromElements(HeapSlot *elems) { return reinterpret_cast(uintptr_t(elems) - sizeof(ElementsHeader)); @@ -338,14 +304,9 @@ class DenseElementsHeader : public ElementsHeader return ElementsHeader::length; } - bool getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc); - bool defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); - bool setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, - const Value &v, bool *succeeded); - private: inline bool isDenseElements() const MOZ_DELETE; inline DenseElementsHeader & asDenseElements() MOZ_DELETE; @@ -367,14 +328,9 @@ class SparseElementsHeader : public ElementsHeader return ElementsHeader::length; } - bool getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc); - bool defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); - bool setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, - const Value &v, bool *succeeded); - private: inline bool isSparseElements() const MOZ_DELETE; inline SparseElementsHeader & asSparseElements() MOZ_DELETE; @@ -475,107 +431,19 @@ template<> inline const bool TypeIsUint8Clamped() { return true; template class TypedElementsHeader : public ElementsHeader { - T getElement(uint32_t index) { - MOZ_ASSERT(index < length()); - return reinterpret_cast(this + 1)[index]; - } - - inline void assign(uint32_t index, double d); - - void setElement(uint32_t index, T value) { - MOZ_ASSERT(index < length()); - reinterpret_cast(this + 1)[index] = value; - } - public: - uint32_t length() const { - MOZ_ASSERT(Uint8Elements <= kind()); - MOZ_ASSERT(kind() <= Float64Elements); + uint32_t byteLength() const { return ElementsHeader::length; } - bool getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc); - bool defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); - bool setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, - const Value &v, bool *succeeded); - private: TypedElementsHeader(const TypedElementsHeader &other) MOZ_DELETE; void operator=(const TypedElementsHeader &other) MOZ_DELETE; }; -template inline void -TypedElementsHeader::assign(uint32_t index, double d) -{ - MOZ_NOT_REACHED("didn't specialize for this element type"); -} - -template<> inline void -TypedElementsHeader::assign(uint32_t index, double d) -{ - double i = ToInteger(d); - uint8_t u = (i <= 0) - ? 0 - : (i >= 255) - ? 255 - : uint8_t(i); - setElement(index, uint8_clamped(u)); -} - -template<> inline void -TypedElementsHeader::assign(uint32_t index, double d) -{ - setElement(index, uint8_t(ToUint32(d))); -} - -template<> inline void -TypedElementsHeader::assign(uint32_t index, double d) -{ - /* FIXME: Casting out-of-range signed integers has undefined behavior! */ - setElement(index, int8_t(ToInt32(d))); -} - -template<> inline void -TypedElementsHeader::assign(uint32_t index, double d) -{ - setElement(index, uint16_t(ToUint32(d))); -} - -template<> inline void -TypedElementsHeader::assign(uint32_t index, double d) -{ - /* FIXME: Casting out-of-range signed integers has undefined behavior! */ - setElement(index, int16_t(ToInt32(d))); -} - -template<> inline void -TypedElementsHeader::assign(uint32_t index, double d) -{ - setElement(index, ToUint32(d)); -} - -template<> inline void -TypedElementsHeader::assign(uint32_t index, double d) -{ - /* FIXME: Casting out-of-range signed integers has undefined behavior! */ - setElement(index, int32_t(ToInt32(d))); -} - -template<> inline void -TypedElementsHeader::assign(uint32_t index, double d) -{ - setElement(index, float(d)); -} - -template<> inline void -TypedElementsHeader::assign(uint32_t index, double d) -{ - setElement(index, d); -} - class Uint8ElementsHeader : public TypedElementsHeader { private: @@ -653,14 +521,9 @@ class Uint8ClampedElementsHeader : public TypedElementsHeader class ArrayBufferElementsHeader : public ElementsHeader { public: - bool getOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc); - bool defineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); - bool setElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, - const Value &v, bool *succeeded); - private: inline bool isArrayBufferElements() const MOZ_DELETE; inline ArrayBufferElementsHeader & asArrayBufferElements() MOZ_DELETE; @@ -823,9 +686,6 @@ struct Shape; class NewObjectCache; -inline Value -ObjectValue(ObjectImpl &obj); - /* * ObjectImpl specifies the internal implementation of an object. (In contrast * JSObject specifies an "external" interface, at the conceptual level of that @@ -912,8 +772,6 @@ class ObjectImpl : public gc::Cell JSObject * asObjectPtr() { return reinterpret_cast(this); } - friend inline Value ObjectValue(ObjectImpl &obj); - /* These functions are public, and they should remain public. */ public: @@ -1224,33 +1082,10 @@ class ObjectImpl : public gc::Cell static size_t offsetOfSlots() { return offsetof(ObjectImpl, slots); } }; -inline Value -ObjectValue(ObjectImpl &obj) -{ - Value v; - v.setObject(*obj.asObjectPtr()); - return v; -} - -bool -GetOwnElement(JSContext *cx, ObjectImpl *obj, uint32_t index, PropDesc *desc); - -/* Proposed default [[GetP]](Receiver, P) method. */ -extern bool -GetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, Value *vp); - extern bool DefineElement(JSContext *cx, ObjectImpl *obj, uint32_t index, const PropDesc &desc, bool shouldThrow, bool *succeeded); -/* Proposed default [[SetP]](Receiver, P, V) method. */ -extern bool -SetElement(JSContext *cx, ObjectImpl *obj, ObjectImpl *receiver, uint32_t index, const Value &v, - bool *succeeded); - -extern bool -HasElement(JSContext *cx, ObjectImpl *obj, uint32_t index, bool *found); - } /* namespace js */ #endif /* ObjectImpl_h__ */ From 1a6131cad0a0884a39a9babe55daf8875788a43a Mon Sep 17 00:00:00 2001 From: Scott Downe Date: Tue, 24 Apr 2012 19:49:31 -0400 Subject: [PATCH 061/182] Bug 677122 - Update start/end times of mediafragment URL on hashchanges r=bz --HG-- extra : rebase_source : 91fa2211dbc4c9c839f22fcb086e0b3a1a0cfef6 --- content/html/document/src/VideoDocument.cpp | 24 +++++ content/html/document/test/Makefile.in | 1 + .../html/document/test/test_bug677122.html | 95 +++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 content/html/document/test/test_bug677122.html diff --git a/content/html/document/src/VideoDocument.cpp b/content/html/document/src/VideoDocument.cpp index 2016ec4ebae..6553a78fbae 100644 --- a/content/html/document/src/VideoDocument.cpp +++ b/content/html/document/src/VideoDocument.cpp @@ -63,6 +63,7 @@ protected: // Sets document to reflect the file name and description. void UpdateTitle(nsIChannel* aChannel); + void InsertMediaFragmentScript(); nsresult CreateSyntheticVideoDocument(nsIChannel* aChannel, nsIStreamListener** aListener); @@ -106,6 +107,29 @@ VideoDocument::SetScriptGlobalObject(nsIScriptGlobalObject* aScriptGlobalObject) LinkStylesheet(NS_LITERAL_STRING("resource://gre/res/TopLevelVideoDocument.css")); LinkStylesheet(NS_LITERAL_STRING("chrome://global/skin/TopLevelVideoDocument.css")); } + + if (aScriptGlobalObject) { + InsertMediaFragmentScript(); + } +} + +void +VideoDocument::InsertMediaFragmentScript() +{ + nsCOMPtr<nsINodeInfo> nodeInfo; + nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::script, nsnull, + kNameSpaceID_XHTML, + nsIDOMNode::ELEMENT_NODE); + if (!nodeInfo) + { + return; + } + + nsRefPtr<nsGenericHTMLElement> script = NS_NewHTMLScriptElement(nodeInfo.forget()); + script->SetTextContent(NS_LITERAL_STRING("window.addEventListener('hashchange',function(e){document.querySelector('audio,video').src=e.newURL;},false);")); + + Element* head = GetHeadElement(); + head->AppendChildTo(script, false); } nsresult diff --git a/content/html/document/test/Makefile.in b/content/html/document/test/Makefile.in index 23d6ae90ef6..c3c976e88e4 100644 --- a/content/html/document/test/Makefile.in +++ b/content/html/document/test/Makefile.in @@ -108,6 +108,7 @@ _TEST_FILES = test_bug1682.html \ test_bug677495-1.html \ test_bug742261.html \ test_bug741266.html \ + test_bug677122.html \ $(NULL) ifneq (mobile,$(MOZ_BUILD_APP)) diff --git a/content/html/document/test/test_bug677122.html b/content/html/document/test/test_bug677122.html new file mode 100644 index 00000000000..2c279d0258e --- /dev/null +++ b/content/html/document/test/test_bug677122.html @@ -0,0 +1,95 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>Media test: MediaDocument hashchange mediafragment. + + + + +
+
+
+ + + From c128b4bf71579863db7eb0da23f919655f5c7917 Mon Sep 17 00:00:00 2001 From: Oonishi Atsushi Date: Tue, 24 Apr 2012 19:49:58 -0400 Subject: [PATCH 062/182] Bug 673752 - Every error page fires onLocationChange twice. r=smaug --- docshell/base/nsDocShell.cpp | 35 ++++++++++++++++------- docshell/test/chrome/bug311007_window.xul | 8 ------ 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index 2beaaa6152c..b6de89b7c41 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -7459,18 +7459,34 @@ nsDocShell::CreateContentViewer(const char *aContentType, mLoadType = mFailedLoadType; nsCOMPtr failedChannel = mFailedChannel; - nsCOMPtr failedURI = mFailedURI; + + // Make sure we have a URI to set currentURI. + nsCOMPtr failedURI; + if (failedChannel) { + NS_GetFinalChannelURI(failedChannel, getter_AddRefs(failedURI)); + } + + if (!failedURI) { + failedURI = mFailedURI; + } + + // When we don't have failedURI, something wrong will happen. See + // bug 291876. + MOZ_ASSERT(failedURI, "We don't have a URI for history APIs."); + mFailedChannel = nsnull; mFailedURI = nsnull; - // Create an shistory entry for the old load, if we have a channel - if (failedChannel) { - mURIResultedInDocument = true; - OnLoadingSite(failedChannel, true, false); - } else if (failedURI) { - mURIResultedInDocument = true; - OnNewURI(failedURI, nsnull, nsnull, mLoadType, true, false, + // Create an shistory entry for the old load. + if (failedURI) { +#ifdef DEBUG + bool errorOnLocationChangeNeeded = +#endif + OnNewURI(failedURI, failedChannel, nsnull, mLoadType, true, false, false); + + MOZ_ASSERT(!errorOnLocationChangeNeeded, + "We have to fire onLocationChange again."); } // Be sure to have a correct mLSHE, it may have been cleared by @@ -7487,9 +7503,6 @@ nsDocShell::CreateContentViewer(const char *aContentType, mLSHE = do_QueryInterface(entry); } - // Set our current URI - SetCurrentURI(failedURI); - mLoadType = LOAD_ERROR_PAGE; } diff --git a/docshell/test/chrome/bug311007_window.xul b/docshell/test/chrome/bug311007_window.xul index 2db7a4bbc9e..fd2cb7af5f3 100644 --- a/docshell/test/chrome/bug311007_window.xul +++ b/docshell/test/chrome/bug311007_window.xul @@ -79,11 +79,6 @@ function step1A() { } function step1B(aWebProgress, aRequest, aLocation, aFlags) { - /* XXX Here we receive 2 notifications, due to bug 673752. */ - if (!aRequest) { - return; - } - is(aLocation.spec, kDNSErrorURI, "Error page's URI (1)"); ok(!(aFlags & Components.interfaces.nsIWebProgressListener @@ -161,9 +156,6 @@ function step4A() { } function step4B(aWebProgress, aRequest, aLocation, aFlags) { - if (!aRequest) // See step1B(...) and bug 673752. - return; - is(aLocation.spec, kDNSErrorURI, "Go back to the error URI (4)"); ok(!(aFlags & Components.interfaces.nsIWebProgressListener From 7e7843a3d2e1ea3adb9784753edd4a4f5eaf4577 Mon Sep 17 00:00:00 2001 From: Anant Narayanan Date: Tue, 24 Apr 2012 08:21:12 -0700 Subject: [PATCH 063/182] Bug 695515 - Remove last use of memmem. r=khuey --- configure.in | 2 +- xpcom/ds/nsCRT.cpp | 22 ---------------------- xpcom/ds/nsCRT.h | 6 ------ 3 files changed, 1 insertion(+), 29 deletions(-) diff --git a/configure.in b/configure.in index 8b336c7a086..10fb6071316 100644 --- a/configure.in +++ b/configure.in @@ -3347,7 +3347,7 @@ esac _SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -D_GNU_SOURCE" -AC_CHECK_FUNCS(dladdr memmem) +AC_CHECK_FUNC(dladdr) CFLAGS="$_SAVE_CFLAGS" if test ! "$GNU_CXX"; then diff --git a/xpcom/ds/nsCRT.cpp b/xpcom/ds/nsCRT.cpp index e60f1c0955f..03fcc7106cb 100644 --- a/xpcom/ds/nsCRT.cpp +++ b/xpcom/ds/nsCRT.cpp @@ -159,28 +159,6 @@ PRInt32 nsCRT::strncmp(const PRUnichar* s1, const PRUnichar* s2, PRUint32 n) { return 0; } -const char* nsCRT::memmem(const char* haystack, PRUint32 haystackLen, - const char* needle, PRUint32 needleLen) -{ - // Sanity checking - if (!(haystack && needle && haystackLen && needleLen && - needleLen <= haystackLen)) - return NULL; - -#ifdef HAVE_MEMMEM - return (const char*)::memmem(haystack, haystackLen, needle, needleLen); -#else - // No memmem means we need to roll our own. This isn't really optimized - // for performance ... if that becomes an issue we can take some inspiration - // from the js string compare code in jsstr.cpp - for (PRInt32 i = 0; i < haystackLen - needleLen; i++) { - if (!memcmp(haystack + i, needle, needleLen)) - return haystack + i; - } -#endif - return NULL; -} - PRUnichar* nsCRT::strdup(const PRUnichar* str) { PRUint32 len = nsCRT::strlen(str); diff --git a/xpcom/ds/nsCRT.h b/xpcom/ds/nsCRT.h index 34b5bdfca33..4c10067f078 100644 --- a/xpcom/ds/nsCRT.h +++ b/xpcom/ds/nsCRT.h @@ -210,12 +210,6 @@ public: static PRInt32 strncmp(const PRUnichar* s1, const PRUnichar* s2, PRUint32 aMaxLen); - // The GNU libc has memmem, which is strstr except for binary data - // This is our own implementation that uses memmem on platforms - // where it's available. - static const char* memmem(const char* haystack, PRUint32 haystackLen, - const char* needle, PRUint32 needleLen); - // You must use nsCRT::free(PRUnichar*) to free memory allocated // by nsCRT::strdup(PRUnichar*). static PRUnichar* strdup(const PRUnichar* str); From 9d261ccdca740c686486d1b77f640e183318b605 Mon Sep 17 00:00:00 2001 From: David Rajchenbach-Teller Date: Thu, 5 Apr 2012 15:06:25 +0200 Subject: [PATCH 064/182] Bug 720771 - Implement finalization for CData values. r=jorendorff --- js/src/ctypes/CTypes.cpp | 791 +++++++++++++++++++++++++++++++++++++-- js/src/ctypes/CTypes.h | 10 + 2 files changed, 770 insertions(+), 31 deletions(-) diff --git a/js/src/ctypes/CTypes.cpp b/js/src/ctypes/CTypes.cpp index 89d846e1453..6735d9c0a53 100644 --- a/js/src/ctypes/CTypes.cpp +++ b/js/src/ctypes/CTypes.cpp @@ -21,6 +21,7 @@ * * Contributor(s): * Dan Witte + * David Rajchenbach-Teller * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -64,6 +65,9 @@ #include #endif +#include "mozilla/StandardInteger.h" +#include "mozilla/Scoped.h" + using namespace std; namespace js { @@ -96,7 +100,7 @@ namespace CType { static JSBool HasInstance(JSContext* cx, JSObject* obj, const jsval* v, JSBool* bp); - /** + /* * Get the global "ctypes" object. * * |obj| must be a CType object. @@ -187,7 +191,8 @@ namespace CData { static JSBool Address(JSContext* cx, unsigned argc, jsval* vp); static JSBool ReadString(JSContext* cx, unsigned argc, jsval* vp); static JSBool ToSource(JSContext* cx, unsigned argc, jsval* vp); - + static JSString *GetSourceString(JSContext *cx, JSObject *typeObj, + void *data); static JSBool ErrnoGetter(JSContext* cx, JSObject *obj, jsid idval, jsval* vp); @@ -197,6 +202,116 @@ namespace CData { #endif // defined(XP_WIN) } +namespace CDataFinalizer { + /* + * Attach a C function as a finalizer to a JS object. + * + * This function is available from JS as |ctypes.withFinalizer|. + * + * JavaScript signature: + * function(CData, CData): CDataFinalizer + * value finalizer finalizable + * + * Where |finalizer| is a one-argument function taking a value + * with the same type as |value|. + */ + static JSBool Construct(JSContext* cx, unsigned argc, jsval *vp); + + /* + * Private data held by |CDataFinalizer|. + * + * See also |enum CDataFinalizerSlot| for the slots of + * |CDataFinalizer|. + * + * Note: the private data may be NULL, if |dispose|, |forget| or the + * finalizer has already been called. + */ + struct Private { + /* + * The C data to pass to the code. + * Finalization/|dispose|/|forget| release this memory. + */ + void *cargs; + + /* + * The total size of the buffer pointed by |cargs| + */ + size_t cargs_size; + + /* + * Low-level signature information. + * Finalization/|dispose|/|forget| release this memory. + */ + ffi_cif CIF; + + /* + * The C function to invoke during finalization. + * Do not deallocate this. + */ + uintptr_t code; + + /* + * A buffer for holding the return value. + * Finalization/|dispose|/|forget| release this memory. + */ + void *rvalue; + }; + + /* + * Methods of instances of |CDataFinalizer| + */ + namespace Methods { + static JSBool Dispose(JSContext* cx, unsigned argc, jsval *vp); + static JSBool Forget(JSContext* cx, unsigned argc, jsval *vp); + static JSBool ToSource(JSContext* cx, unsigned argc, jsval *vp); + static JSBool ToString(JSContext* cx, unsigned argc, jsval *vp); + } + + /* + * Utility functions + * + * @return true if |obj| is a CDataFinalizer, false otherwise. + */ + static bool IsCDataFinalizer(JSObject *obj); + + /* + * Clean up the finalization information of a CDataFinalizer. + * + * Used by |Finalize|, |Dispose| and |Forget|. + * + * @param p The private information of the CDataFinalizer. If NULL, + * this function does nothing. + * @param obj Either NULL, if the object should not be cleaned up (i.e. + * during finalization) or a CDataFinalizer JSObject. Always use NULL + * if you are calling from a finalizer. + */ + static void Cleanup(Private *p, JSObject *obj); + + /* + * Perform the actual call to the finalizer code. + */ + static void CallFinalizer(Private *p, JSObject *ctypes); + + /* + * Return the CType of a CDataFinalizer object, or NULL if the object + * has been cleaned-up already. + */ + static JSObject *GetCType(JSContext *cx, JSObject *obj); + + /* + * Perform finalization of a |CDataFinalizer| + */ + static void Finalize(JSFreeOp *fop, JSObject *obj); + + /* + * Return the jsval contained by this finalizer. + * + * Note that the jsval is actually not recorded, but converted back from C. + */ + static bool GetValue(JSContext *cx, JSObject *obj, jsval *result); + } + + // Int64Base provides functions common to Int64 and UInt64. namespace Int64Base { JSObject* Construct(JSContext* cx, JSObject* proto, uint64_t data, @@ -302,6 +417,30 @@ static JSClass sCClosureClass = { NULL, NULL, NULL, NULL, CClosure::Trace }; +/* + * Class representing the prototype of CDataFinalizer. + */ +static JSClass sCDataFinalizerProtoClass = { + "CDataFinalizer", + 0, + JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, + JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub +}; + +/* + * Class representing instances of CDataFinalizer. + * + * Instances of CDataFinalizer have both private data (with type + * |CDataFinalizer::Private|) and slots (see |CDataFinalizerSlots|). + */ +static JSClass sCDataFinalizerClass = { + "CDataFinalizer", + JSCLASS_HAS_PRIVATE | JSCLASS_HAS_RESERVED_SLOTS(CDATAFINALIZER_SLOTS), + JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, + JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, CDataFinalizer::Finalize, +}; + + #define CTYPESFN_FLAGS \ (JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT) @@ -314,6 +453,9 @@ static JSClass sCClosureClass = { #define CDATAFN_FLAGS \ (JSPROP_READONLY | JSPROP_PERMANENT) +#define CDATAFINALIZERFN_FLAGS \ + (JSPROP_READONLY | JSPROP_PERMANENT) + static JSPropertySpec sCTypeProps[] = { { "name", 0, CTYPESPROP_FLAGS, CType::NameGetter, NULL }, { "size", 0, CTYPESPROP_FLAGS, CType::SizeGetter, NULL }, @@ -343,6 +485,18 @@ static JSFunctionSpec sCDataFunctions[] = { JS_FS_END }; +static JSPropertySpec sCDataFinalizerProps[] = { + { 0, 0, 0, NULL, NULL } +}; + +static JSFunctionSpec sCDataFinalizerFunctions[] = { + JS_FN("dispose", CDataFinalizer::Methods::Dispose, 0, CDATAFINALIZERFN_FLAGS), + JS_FN("forget", CDataFinalizer::Methods::Forget, 0, CDATAFINALIZERFN_FLAGS), + JS_FN("toString", CDataFinalizer::Methods::ToString, 0, CDATAFINALIZERFN_FLAGS), + JS_FN("toSource", CDataFinalizer::Methods::ToSource, 0, CDATAFINALIZERFN_FLAGS), + JS_FS_END +}; + static JSFunctionSpec sPointerFunction = JS_FN("PointerType", PointerType::Create, 1, CTYPESCTOR_FLAGS); @@ -486,6 +640,7 @@ static JSPropertySpec sModuleProps[] = { }; static JSFunctionSpec sModuleFunctions[] = { + JS_FN("CDataFinalizer", CDataFinalizer::Construct, 2, CTYPESFN_FLAGS), JS_FN("open", Library::Open, 1, CTYPESFN_FLAGS), JS_FN("cast", CData::Cast, 2, CTYPESFN_FLAGS), JS_FN("getRuntime", CData::GetRuntime, 1, CTYPESFN_FLAGS), @@ -499,9 +654,16 @@ NewUCString(JSContext* cx, const AutoString& from) return JS_NewUCStringCopyN(cx, from.begin(), from.length()); } +/* + * Return a size rounded up to a multiple of a power of two. + * + * Note: |align| must be a power of 2. + */ JS_ALWAYS_INLINE size_t Align(size_t val, size_t align) { + // Ensure that align is a power of two. + MOZ_ASSERT(align != 0 && (align & (align - 1)) == 0); return ((val - 1) | (align - 1)) + 1; } @@ -963,6 +1125,26 @@ GetCallbacks(JSObject* obj) return static_cast(JSVAL_TO_PRIVATE(result)); } +// Utility function to access a property of an object as an object +// returns false and sets the error if the property does not exist +// or is not an object +bool GetObjectProperty(JSContext *cx, JSObject *obj, + const char *property, JSObject **result) +{ + jsval val; + if (!JS_GetProperty(cx, obj, property, &val)) { + return false; + } + + if (JSVAL_IS_PRIMITIVE(val)) { + JS_ReportError(cx, "missing or non-object field"); + return false; + } + + *result = JSVAL_TO_OBJECT(val); + return true; +} + JS_BEGIN_EXTERN_C JS_PUBLIC_API(JSBool) @@ -986,6 +1168,30 @@ JS_InitCTypesClass(JSContext* cx, JSObject* global) !JS_DefineProperties(cx, ctypes, sModuleProps)) return false; + // Set up ctypes.CDataFinalizer.prototype. + JSObject* ctor; + if (!GetObjectProperty(cx, ctypes, "CDataFinalizer", &ctor)) { + return NULL; + } + + JSObject* prototype = JS_NewObject(cx, &sCDataFinalizerProtoClass, + NULL, ctypes); + if (!prototype) + return NULL; + + if (!JS_DefineProperties(cx, prototype, sCDataFinalizerProps) || + !JS_DefineFunctions(cx, prototype, sCDataFinalizerFunctions)) + return NULL; + + if (!JS_DefineProperty(cx, ctor, "prototype", OBJECT_TO_JSVAL(prototype), + NULL, NULL, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT)) + return NULL; + + if (!JS_DefineProperty(cx, prototype, "constructor", OBJECT_TO_JSVAL(ctor), + NULL, NULL, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT)) + return NULL; + + // Seal the ctypes object, to prevent modification. return JS_FreezeObject(cx, ctypes); } @@ -1267,7 +1473,15 @@ jsvalToInteger(JSContext* cx, jsval val, IntegerType* result) return ConvertExact(i, result); } - return false; + if (CDataFinalizer::IsCDataFinalizer(obj)) { + jsval innerData; + if (!CDataFinalizer::GetValue(cx, obj, &innerData)) { + return false; // Nothing to convert + } + return jsvalToInteger(cx, innerData, result); + } + + return false; } if (JSVAL_IS_BOOLEAN(val)) { // Implicitly promote boolean values to 0 or 1, like C. @@ -1438,6 +1652,15 @@ jsvalToBigInteger(JSContext* cx, int64_t i = Int64Base::GetInt(obj); return ConvertExact(i, result); } + + if (CDataFinalizer::IsCDataFinalizer(obj)) { + jsval innerData; + if (!CDataFinalizer::GetValue(cx, obj, &innerData)) { + return false; // Nothing to convert + } + return jsvalToBigInteger(cx, innerData, allowString, result); + } + } return false; } @@ -1778,20 +2001,40 @@ ImplicitConvert(JSContext* cx, { JS_ASSERT(CType::IsSizeDefined(targetType)); - // First, check if val is a CData object of type targetType. + // First, check if val is either a CData object or a CDataFinalizer + // of type targetType. JSObject* sourceData = NULL; JSObject* sourceType = NULL; - if (!JSVAL_IS_PRIMITIVE(val) && - CData::IsCData(JSVAL_TO_OBJECT(val))) { - sourceData = JSVAL_TO_OBJECT(val); - sourceType = CData::GetCType(sourceData); + if (!JSVAL_IS_PRIMITIVE(val)) { + if (CData::IsCData(JSVAL_TO_OBJECT(val))) { + sourceData = JSVAL_TO_OBJECT(val); + sourceType = CData::GetCType(sourceData); - // If the types are equal, copy the buffer contained within the CData. - // (Note that the buffers may overlap partially or completely.) - if (CType::TypesEqual(sourceType, targetType)) { - size_t size = CType::GetSize(sourceType); - memmove(buffer, CData::GetData(sourceData), size); - return true; + // If the types are equal, copy the buffer contained within the CData. + // (Note that the buffers may overlap partially or completely.) + if (CType::TypesEqual(sourceType, targetType)) { + size_t size = CType::GetSize(sourceType); + memmove(buffer, CData::GetData(sourceData), size); + return true; + } + } else if (CDataFinalizer::IsCDataFinalizer(JSVAL_TO_OBJECT(val))) { + sourceData = JSVAL_TO_OBJECT(val); + sourceType = CDataFinalizer::GetCType(cx, sourceData); + + CDataFinalizer::Private *p = (CDataFinalizer::Private *) + JS_GetPrivate(sourceData); + + if (!p) { + // We have called |dispose| or |forget| already. + JS_ReportError(cx, "Attempting to convert an empty CDataFinalizer"); + return JS_FALSE; + } + + // If the types are equal, copy the buffer contained within the CData. + if (CType::TypesEqual(sourceType, targetType)) { + memmove(buffer, p->cargs, p->cargs_size); + return true; + } } } @@ -6020,6 +6263,26 @@ CData::ReadString(JSContext* cx, unsigned argc, jsval* vp) return JS_TRUE; } +JSString * +CData::GetSourceString(JSContext *cx, JSObject *typeObj, void *data) +{ + // Walk the types, building up the toSource() string. + // First, we build up the type expression: + // 't.ptr' for pointers; + // 't.array([n])' for arrays; + // 'n' for structs, where n = t.name, the struct's name. (We assume this is + // bound to a variable in the current scope.) + AutoString source; + BuildTypeSource(cx, typeObj, true, source); + AppendString(source, "("); + if (!BuildDataSource(cx, typeObj, data, false, source)) + return NULL; + + AppendString(source, ")"); + + return NewUCString(cx, source); +} + JSBool CData::ToSource(JSContext* cx, unsigned argc, jsval* vp) { @@ -6040,24 +6303,11 @@ CData::ToSource(JSContext* cx, unsigned argc, jsval* vp) JSObject* typeObj = CData::GetCType(obj); void* data = CData::GetData(obj); - // Walk the types, building up the toSource() string. - // First, we build up the type expression: - // 't.ptr' for pointers; - // 't.array([n])' for arrays; - // 'n' for structs, where n = t.name, the struct's name. (We assume this is - // bound to a variable in the current scope.) - AutoString source; - BuildTypeSource(cx, typeObj, true, source); - AppendString(source, "("); - if (!BuildDataSource(cx, typeObj, data, false, source)) - return JS_FALSE; - - AppendString(source, ")"); - - result = NewUCString(cx, source); - } - else + result = CData::GetSourceString(cx, typeObj, data); + } else { result = JS_NewStringCopyZ(cx, "[CData proto object]"); + } + if (!result) return JS_FALSE; @@ -6092,6 +6342,485 @@ CData::LastErrorGetter(JSContext* cx, JSObject* obj, jsid, jsval* vp) } #endif // defined(XP_WIN) +JSBool +CDataFinalizer::Methods::ToSource(JSContext *cx, unsigned argc, jsval *vp) +{ + JSObject* objThis = JS_THIS_OBJECT(cx, vp); + if (!objThis || !CDataFinalizer::IsCDataFinalizer(objThis)) { + JS_ReportError(cx, "not a CDataFinalizer"); + return JS_FALSE; + } + + CDataFinalizer::Private *p = (CDataFinalizer::Private *) + JS_GetPrivate(objThis); + + JSString *strMessage; + if (!p) { + strMessage = JS_NewStringCopyZ(cx, "ctypes.CDataFinalizer()"); + } else { + JSObject *objType = CDataFinalizer::GetCType(cx, objThis); + if (!objType) { + JS_ReportError(cx, "CDataFinalizer has no type"); + return JS_FALSE; + } + + AutoString source; + AppendString(source, "ctypes.CDataFinalizer("); + JSString *srcValue = CData::GetSourceString(cx, objType, p->cargs); + if (!srcValue) { + return JS_FALSE; + } + AppendString(source, srcValue); + AppendString(source, ", "); + jsval valCodePtrType = JS_GetReservedSlot(objThis, + SLOT_DATAFINALIZER_CODETYPE); + if (JSVAL_IS_PRIMITIVE(valCodePtrType)) { + return JS_FALSE; + } + + JSString *srcDispose = + CData::GetSourceString(cx, JSVAL_TO_OBJECT(valCodePtrType), + &(p->code)); + if (!srcDispose) { + return JS_FALSE; + } + + AppendString(source, srcDispose); + AppendString(source, ")"); + strMessage = NewUCString(cx, source); + } + + if (!strMessage) { + // This is a memory issue, no error message + return JS_FALSE; + } + + JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(strMessage)); + return JS_TRUE; +} + +JSBool +CDataFinalizer::Methods::ToString(JSContext *cx, unsigned argc, jsval *vp) +{ + JSObject* objThis = JS_THIS_OBJECT(cx, vp); + if (!objThis || !CDataFinalizer::IsCDataFinalizer(objThis)) { + JS_ReportError(cx, "not a CDataFinalizer"); + return JS_FALSE; + } + + JSString *strMessage; + jsval value; + if (!JS_GetPrivate(objThis)) { + // Pre-check whether CDataFinalizer::GetValue can fail + // to avoid reporting an error when not appropriate. + strMessage = JS_NewStringCopyZ(cx, "[CDataFinalizer - empty]"); + if (!strMessage) { + return JS_FALSE; + } + } else if (!CDataFinalizer::GetValue(cx, objThis, &value)) { + JS_NOT_REACHED("Could not convert an empty CDataFinalizer"); + } else { + strMessage = JS_ValueToString(cx, value); + if (!strMessage) { + return JS_FALSE; + } + } + JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(strMessage)); + return JS_TRUE; +} + +bool +CDataFinalizer::IsCDataFinalizer(JSObject *obj) +{ + return JS_GetClass(obj) == &sCDataFinalizerClass; +} + + +JSObject * +CDataFinalizer::GetCType(JSContext *cx, JSObject *obj) +{ + MOZ_ASSERT(IsCDataFinalizer(obj)); + + jsval valData = JS_GetReservedSlot(obj, + SLOT_DATAFINALIZER_VALTYPE); + if (JSVAL_IS_VOID(valData)) { + return NULL; + } + + return JSVAL_TO_OBJECT(valData); +} + +bool +CDataFinalizer::GetValue(JSContext *cx, JSObject *obj, jsval *aResult) +{ + MOZ_ASSERT(IsCDataFinalizer(obj)); + + CDataFinalizer::Private *p = (CDataFinalizer::Private *) + JS_GetPrivate(obj); + + if (!p) { + JS_ReportError(cx, "Attempting to get the value of an empty CDataFinalizer"); + return false; // We have called |dispose| or |forget| already. + } + + return ConvertToJS(cx, GetCType(cx, obj), + /*parent*/NULL, p -> cargs, false, true, aResult); +} + +/* + * Attach a C function as a finalizer to a JS object. + * + * Pseudo-JS signature: + * function(CData, CData U>): CDataFinalizer + * value, finalizer + * + * This function attaches strong references to the following values: + * - the CType of |value| + * + * Note: This function takes advantage of the fact that non-variadic + * CData functions are initialized during creation. + */ +JSBool +CDataFinalizer::Construct(JSContext* cx, unsigned argc, jsval *vp) +{ + JSObject* objSelf = JSVAL_TO_OBJECT(JS_CALLEE(cx, vp)); + JSObject *objProto; + if (!GetObjectProperty(cx, objSelf, "prototype", &objProto)) { + JS_ReportError(cx, "CDataFinalizer.prototype does not exist"); + return JS_FALSE; + } + + // Get arguments + if (argc == 0) { // Special case: the empty (already finalized) object + JSObject *objResult = JS_NewObject(cx, &sCDataFinalizerClass, objProto, NULL); + JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(objResult)); + return JS_TRUE; + } + + if (argc != 2) { + JS_ReportError(cx, "CDataFinalizer takes 2 arguments"); + return JS_FALSE; + } + + jsval* argv = JS_ARGV(cx, vp); + jsval valCodePtr = argv[1]; + if (!JSVAL_IS_OBJECT(valCodePtr) || JSVAL_IS_NULL(valCodePtr)) { + return TypeError(cx, "_a CData object_ of a function pointer type", + valCodePtr); + } + JSObject *objCodePtr = JSVAL_TO_OBJECT(valCodePtr); + + //Note: Using a custom argument formatter here would be awkward (requires + //a destructor just to uninstall the formatter). + + // 2. Extract argument type of |objCodePtr| + if (!CData::IsCData(objCodePtr)) { + return TypeError(cx, "a _CData_ object of a function pointer type", + valCodePtr); + } + JSObject *objCodePtrType = CData::GetCType(objCodePtr); + MOZ_ASSERT(objCodePtrType); + + TypeCode typCodePtr = CType::GetTypeCode(objCodePtrType); + if (typCodePtr != TYPE_pointer) { + return TypeError(cx, "a CData object of a function _pointer_ type", + OBJECT_TO_JSVAL(objCodePtrType)); + } + + JSObject *objCodeType = PointerType::GetBaseType(objCodePtrType); + MOZ_ASSERT(objCodeType); + + TypeCode typCode = CType::GetTypeCode(objCodeType); + if (typCode != TYPE_function) { + return TypeError(cx, "a CData object of a _function_ pointer type", + OBJECT_TO_JSVAL(objCodePtrType)); + } + uintptr_t code = *reinterpret_cast(CData::GetData(objCodePtr)); + if (!code) { + return TypeError(cx, "a CData object of a _non-NULL_ function pointer type", + OBJECT_TO_JSVAL(objCodePtrType)); + } + + FunctionInfo* funInfoFinalizer = + FunctionType::GetFunctionInfo(objCodeType); + MOZ_ASSERT(funInfoFinalizer); + + if ((funInfoFinalizer->mArgTypes.length() != 1) + || (funInfoFinalizer->mIsVariadic)) { + return TypeError(cx, "a function accepting exactly one argument", + OBJECT_TO_JSVAL(objCodeType)); + } + JSObject *objArgType = funInfoFinalizer->mArgTypes[0]; + + // Invariant: At this stage, we know that funInfoFinalizer->mIsVariadic + // is |false|. Therefore, funInfoFinalizer->mCIF has already been initialized. + + bool freePointer = false; + + // 3. Perform dynamic cast of |argv[0]| into |objType|, store it in |cargs| + + size_t sizeArg; + jsval valData = argv[0]; + if (!CType::GetSafeSize(objArgType, &sizeArg)) { + return TypeError(cx, "(an object with known size)", valData); + } + + ScopedFreePtr cargs(malloc(sizeArg)); + + if (!ImplicitConvert(cx, valData, objArgType, cargs.get(), + false, &freePointer)) { + return TypeError(cx, "(an object that can be converted to the following type)", + OBJECT_TO_JSVAL(objArgType)); + } + if (freePointer) { + // Note: We could handle that case, if necessary. + JS_ReportError(cx, "Internal Error during CDataFinalizer. Object cannot be represented"); + return JS_FALSE; + } + + // 4. Prepare buffer for holding return value + + JSObject *returnType = funInfoFinalizer->mReturnType; + ScopedFreePtr rvalue; + if (CType::GetTypeCode(returnType) != TYPE_void_t) { + rvalue = malloc(Align(CType::GetSize(returnType), + sizeof(ffi_arg))); + } //Otherwise, simply do not allocate + + // 5. Create |objResult| + + JSObject *objResult = JS_NewObject(cx, &sCDataFinalizerClass, objProto, NULL); + if (!objResult) { + return JS_FALSE; + } + + // Used by GetCType + JS_SetReservedSlot(objResult, + SLOT_DATAFINALIZER_VALTYPE, + OBJECT_TO_JSVAL(objArgType)); + + // Used by ToSource + JS_SetReservedSlot(objResult, + SLOT_DATAFINALIZER_CODETYPE, + OBJECT_TO_JSVAL(objCodePtrType)); + + ffi_abi abi; + if (!GetABI(cx, OBJECT_TO_JSVAL(funInfoFinalizer->mABI), &abi)) { + JS_ReportError(cx, "Internal Error: " + "Invalid ABI specification in CDataFinalizer"); + return false; + } + + ffi_type* rtype = CType::GetFFIType(cx, funInfoFinalizer->mReturnType); + if (!rtype) { + JS_ReportError(cx, "Internal Error: " + "Could not access ffi type of CDataFinalizer"); + return JS_FALSE; + } + + // 7. Store C information as private + ScopedFreePtr + p((CDataFinalizer::Private*)malloc(sizeof(CDataFinalizer::Private))); + + memmove(&p->CIF, &funInfoFinalizer->mCIF, sizeof(ffi_cif)); + + p->cargs = cargs.forget(); + p->rvalue = rvalue.forget(); + p->cargs_size = sizeArg; + p->code = code; + + + JS_SetPrivate(objResult, p.forget()); + JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(objResult)); + return JS_TRUE; +} + + +/* + * Actually call the finalizer. Does not perform any cleanup on the object. + * + * Preconditions: |this| must be a |CDataFinalizer|, |p| must be non-null. + * The function fails if |this| has gone through |Forget|/|Dispose| + * or |Finalize|. + * + * In contexts that should update errno/winLastError, callers should provide + * argument |ctypes|, which must point to global object ctypes. In other cases, + * this argument should be NULL. + */ +void +CDataFinalizer::CallFinalizer(CDataFinalizer::Private *p, JSObject *ctypes) +{ + int savedErrno = errno; + errno = 0; +#if defined(XP_WIN) + int32_t savedLastError = GetLastError(); + SetLastError(0); +#endif // defined(XP_WIN) + + ffi_call(&p->CIF, FFI_FN(p->code), p->rvalue, &p->cargs); + + int errnoStatus = errno; + errno = savedErrno; +#if defined(XP_WIN) + int32_t lastErrorStatus = GetLastError(); + SetLastError(savedLastError); +#endif // defined(XP_WIN) + + if (!ctypes) { + return; + } + + JS_SetReservedSlot(ctypes, SLOT_ERRNO, INT_TO_JSVAL(errnoStatus)); +#if defined(XP_WIN) + JS_SetReservedSlot(ctypes, SLOT_LASTERROR, INT_TO_JSVAL(lastErrorStatus)); +#endif // defined(XP_WIN) +} + +/* + * Forget the value. + * + * Preconditions: |this| must be a |CDataFinalizer|. + * The function fails if |this| has gone through |Forget|/|Dispose| + * or |Finalize|. + * + * Does not call the finalizer. Cleans up the Private memory and releases all + * strong references. + */ +JSBool +CDataFinalizer::Methods::Forget(JSContext* cx, unsigned argc, jsval *vp) +{ + if (argc != 0) { + JS_ReportError(cx, "CDataFinalizer.prototype.forget takes no arguments"); + return JS_FALSE; + } + + JSObject *obj = JS_THIS_OBJECT(cx, vp); + if (!obj || !CDataFinalizer::IsCDataFinalizer(obj)) { + return TypeError(cx, "a CDataFinalizer", OBJECT_TO_JSVAL(obj)); + } + + CDataFinalizer::Private *p = (CDataFinalizer::Private *) + JS_GetPrivate(obj); + + if (!p) { + JS_ReportError(cx, "forget called on an empty CDataFinalizer"); + return JS_FALSE; + } + + jsval valJSData; + if (!ConvertToJS(cx, GetCType(cx, obj), NULL, p->cargs, false, true, &valJSData)) { + JS_ReportError(cx, "CDataFinalizer value cannot be represented"); + return JS_FALSE; + } + + CDataFinalizer::Cleanup(p, obj); + + JS_SET_RVAL(cx, vp, valJSData); + return JS_TRUE; +} + +/* + * Clean up the value. + * + * Preconditions: |this| must be a |CDataFinalizer|. + * The function fails if |this| has gone through |Forget|/|Dispose| + * or |Finalize|. + * + * Calls the finalizer, cleans up the Private memory and releases all + * strong references. + */ +JSBool +CDataFinalizer::Methods::Dispose(JSContext* cx, unsigned argc, jsval *vp) +{ + if (argc != 0) { + JS_ReportError(cx, "CDataFinalizer.prototype.dispose takes no arguments"); + return JS_FALSE; + } + + JSObject *obj = JS_THIS_OBJECT(cx, vp); + if (!obj || !CDataFinalizer::IsCDataFinalizer(obj)) { + return TypeError(cx, "a CDataFinalizer", OBJECT_TO_JSVAL(obj)); + } + + CDataFinalizer::Private *p = (CDataFinalizer::Private *) + JS_GetPrivate(obj); + + if (!p) { + JS_ReportError(cx, "dispose called on an empty CDataFinalizer."); + return JS_FALSE; + } + + jsval valType = JS_GetReservedSlot(obj, SLOT_DATAFINALIZER_VALTYPE); + JS_ASSERT(!JSVAL_IS_PRIMITIVE(valType)); + + JSObject *objCTypes = CType::GetGlobalCTypes(cx, JSVAL_TO_OBJECT(valType)); + + CDataFinalizer::CallFinalizer(p, objCTypes); + CDataFinalizer::Cleanup(p, obj); + + JS_SET_RVAL(cx, vp, JSVAL_VOID); + return JS_TRUE; +} + +/* + * Perform finalization. + * + * Preconditions: |this| must be the result of |CDataFinalizer|. + * It may have gone through |Forget|/|Dispose|. + * + * If |this| has not gone through |Forget|/|Dispose|, calls the + * finalizer, cleans up the Private memory and releases all + * strong references. + */ +void +CDataFinalizer::Finalize(JSFreeOp* fop, JSObject* obj) +{ + CDataFinalizer::Private *p = (CDataFinalizer::Private *) + JS_GetPrivate(obj); + + if (!p) { + return; + } + + CDataFinalizer::CallFinalizer(p, NULL); + CDataFinalizer::Cleanup(p, NULL); +} + +/* + * Perform cleanup of a CDataFinalizer + * + * Release strong references, cleanup |Private|. + * + * Argument |p| contains the private information of the CDataFinalizer. If NULL, + * this function does nothing. + * Argument |obj| should contain |NULL| during finalization (or in any context + * in which the object itself should not be cleaned up), or a CDataFinalizer + * object otherwise. + */ +void +CDataFinalizer::Cleanup(CDataFinalizer::Private *p, JSObject *obj) +{ + if (!p) { + return; // We have already cleaned up + } + + free(p->cargs); + free(p->rvalue); + free(p); + + if (!obj) { + return; // No slots to clean up + } + + JS_ASSERT(CDataFinalizer::IsCDataFinalizer(obj)); + + JS_SetPrivate(obj, NULL); + for (int i = 0; i < CDATAFINALIZER_SLOTS; ++i) { + JS_SetReservedSlot(obj, i, JSVAL_NULL); + } +} + + /******************************************************************************* ** Int64 and UInt64 implementation *******************************************************************************/ diff --git a/js/src/ctypes/CTypes.h b/js/src/ctypes/CTypes.h index f8d23fefd7f..3a7074f352f 100644 --- a/js/src/ctypes/CTypes.h +++ b/js/src/ctypes/CTypes.h @@ -430,6 +430,16 @@ enum CClosureSlot { CCLOSURE_SLOTS }; +enum CDataFinalizerSlot { + // The type of the value (a CType JSObject). + // We hold it to permit ImplicitConvert and ToSource. + SLOT_DATAFINALIZER_VALTYPE = 0, + // The type of the function used at finalization (a CType JSObject). + // We hold it to permit |ToSource|. + SLOT_DATAFINALIZER_CODETYPE = 1, + CDATAFINALIZER_SLOTS +}; + enum TypeCtorSlot { SLOT_FN_CTORPROTO = 0 // ctypes.{Pointer,Array,Struct}Type.prototype // JSFunction objects always get exactly two slots. From 70a8930e77f1fd99a984fb8c7110c9f9efec0fd4 Mon Sep 17 00:00:00 2001 From: David Rajchenbach-Teller Date: Mon, 16 Apr 2012 21:25:35 +0200 Subject: [PATCH 065/182] Bug 720771 - Companion testsuite. r=jorendorff --- toolkit/components/ctypes/tests/Makefile.in | 1 + .../ctypes/tests/jsctypes-test-finalizer.cpp | 293 ++++++++++++++ .../ctypes/tests/jsctypes-test-finalizer.h | 52 +++ .../components/ctypes/tests/jsctypes-test.cpp | 8 +- .../components/ctypes/tests/jsctypes-test.h | 1 + toolkit/components/ctypes/tests/unit/head.js | 46 ++- .../ctypes/tests/unit/test_finalizer.js | 383 ++++++++++++++++++ .../tests/unit/test_finalizer_shouldaccept.js | 122 ++++++ .../tests/unit/test_finalizer_shouldfail.js | 156 +++++++ .../components/ctypes/tests/unit/xpcshell.ini | 4 + 10 files changed, 1064 insertions(+), 2 deletions(-) create mode 100644 toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp create mode 100644 toolkit/components/ctypes/tests/jsctypes-test-finalizer.h create mode 100644 toolkit/components/ctypes/tests/unit/test_finalizer.js create mode 100644 toolkit/components/ctypes/tests/unit/test_finalizer_shouldaccept.js create mode 100644 toolkit/components/ctypes/tests/unit/test_finalizer_shouldfail.js diff --git a/toolkit/components/ctypes/tests/Makefile.in b/toolkit/components/ctypes/tests/Makefile.in index 66c0f148eb9..fff2dc6cc8c 100644 --- a/toolkit/components/ctypes/tests/Makefile.in +++ b/toolkit/components/ctypes/tests/Makefile.in @@ -53,6 +53,7 @@ NO_DIST_INSTALL = 1 CPPSRCS = jsctypes-test.cpp \ jsctypes-test-errno.cpp \ + jsctypes-test-finalizer.cpp \ $(NULL) LOCAL_INCLUDES = \ diff --git a/toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp b/toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp new file mode 100644 index 00000000000..8d128c3b0dc --- /dev/null +++ b/toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp @@ -0,0 +1,293 @@ +#include "errno.h" + +#include "jsctypes-test.h" +#include "jsctypes-test-finalizer.h" +#include "jsapi.h" + +#if defined(XP_WIN) +#define snprintf _snprintf +#endif // defined(XP_WIN) + +/** + * Shared infrastructure + */ + + +/** + * An array of integers representing resources. + * - 0: unacquired + * - 1: acquired + * - < 0: error, resource has been released several times. + */ +int *gFinalizerTestResources = NULL; +char **gFinalizerTestNames = NULL; +size_t gFinalizerTestSize; + +void +test_finalizer_start(size_t size) +{ + gFinalizerTestResources = new int[size]; + gFinalizerTestNames = new char*[size]; + gFinalizerTestSize = size; + for (size_t i = 0; i < size; ++i) { + gFinalizerTestResources[i] = 0; + gFinalizerTestNames[i] = NULL; + } +} + +void +test_finalizer_stop() +{ + delete[] gFinalizerTestResources; +} + +/** + * Check if an acquired resource has been released + */ +bool +test_finalizer_resource_is_acquired(size_t i) +{ + return gFinalizerTestResources[i] == 1; +} +// Resource type: size_t + +// Acquire resource i +size_t +test_finalizer_acq_size_t(size_t i) +{ + gFinalizerTestResources[i] = 1; + return i; +} + +// Release resource i +void +test_finalizer_rel_size_t(size_t i) +{ + if (--gFinalizerTestResources[i] < 0) { + MOZ_NOT_REACHED("Assertion failed"); + } +} + +size_t +test_finalizer_rel_size_t_return_size_t(size_t i) +{ + if (-- gFinalizerTestResources[i] < 0) { + MOZ_NOT_REACHED("Assertion failed"); + } + return i; +} + + +bool +test_finalizer_cmp_size_t(size_t a, size_t b) +{ + return a==b; +} + +// Resource type: int32_t + +// Acquire resource i +int32_t +test_finalizer_acq_int32_t(size_t i) +{ + gFinalizerTestResources[i] = 1; + return i; +} + +// Release resource i +void +test_finalizer_rel_int32_t(int32_t i) +{ + if (--gFinalizerTestResources[i] < 0) { + MOZ_NOT_REACHED("Assertion failed"); + } +} + +bool +test_finalizer_cmp_int32_t(int32_t a, int32_t b) +{ + return a==b; +} + +// Resource type: int64_t + +// Acquire resource i +int64_t +test_finalizer_acq_int64_t(size_t i) +{ + gFinalizerTestResources[i] = 1; + return i; +} + +// Release resource i +void +test_finalizer_rel_int64_t(int64_t i) +{ + if (-- gFinalizerTestResources[i] < 0) { + MOZ_NOT_REACHED("Assertion failed"); + } +} + +bool +test_finalizer_cmp_int64_t(int64_t a, int64_t b) +{ + return a==b; +} + +// Resource type: void* + +// Acquire resource i +void* +test_finalizer_acq_ptr_t(size_t i) +{ + gFinalizerTestResources[i] = 1; + return (void*)&gFinalizerTestResources[i]; +} + +// Release resource i +void +test_finalizer_rel_ptr_t(void *i) +{ + int *as_int = (int*)i; + -- (*as_int); + if (*as_int < 0) { + MOZ_NOT_REACHED("Assertion failed"); + } +} + +bool +test_finalizer_cmp_ptr_t(void *a, void *b) +{ + return a==b; +} + +// Resource type: NULL + +// Acquire resource i +void* +test_finalizer_acq_null_t(size_t i) +{ + gFinalizerTestResources[0] = 1;//Always index 0 + return NULL; +} + +// Release resource i +void +test_finalizer_rel_null_t(void *i) +{ + if (i != NULL) { + MOZ_NOT_REACHED("Assertion failed"); + } + gFinalizerTestResources[0] --; +} + +bool +test_finalizer_null_resource_is_acquired(size_t) +{ + return gFinalizerTestResources[0] == 1; +} + +bool +test_finalizer_cmp_null_t(void *a, void *b) +{ + return a==b; +} + +// Resource type: char* + +// Acquire resource i +char* +test_finalizer_acq_string_t(int i) +{ + gFinalizerTestResources[i] = 1; + if (!gFinalizerTestNames[i]) { + char* buf = new char[10]; + snprintf(buf, 10, "%d", i); + gFinalizerTestNames[i] = buf; + return buf; + } + return gFinalizerTestNames[i]; +} + +// Release resource i +void +test_finalizer_rel_string_t(char *i) +{ + int index = atoi(i); + if (index < 0 || index >= (int)gFinalizerTestSize) { + MOZ_NOT_REACHED("Assertion failed"); + } + gFinalizerTestResources[index] --; +} + +bool +test_finalizer_string_resource_is_acquired(size_t i) +{ + return gFinalizerTestResources[i] == 1; +} + +bool +test_finalizer_cmp_string_t(char *a, char *b) +{ + return !strncmp(a, b, 10); +} + +// Resource type: RECT + +// Acquire resource i +RECT +test_finalizer_acq_struct_t(int i) +{ + gFinalizerTestResources[i] = 1; + RECT result = { i, i, i, i }; + return result; +} + +// Release resource i +void +test_finalizer_rel_struct_t(RECT i) +{ + int index = i.top; + if (index < 0 || index >= (int)gFinalizerTestSize) { + MOZ_NOT_REACHED("Assertion failed"); + } + gFinalizerTestResources[index] --; +} + +bool +test_finalizer_struct_resource_is_acquired(RECT i) +{ + int index = i.top; + if (index < 0 || index >= (int)gFinalizerTestSize) { + MOZ_NOT_REACHED("Assertion failed"); + } + return gFinalizerTestResources[index] == 1; +} + +bool +test_finalizer_cmp_struct_t(RECT a, RECT b) +{ + return a.top == b.top; +} + +// Support for checking that we reject NULL finalizer +afun* test_finalizer_rel_null_function() +{ + return NULL; +} + +void +test_finalizer_rel_size_t_set_errno(size_t i) +{ + if (-- gFinalizerTestResources[i] < 0) { + MOZ_NOT_REACHED("Assertion failed"); + } + errno = 10; +} + +void +reset_errno() +{ + errno = 0; +} + diff --git a/toolkit/components/ctypes/tests/jsctypes-test-finalizer.h b/toolkit/components/ctypes/tests/jsctypes-test-finalizer.h new file mode 100644 index 00000000000..452ec2e52c7 --- /dev/null +++ b/toolkit/components/ctypes/tests/jsctypes-test-finalizer.h @@ -0,0 +1,52 @@ +/* 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 "jsapi.h" + +#define EXPORT_CDECL(type) NS_EXPORT type + +NS_EXTERN_C +{ + + EXPORT_CDECL(void) test_finalizer_start(size_t size); + EXPORT_CDECL(void) test_finalizer_stop(); + EXPORT_CDECL(bool) test_finalizer_resource_is_acquired(size_t i); + + EXPORT_CDECL(size_t) test_finalizer_acq_size_t(size_t i); + EXPORT_CDECL(void) test_finalizer_rel_size_t(size_t i); + EXPORT_CDECL(size_t) test_finalizer_rel_size_t_return_size_t(size_t i); + EXPORT_CDECL(bool) test_finalizer_cmp_size_t(size_t a, size_t b); + + EXPORT_CDECL(int32_t) test_finalizer_acq_int32_t(size_t i); + EXPORT_CDECL(void) test_finalizer_rel_int32_t(int32_t i); + EXPORT_CDECL(bool) test_finalizer_cmp_int32_t(int32_t a, int32_t b); + + EXPORT_CDECL(int64_t) test_finalizer_acq_int64_t(size_t i); + EXPORT_CDECL(void) test_finalizer_rel_int64_t(int64_t i); + EXPORT_CDECL(bool) test_finalizer_cmp_int64_t(int64_t a, int64_t b); + + EXPORT_CDECL(void*) test_finalizer_acq_ptr_t(size_t i); + EXPORT_CDECL(void) test_finalizer_rel_ptr_t(void *i); + EXPORT_CDECL(bool) test_finalizer_cmp_ptr_t(void *a, void *b); + + EXPORT_CDECL(char*) test_finalizer_acq_string_t(int i); + EXPORT_CDECL(void) test_finalizer_rel_string_t(char *i); + EXPORT_CDECL(bool) test_finalizer_cmp_string_t(char *a, char *b); + + EXPORT_CDECL(void*) test_finalizer_acq_null_t(size_t i); + EXPORT_CDECL(void) test_finalizer_rel_null_t(void *i); + EXPORT_CDECL(bool) test_finalizer_cmp_null_t(void *a, void *b); + EXPORT_CDECL(bool) test_finalizer_null_resource_is_acquired(size_t i); + + EXPORT_CDECL(RECT) test_finalizer_acq_struct_t(int i); + EXPORT_CDECL(void) test_finalizer_rel_struct_t(RECT i); + EXPORT_CDECL(bool) test_finalizer_cmp_struct_t(RECT a, RECT b); + + typedef void (*afun)(size_t); + EXPORT_CDECL(afun*) test_finalizer_rel_null_function(); + + EXPORT_CDECL(void) test_finalizer_rel_size_t_set_errno(size_t i); + EXPORT_CDECL(void) reset_errno(); + +} diff --git a/toolkit/components/ctypes/tests/jsctypes-test.cpp b/toolkit/components/ctypes/tests/jsctypes-test.cpp index 35051ac3f9a..8a9762d66ab 100644 --- a/toolkit/components/ctypes/tests/jsctypes-test.cpp +++ b/toolkit/components/ctypes/tests/jsctypes-test.cpp @@ -23,6 +23,7 @@ * Fredrik Larsson * Mark Finkle , * Dan Witte + * David Rajchenbach-Teller * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -39,9 +40,15 @@ * ***** END LICENSE BLOCK ***** */ #include "jsctypes-test.h" +#include "jsapi.h" #include "nsCRTGlue.h" #include #include +#include + +#if defined(XP_WIN) +#define snprintf _snprintf +#endif // defined(XP_WIN) template struct ValueTraits { static T literal() { return static_cast(109.25); } @@ -403,4 +410,3 @@ test_vector_add_va_cdecl(PRUint8 num_vecs, } RECT data_rect = { -1, -2, 3, 4 }; - diff --git a/toolkit/components/ctypes/tests/jsctypes-test.h b/toolkit/components/ctypes/tests/jsctypes-test.h index 25db4592269..2e84eba9ab0 100644 --- a/toolkit/components/ctypes/tests/jsctypes-test.h +++ b/toolkit/components/ctypes/tests/jsctypes-test.h @@ -23,6 +23,7 @@ * Fredrik Larsson * Mark Finkle , * Dan Witte + * David Rajchenbach-Teller * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or diff --git a/toolkit/components/ctypes/tests/unit/head.js b/toolkit/components/ctypes/tests/unit/head.js index a36f15d2179..fe37c6bfbd3 100644 --- a/toolkit/components/ctypes/tests/unit/head.js +++ b/toolkit/components/ctypes/tests/unit/head.js @@ -10,6 +10,32 @@ function open_ctypes_test_lib() return ctypes.open(do_get_file(ctypes.libraryName("jsctypes-test")).path); } +/** + * A weak set of CDataFinalizer values that need to be cleaned up before + * proceeding to the next test. + */ +function ResourceCleaner() { + this._map = new WeakMap(); +} +ResourceCleaner.prototype = { + add: function ResourceCleaner_add(v) { + this._map.set(v); + return v; + }, + cleanup: function ResourceCleaner_cleanup() { + let keys = Components.utils.nondeterministicGetWeakMapKeys(this._map); + keys.forEach((function cleaner(k) { + try { + k.dispose(); + } catch (x) { + // This can fail if |forget|/|dispose| has been called manually + // during the test. This is normal. + } + this._map.delete(k); + }).bind(this)); + } +}; + /** * Simple wrapper for tests that require cleanup. */ @@ -20,14 +46,17 @@ function ResourceTester(start, stop) { ResourceTester.prototype = { launch: function(size, test, args) { Components.utils.forceGC(); + let cleaner = new ResourceCleaner(); this._start(size); try { - test(size, args); + test(size, args, cleaner); } catch (x) { + cleaner.cleanup(); this._stop(); throw x; } Components.utils.forceGC(); + cleaner.cleanup(); this._stop(); } }; @@ -77,3 +106,18 @@ function structural_check_eq_aux(a, b) { } ); } + +function trigger_gc() { + dump("Triggering garbage-collection"); + Components.utils.forceGC(); +} + +function must_throw(f) { + let has_thrown = false; + try { + f(); + } catch (x) { + has_thrown = true; + } + do_check_true(has_thrown); +} diff --git a/toolkit/components/ctypes/tests/unit/test_finalizer.js b/toolkit/components/ctypes/tests/unit/test_finalizer.js new file mode 100644 index 00000000000..ec0cb35c008 --- /dev/null +++ b/toolkit/components/ctypes/tests/unit/test_finalizer.js @@ -0,0 +1,383 @@ +let TEST_SIZE = 100; + +function run_test() +{ + let library = open_ctypes_test_lib(); + + let start = library.declare("test_finalizer_start", ctypes.default_abi, + ctypes.void_t, + ctypes.size_t); + let stop = library.declare("test_finalizer_stop", ctypes.default_abi, + ctypes.void_t); + let status = library.declare("test_finalizer_resource_is_acquired", + ctypes.default_abi, + ctypes.bool, + ctypes.size_t); + + let samples = []; + samples.push( + { + name: "size_t", + acquire: library.declare("test_finalizer_acq_size_t", + ctypes.default_abi, + ctypes.size_t, + ctypes.size_t), + release: library.declare("test_finalizer_rel_size_t", + ctypes.default_abi, + ctypes.void_t, + ctypes.size_t), + compare: library.declare("test_finalizer_cmp_size_t", + ctypes.default_abi, + ctypes.bool, + ctypes.size_t, + ctypes.size_t), + status: status + }); + samples.push( + { + name: "size_t", + acquire: library.declare("test_finalizer_acq_size_t", + ctypes.default_abi, + ctypes.size_t, + ctypes.size_t), + release: library.declare("test_finalizer_rel_size_t_set_errno", + ctypes.default_abi, + ctypes.void_t, + ctypes.size_t), + compare: library.declare("test_finalizer_cmp_size_t", + ctypes.default_abi, + ctypes.bool, + ctypes.size_t, + ctypes.size_t), + status: status + }); + samples.push( + { + name: "int32_t", + acquire: library.declare("test_finalizer_acq_int32_t", + ctypes.default_abi, + ctypes.int32_t, + ctypes.size_t), + release: library.declare("test_finalizer_rel_int32_t", + ctypes.default_abi, + ctypes.void_t, + ctypes.int32_t), + compare: library.declare("test_finalizer_cmp_int32_t", + ctypes.default_abi, + ctypes.bool, + ctypes.int32_t, + ctypes.int32_t), + status: status + } + ); + samples.push( + { + name: "int64_t", + acquire: library.declare("test_finalizer_acq_int64_t", + ctypes.default_abi, + ctypes.int64_t, + ctypes.size_t), + release: library.declare("test_finalizer_rel_int64_t", + ctypes.default_abi, + ctypes.void_t, + ctypes.int64_t), + compare: library.declare("test_finalizer_cmp_int64_t", + ctypes.default_abi, + ctypes.bool, + ctypes.int64_t, + ctypes.int64_t), + status: status + } + ); + samples.push( + { + name: "ptr", + acquire: library.declare("test_finalizer_acq_ptr_t", + ctypes.default_abi, + ctypes.PointerType(ctypes.void_t), + ctypes.size_t), + release: library.declare("test_finalizer_rel_ptr_t", + ctypes.default_abi, + ctypes.void_t, + ctypes.PointerType(ctypes.void_t)), + compare: library.declare("test_finalizer_cmp_ptr_t", + ctypes.default_abi, + ctypes.bool, + ctypes.void_t.ptr, + ctypes.void_t.ptr), + status: status + } + ); + samples.push( + { + name: "string", + acquire: library.declare("test_finalizer_acq_string_t", + ctypes.default_abi, + ctypes.char.ptr, + ctypes.int), + release: library.declare("test_finalizer_rel_string_t", + ctypes.default_abi, + ctypes.void_t, + ctypes.char.ptr), + compare: library.declare("test_finalizer_cmp_string_t", + ctypes.default_abi, + ctypes.bool, + ctypes.char.ptr, + ctypes.char.ptr), + status: status + } + ); + const rect_t = new ctypes.StructType("RECT", + [{ top : ctypes.int32_t }, + { left : ctypes.int32_t }, + { bottom: ctypes.int32_t }, + { right : ctypes.int32_t }]); + samples.push( + { + name: "struct", + acquire: library.declare("test_finalizer_acq_struct_t", + ctypes.default_abi, + rect_t, + ctypes.int), + release: library.declare("test_finalizer_rel_struct_t", + ctypes.default_abi, + ctypes.void_t, + rect_t), + compare: library.declare("test_finalizer_cmp_struct_t", + ctypes.default_abi, + ctypes.bool, + rect_t, + rect_t), + status: status + } + ); + samples.push( + { + name: "size_t, release returns size_t", + acquire: library.declare("test_finalizer_acq_size_t", + ctypes.default_abi, + ctypes.size_t, + ctypes.size_t), + release: library.declare("test_finalizer_rel_size_t_return_size_t", + ctypes.default_abi, + ctypes.size_t, + ctypes.size_t), + compare: library.declare("test_finalizer_cmp_size_t", + ctypes.default_abi, + ctypes.bool, + ctypes.size_t, + ctypes.size_t), + status: status + } + ); + samples.push( + { + name: "null", + acquire: library.declare("test_finalizer_acq_null_t", + ctypes.default_abi, + ctypes.PointerType(ctypes.void_t), + ctypes.size_t), + release: library.declare("test_finalizer_rel_null_t", + ctypes.default_abi, + ctypes.void_t, + ctypes.PointerType(ctypes.void_t)), + status: library.declare("test_finalizer_null_resource_is_acquired", + ctypes.default_abi, + ctypes.bool, + ctypes.size_t), + compare: library.declare("test_finalizer_cmp_null_t", + ctypes.default_abi, + ctypes.bool, + ctypes.void_t.ptr, + ctypes.void_t.ptr) + } + ); + + let tester = new ResourceTester(start, stop); + samples.forEach( + function(sample) { + dump("Executing finalization test for data "+sample.name+"\n"); + tester.launch(TEST_SIZE, test_executing_finalizers, sample); + tester.launch(TEST_SIZE, test_do_not_execute_finalizers_on_referenced_stuff, sample); + tester.launch(TEST_SIZE, test_executing_dispose, sample); + tester.launch(TEST_SIZE, test_executing_forget, sample); + } + ); + + /* + * Following test deactivated: Cycle collection never takes place + * (see bug 727371) + tester.launch(TEST_SIZE, test_cycles, samples[0]); + */ + library.close(); +} + +// If only I could have Promises to test this :) +// There is only so much we can do at this stage, +// if we want to avoid tests overlapping. +function test_cycles(size, tc) { + // Now, restart this with unreferenced cycles + for (i = 0; i < size/2; ++i) { + let a = { + a: ctypes.CDataFinalizer(tc.acquire(i*2), tc.release), + b: { + b: ctypes.CDataFinalizer(tc.acquire(i*2+1), tc.release) + } + }; + a.b.a = a; + } + do_test_pending(); + + Components.utils.schedulePreciseGC( + function() { + // Check that _something_ has been finalized + do_check_true(count_finalized(size, tc) > 0); + do_test_finished(); + } + ); + + do_timeout(10000, do_throw); +} + + +function count_finalized(size, tc) { + let finalizedItems = 0; + for (let i = 0; i < size; ++i) { + if (!tc.status(i)) { + ++finalizedItems; + } + } + return finalizedItems; +} + +/** + * Test: + * - that (some) finalizers are executed; + * - that no finalizer is executed twice (this is done on the C side). + */ +function test_executing_finalizers(size, tc, cleanup) +{ + dump("test_executing_finalizers\n"); + // Allocate |size| items without references + for (let i = 0; i < size; ++i) { + cleanup.add(ctypes.CDataFinalizer(tc.acquire(i), tc.release)); + } + trigger_gc(); // This should trigger some finalizations, hopefully all + + // Check that _something_ has been finalized + do_check_true(count_finalized(size, tc) > 0); +} + + +/** + * Check that + * - |dispose| is executed properly + * - finalizers are not executed after |dispose| + */ +function test_executing_dispose(size, tc, cleanup) +{ + dump("test_executing_dispose " + tc.name + "\n"); + let ref = []; + // Allocate |size| items with references + for (let i = 0; i < size; ++i) { + let value = ctypes.CDataFinalizer(tc.acquire(i), tc.release); + cleanup.add(value); + ref.push(value); + } + do_check_eq(count_finalized(size, tc), 0); + + // Dispose of everything and make sure that everything has been cleaned up + ref.forEach( + function dispose(v) { + v.dispose(); + } + ); + do_check_eq(count_finalized(size, tc), size); + + // Remove references + ref = []; + + // Re-acquire data and make sure that everything has been reinialized + for (i = 0; i < size; ++i) { + tc.acquire(i); + } + + do_check_eq(count_finalized(size, tc), 0); + + + // Attempt to trigger finalizations, ensure that they do not take place + trigger_gc(); + + do_check_eq(count_finalized(size, tc), 0); +} + + +/** + * Check that + * - |forget| does not dispose + * - |forget| has the right content + * - finalizers are not executed after |forget| + */ +function test_executing_forget(size, tc, cleanup) +{ + dump("test_executing_forget " + tc.name + "\n"); + let ref = []; + // Allocate |size| items with references + for (let i = 0; i < size; ++i) { + let original = tc.acquire(i); + let finalizer = ctypes.CDataFinalizer(original, tc.release); + ref.push( + { + original: original, + finalizer: finalizer + } + ); + cleanup.add(finalizer); + do_check_true(tc.compare(original, finalizer)); + } + do_check_eq(count_finalized(size, tc), 0); + + // Forget everything, making sure that we recover the original info + ref.forEach( + function compare_original_to_recovered(v) { + let original = v.original; + let recovered = v.finalizer.forget(); + // Note: Cannot use do_check_eq on Uint64 et al. + do_check_true(tc.compare(original, recovered)); + do_check_eq(original.constructor, recovered.constructor); + } + ); + + // Also make sure that we have not performed any clean up + do_check_eq(count_finalized(size, tc), 0); + + // Remove references + ref = []; + + // Attempt to trigger finalizations, ensure that they have no effect + trigger_gc(); + + do_check_eq(count_finalized(size, tc), 0); +} + + +/** + * Check that finalizers are not executed + */ +function test_do_not_execute_finalizers_on_referenced_stuff(size, tc, cleanup) +{ + dump("test_do_not_execute_finalizers_on_referenced_stuff " + tc.name + "\n"); + + let ref = []; + // Allocate |size| items without references + for (let i = 0; i < size; ++i) { + let value = ctypes.CDataFinalizer(tc.acquire(i), tc.release); + cleanup.add(value); + ref.push(value); + } + trigger_gc(); // This might trigger some finalizations, but it should not + + // Check that _nothing_ has been finalized + do_check_eq(count_finalized(size, tc), 0); +} + diff --git a/toolkit/components/ctypes/tests/unit/test_finalizer_shouldaccept.js b/toolkit/components/ctypes/tests/unit/test_finalizer_shouldaccept.js new file mode 100644 index 00000000000..163d8d60418 --- /dev/null +++ b/toolkit/components/ctypes/tests/unit/test_finalizer_shouldaccept.js @@ -0,0 +1,122 @@ +try { + // We might be running without privileges, in which case it's up to the + // harness to give us the 'ctypes' object. + Components.utils.import("resource://gre/modules/ctypes.jsm"); +} catch(e) { +} + +let acquire, dispose, reset_errno, dispose_errno; + +function run_test() +{ + let library = open_ctypes_test_lib(); + + let start = library.declare("test_finalizer_start", ctypes.default_abi, + ctypes.void_t, + ctypes.size_t); + let stop = library.declare("test_finalizer_stop", ctypes.default_abi, + ctypes.void_t); + let tester = new ResourceTester(start, stop); + acquire = library.declare("test_finalizer_acq_size_t", + ctypes.default_abi, + ctypes.size_t, + ctypes.size_t); + dispose = library.declare("test_finalizer_rel_size_t", + ctypes.default_abi, + ctypes.void_t, + ctypes.size_t); + reset_errno = library.declare("reset_errno", + ctypes.default_abi, + ctypes.void_t); + dispose_errno = library.declare("test_finalizer_rel_size_t_set_errno", + ctypes.default_abi, + ctypes.void_t, + ctypes.size_t); + tester.launch(10, test_to_string); + tester.launch(10, test_to_source); + tester.launch(10, test_to_int); + tester.launch(10, test_errno); +} + +/** + * Check that toString succeeds before/after forget/dispose. + */ +function test_to_string() +{ + do_print("Starting test_to_string"); + let a = ctypes.CDataFinalizer(acquire(0), dispose); + do_check_eq(a.toString(), "0"); + + a.forget(); + do_check_eq(a.toString(), "[CDataFinalizer - empty]"); + + a = ctypes.CDataFinalizer(acquire(0), dispose); + a.dispose(); + do_check_eq(a.toString(), "[CDataFinalizer - empty]"); +} + +/** + * Check that toSource succeeds before/after forget/dispose. + */ +function test_to_source() +{ + do_print("Starting test_to_source"); + let value = acquire(0); + let a = ctypes.CDataFinalizer(value, dispose); + do_check_eq(a.toSource(), + "ctypes.CDataFinalizer(" + + ctypes.size_t(value).toSource() + +", " + +dispose.toSource() + +")"); + value = null; + + a.forget(); + do_check_eq(a.toSource(), "ctypes.CDataFinalizer()"); + + a = ctypes.CDataFinalizer(acquire(0), dispose); + a.dispose(); + do_check_eq(a.toSource(), "ctypes.CDataFinalizer()"); +} + +/** + * Test conversion to int32 + */ +function test_to_int() +{ + let value = 2; + let wrapped, converted, finalizable; + wrapped = ctypes.int32_t(value); + finalizable= ctypes.CDataFinalizer(acquire(value), dispose); + converted = ctypes.int32_t(finalizable); + + structural_check_eq(converted, wrapped); + structural_check_eq(converted, ctypes.int32_t(finalizable.forget())); + + wrapped = ctypes.int64_t(value); + converted = ctypes.int64_t(ctypes.CDataFinalizer(acquire(value), + dispose)); + structural_check_eq(converted, wrapped); +} + +/** + * Test that dispose can change errno but finalization cannot + */ +function test_errno(size) +{ + reset_errno(); + do_check_eq(ctypes.errno, 0); + + let finalizable = ctypes.CDataFinalizer(acquire(3), dispose_errno); + finalizable.dispose(); + do_check_eq(ctypes.errno, 10); + reset_errno(); + + do_check_eq(ctypes.errno, 0); + for (let i = 0; i < size; ++i) { + finalizable = ctypes.CDataFinalizer(acquire(i), dispose_errno); + } + + trigger_gc(); + do_check_eq(ctypes.errno, 0); +} \ No newline at end of file diff --git a/toolkit/components/ctypes/tests/unit/test_finalizer_shouldfail.js b/toolkit/components/ctypes/tests/unit/test_finalizer_shouldfail.js new file mode 100644 index 00000000000..fb14a674839 --- /dev/null +++ b/toolkit/components/ctypes/tests/unit/test_finalizer_shouldfail.js @@ -0,0 +1,156 @@ +try { + // We might be running without privileges, in which case it's up to the + // harness to give us the 'ctypes' object. + Components.utils.import("resource://gre/modules/ctypes.jsm"); +} catch(e) { +} + +let acquire, dispose, null_dispose, compare; + +function run_test() +{ + let library = open_ctypes_test_lib(); + + let start = library.declare("test_finalizer_start", ctypes.default_abi, + ctypes.void_t, + ctypes.size_t); + let stop = library.declare("test_finalizer_stop", ctypes.default_abi, + ctypes.void_t); + let tester = new ResourceTester(start, stop); + acquire = library.declare("test_finalizer_acq_size_t", + ctypes.default_abi, + ctypes.size_t, + ctypes.size_t); + dispose = library.declare("test_finalizer_rel_size_t", + ctypes.default_abi, + ctypes.void_t, + ctypes.size_t); + compare = library.declare("test_finalizer_cmp_size_t", + ctypes.default_abi, + ctypes.bool, + ctypes.size_t, + ctypes.size_t); + + let type_afun = ctypes.FunctionType(ctypes.default_abi, + ctypes.void_t, + [ctypes.size_t]).ptr; + + let null_dispose_maker = + library.declare("test_finalizer_rel_null_function", + ctypes.default_abi, + type_afun + ); + null_dispose = null_dispose_maker(); + + tester.launch(10, test_double_dispose); + tester.launch(10, test_finalize_bad_construction); + tester.launch(10, test_null_dispose); + tester.launch(10, test_pass_disposed); +} + + +/** + * Testing construction of finalizers with wrong arguments. + */ +function test_finalize_bad_construction() { + // First argument does not match second + must_throw(function() { ctypes.CDataFinalizer({}, dispose); }); + must_throw(function() { ctypes.CDataFinalizer(dispose, dispose); }); + + // Not enough arguments + must_throw(function() { ctypes.CDataFinalizer(init(0)); }); + + // Too many arguments + must_throw(function() { ctypes.CDataFinalizer(init(0), dispose, dispose); }); + + // Second argument is null + must_throw(function() { ctypes.CDataFinalizer(init(0), null); }); + + // Second argument is undefined + must_throw(function() { + let a; + ctypes.CDataFinalizer(init(0), a); + }); + +} + +/** + * Test that forget/dispose can only take place once. + */ +function test_double_dispose() { + function test_one_combination(i, a, b) { + let v = ctypes.CDataFinalizer(acquire(i), dispose); + a(v); + must_throw(function() { b(v); } ); + } + + let call_dispose = function(v) { + v.dispose(); + }; + let call_forget = function(v) { + v.forget(); + }; + + test_one_combination(0, call_dispose, call_dispose); + test_one_combination(1, call_dispose, call_forget); + test_one_combination(2, call_forget, call_dispose); + test_one_combination(3, call_forget, call_forget); +} + + +/** + * Test that nothing (too) bad happens when the finalizer is NULL + */ +function test_null_dispose() +{ + let exception; + + exception = false; + try { + let v = ctypes.CDataFinalizer(acquire(0), null_dispose); + } catch (x) { + exception = true; + } + do_check_true(exception); +} + +/** + * Test that conversion of a disposed/forgotten CDataFinalizer to a C + * value fails nicely. + */ +function test_pass_disposed() +{ + let exception, v; + + exception = false; + v = ctypes.CDataFinalizer(acquire(0), dispose); + do_check_true(compare(v, 0)); + v.forget(); + + try { + compare(v, 0); + } catch (x) { + exception = true; + } + do_check_true(exception); + + exception = false; + v = ctypes.CDataFinalizer(acquire(0), dispose); + do_check_true(compare(v, 0)); + v.dispose(); + + try { + compare(v, 0); + } catch (x) { + exception = true; + } + do_check_true(exception); + + exception = false; + try { + ctypes.int32_t(ctypes.CDataFinalizer(v, dispose)); + } catch (x) { + exception = true; + } + do_check_true(exception); +} \ No newline at end of file diff --git a/toolkit/components/ctypes/tests/unit/xpcshell.ini b/toolkit/components/ctypes/tests/unit/xpcshell.ini index a70757a0cc1..50451571aec 100644 --- a/toolkit/components/ctypes/tests/unit/xpcshell.ini +++ b/toolkit/components/ctypes/tests/unit/xpcshell.ini @@ -4,6 +4,10 @@ tail = [test_errno.js] +[test_finalizer.js] +[test_finalizer_shouldfail.js] +[test_finalizer_shouldaccept.js] + [test_jsctypes.js] # Bug 676989: test fails consistently on Android fail-if = os == "android" From 88d7051a9577bf62288c4351f70aeb363832d755 Mon Sep 17 00:00:00 2001 From: Jeff Gilbert Date: Tue, 24 Apr 2012 19:49:59 -0400 Subject: [PATCH 066/182] Bug 730417 - Add minimal PBuffer request case and use PBuffer request bit. r=bjacob --- gfx/gl/GLContextProviderEGL.cpp | 48 ++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/gfx/gl/GLContextProviderEGL.cpp b/gfx/gl/GLContextProviderEGL.cpp index ec818a6229b..9fff84e5e05 100644 --- a/gfx/gl/GLContextProviderEGL.cpp +++ b/gfx/gl/GLContextProviderEGL.cpp @@ -1606,6 +1606,23 @@ GLContextProviderEGL::CreateForWindow(nsIWidget *aWidget) return glContext.forget(); } +static void +FillPBufferAttribs_Minimal(nsTArray& aAttrs) +{ + aAttrs.Clear(); + +#define A1(_x) do { aAttrs.AppendElement(_x); } while (0) +#define A2(_x,_y) do { A1(_x); A1(_y); } while (0) + + A2(LOCAL_EGL_RENDERABLE_TYPE, LOCAL_EGL_OPENGL_ES2_BIT); + + A2(LOCAL_EGL_SURFACE_TYPE, LOCAL_EGL_PBUFFER_BIT); + + A1(LOCAL_EGL_NONE); +#undef A1 +#undef A2 +} + static void FillPBufferAttribs(nsTArray& aAttrs, const ContextFormat& aFormat, @@ -1620,6 +1637,8 @@ FillPBufferAttribs(nsTArray& aAttrs, A2(LOCAL_EGL_RENDERABLE_TYPE, LOCAL_EGL_OPENGL_ES2_BIT); + A2(LOCAL_EGL_SURFACE_TYPE, LOCAL_EGL_PBUFFER_BIT); + if (aColorBitsOverride == -1) { A2(LOCAL_EGL_RED_SIZE, aFormat.red); A2(LOCAL_EGL_GREEN_SIZE, aFormat.green); @@ -1676,16 +1695,20 @@ GLContextEGL::CreateEGLPBufferOffscreenContext(const gfxIntSize& aSize, int tryDepthSize = (aFormat.depth > 0) ? 24 : 0; TRY_ATTRIBS_AGAIN: - switch (attribAttempt) { - case 0: - FillPBufferAttribs(attribs, aFormat, configCanBindToTexture, 8, tryDepthSize); - break; - case 1: - FillPBufferAttribs(attribs, aFormat, configCanBindToTexture, -1, tryDepthSize); - break; - case 2: - FillPBufferAttribs(attribs, aFormat, configCanBindToTexture, -1, -1); - break; + if (bufferUnused) { + FillPBufferAttribs_Minimal(attribs); + } else { + switch (attribAttempt) { + case 0: + FillPBufferAttribs(attribs, aFormat, configCanBindToTexture, 8, tryDepthSize); + break; + case 1: + FillPBufferAttribs(attribs, aFormat, configCanBindToTexture, -1, tryDepthSize); + break; + case 2: + FillPBufferAttribs(attribs, aFormat, configCanBindToTexture, -1, -1); + break; + } } if (!sEGLLibrary.fChooseConfig(EGL_DISPLAY(), @@ -1694,6 +1717,11 @@ TRY_ATTRIBS_AGAIN: &foundConfigs) || foundConfigs == 0) { + if (bufferUnused) { + NS_WARNING("No EGL Config for minimal PBuffer!"); + return nsnull; + } + if (attribAttempt < 3) { attribAttempt++; goto TRY_ATTRIBS_AGAIN; From 621ee66adfb5361934e3c5e236d1020a9c8feb08 Mon Sep 17 00:00:00 2001 From: Takanori MATSUURA Date: Tue, 24 Apr 2012 19:49:59 -0400 Subject: [PATCH 067/182] Bug 737821 - Exclude listing up files which are already bundled with xulrunner. r=ted --- browser/installer/package-manifest.in | 48 +++++++++++++++++++++++++++ configure.in | 4 +++ 2 files changed, 52 insertions(+) diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in index 84d14a9cf6d..34d65c2ba18 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in @@ -42,6 +42,7 @@ #endif [xpcom] +#ifndef SYSTEM_LIBXUL @BINPATH@/dependentlibs.list #ifdef XP_WIN32 @BINPATH@/@DLL_PREFIX@gkmedias@DLL_SUFFIX@ @@ -89,35 +90,43 @@ #endif #endif #endif +#endif [browser] ; [Base Browser Files] #ifndef XP_UNIX @BINPATH@/@MOZ_APP_NAME@.exe #else +#ifndef SYSTEM_LIBXUL @BINPATH@/@MOZ_APP_NAME@-bin +#endif @BINPATH@/@MOZ_APP_NAME@ #endif @BINPATH@/application.ini #ifdef MOZ_UPDATER @BINPATH@/update-settings.ini #endif +#ifndef SYSTEM_LIBXUL @BINPATH@/platform.ini #ifndef XP_OS2 @BINPATH@/@DLL_PREFIX@mozsqlite3@DLL_SUFFIX@ #else @BINPATH@/mozsqlt3@DLL_SUFFIX@ #endif +#endif @BINPATH@/blocklist.xml #ifdef XP_UNIX @BINPATH@/run-mozilla.sh +#ifndef SYSTEM_LIBXUL #ifndef XP_MACOSX @BINPATH@/mozilla-xremote-client #endif #endif +#endif ; [Components] @BINPATH@/components/components.manifest +#ifndef SYSTEM_LIBXUL @BINPATH@/components/alerts.xpt #ifdef ACCESSIBILITY #ifdef XP_WIN32 @@ -130,8 +139,10 @@ @BINPATH@/components/appstartup.xpt @BINPATH@/components/autocomplete.xpt @BINPATH@/components/autoconfig.xpt +#endif @BINPATH@/components/browsercompsbase.xpt @BINPATH@/components/browser-feeds.xpt +#ifndef SYSTEM_LIBXUL @BINPATH@/components/caps.xpt @BINPATH@/components/chrome.xpt @BINPATH@/components/commandhandler.xpt @@ -195,7 +206,9 @@ @BINPATH@/components/filepicker.xpt #endif @BINPATH@/components/find.xpt +#endif @BINPATH@/components/fuel.xpt +#ifndef SYSTEM_LIBXUL @BINPATH@/components/gfx.xpt @BINPATH@/components/html5.xpt @BINPATH@/components/htmlparser.xpt @@ -218,7 +231,9 @@ @BINPATH@/components/layout_xul.xpt @BINPATH@/components/locale.xpt @BINPATH@/components/lwbrk.xpt +#endif @BINPATH@/components/migration.xpt +#ifndef SYSTEM_LIBXUL @BINPATH@/components/mimetype.xpt @BINPATH@/components/mozfind.xpt @BINPATH@/components/necko_about.xpt @@ -250,9 +265,13 @@ @BINPATH@/components/rdf.xpt @BINPATH@/components/satchel.xpt @BINPATH@/components/saxparser.xpt +#endif @BINPATH@/components/sessionstore.xpt +#ifndef SYSTEM_LIBXUL @BINPATH@/components/services-crypto-component.xpt +#endif @BINPATH@/components/shellservice.xpt +#ifndef SYSTEM_LIBXUL @BINPATH@/components/shistory.xpt @BINPATH@/components/spellchecker.xpt @BINPATH@/components/storage.xpt @@ -289,14 +308,17 @@ @BINPATH@/components/xultmpl.xpt @BINPATH@/components/zipwriter.xpt @BINPATH@/components/telemetry.xpt +#endif ; JavaScript components +#ifndef SYSTEM_LIBXUL @BINPATH@/components/ConsoleAPI.manifest @BINPATH@/components/ConsoleAPI.js @BINPATH@/components/BrowserElementAPI.manifest @BINPATH@/components/BrowserElementAPI.js @BINPATH@/components/FeedProcessor.manifest @BINPATH@/components/FeedProcessor.js +#endif @BINPATH@/components/BrowserFeeds.manifest @BINPATH@/components/FeedConverter.js @BINPATH@/components/FeedWriter.js @@ -315,6 +337,7 @@ @BINPATH@/components/BrowserPageThumbs.manifest @BINPATH@/components/nsPrivateBrowsingService.manifest @BINPATH@/components/nsPrivateBrowsingService.js +#ifndef SYSTEM_LIBXUL @BINPATH@/components/toolkitsearch.manifest @BINPATH@/components/nsSearchService.js @BINPATH@/components/nsSearchSuggestions.js @@ -341,8 +364,10 @@ @BINPATH@/components/NetworkGeolocationProvider.js @BINPATH@/components/GPSDGeolocationProvider.manifest @BINPATH@/components/GPSDGeolocationProvider.js +#endif @BINPATH@/components/nsSidebar.manifest @BINPATH@/components/nsSidebar.js +#ifndef SYSTEM_LIBXUL @BINPATH@/components/extensions.manifest @BINPATH@/components/addonManager.js @BINPATH@/components/amContentHandler.js @@ -356,16 +381,20 @@ @BINPATH@/components/nsUpdateTimerManager.manifest @BINPATH@/components/nsUpdateTimerManager.js @BINPATH@/components/pluginGlue.manifest +#endif @BINPATH@/components/nsSessionStore.manifest @BINPATH@/components/nsSessionStartup.js @BINPATH@/components/nsSessionStore.js +#ifndef SYSTEM_LIBXUL @BINPATH@/components/nsURLFormatter.manifest @BINPATH@/components/nsURLFormatter.js +#endif #ifndef XP_OS2 @BINPATH@/components/@DLL_PREFIX@browsercomps@DLL_SUFFIX@ #else @BINPATH@/components/brwsrcmp@DLL_SUFFIX@ #endif +#ifndef SYSTEM_LIBXUL @BINPATH@/components/txEXSLTRegExFunctions.manifest @BINPATH@/components/txEXSLTRegExFunctions.js @BINPATH@/components/toolkitplaces.manifest @@ -374,9 +403,13 @@ @BINPATH@/components/nsPlacesAutoComplete.manifest @BINPATH@/components/nsPlacesAutoComplete.js @BINPATH@/components/nsPlacesExpiration.js +#endif @BINPATH@/components/PlacesProtocolHandler.js +#ifndef SYSTEM_LIBXUL @BINPATH@/components/PlacesCategoriesStarter.js +#endif @BINPATH@/components/PageThumbsProtocol.js +#ifndef SYSTEM_LIBXUL @BINPATH@/components/nsDefaultCLH.manifest @BINPATH@/components/nsDefaultCLH.js @BINPATH@/components/nsContentPrefService.manifest @@ -427,10 +460,12 @@ @BINPATH@/components/nsINIProcessor.js @BINPATH@/components/nsPrompter.manifest @BINPATH@/components/nsPrompter.js +#endif #ifdef MOZ_SERVICES_SYNC @BINPATH@/components/SyncComponents.manifest @BINPATH@/components/Weave.js #endif +#ifndef SYSTEM_LIBXUL @BINPATH@/components/TelemetryPing.js @BINPATH@/components/TelemetryPing.manifest @BINPATH@/components/messageWakeupService.js @@ -442,6 +477,7 @@ @BINPATH@/components/ContactManager.js @BINPATH@/components/ContactManager.manifest +#endif ; Modules @BINPATH@/modules/* @@ -450,17 +486,21 @@ #ifdef MOZ_SAFE_BROWSING @BINPATH@/components/nsSafebrowsingApplication.manifest @BINPATH@/components/nsSafebrowsingApplication.js +#ifndef SYSTEM_LIBXUL @BINPATH@/components/nsURLClassifier.manifest @BINPATH@/components/nsUrlClassifierHashCompleter.js @BINPATH@/components/nsUrlClassifierListManager.js @BINPATH@/components/nsUrlClassifierLib.js @BINPATH@/components/url-classifier.xpt #endif +#endif ; GNOME hooks +#ifndef SYSTEM_LIBXUL #ifdef MOZ_ENABLE_GNOME_COMPONENT @BINPATH@/components/@DLL_PREFIX@mozgnome@DLL_SUFFIX@ #endif +#endif ; ANGLE GLES-on-D3D rendering library #ifdef MOZ_ANGLE @@ -480,8 +520,10 @@ #ifdef SHIP_FEEDBACK @BINPATH@/distribution/extensions/testpilot@labs.mozilla.com.xpi #endif +#ifndef SYSTEM_LIBXUL @BINPATH@/chrome/toolkit@JAREXT@ @BINPATH@/chrome/toolkit.manifest +#endif #ifdef MOZ_GTK2 @BINPATH@/chrome/icons/default/default16.png @BINPATH@/chrome/icons/default/default32.png @@ -504,12 +546,15 @@ #ifdef MOZ_SERVICES_SYNC @BINPATH@/@PREF_DIR@/services-sync.js #endif +#ifndef SYSTEM_LIBXUL @BINPATH@/greprefs.js @BINPATH@/defaults/autoconfig/platform.js @BINPATH@/defaults/autoconfig/prefcalls.js +#endif @BINPATH@/defaults/profile/prefs.js ; [Layout Engine Resources] +#ifndef SYSTEM_LIBXUL ; Style Sheets, Graphics and other Resources used by the layout engine. @BINPATH@/res/EditorOverride.css @BINPATH@/res/contenteditable.css @@ -552,9 +597,11 @@ @BINPATH@/res/svg.css @BINPATH@/components/dom_svg.xpt @BINPATH@/components/dom_smil.xpt +#endif ; [Personal Security Manager] ; +#ifndef SYSTEM_LIBXUL ; NSS libraries are signed in the staging directory, ; meaning their .chk files are created there directly. ; @@ -580,6 +627,7 @@ bin/libfreebl_32fpu_3.so bin/libfreebl_32int_3.so bin/libfreebl_32int64_3.so #endif +#endif ; [Updater] ; diff --git a/configure.in b/configure.in index 10fb6071316..48810bb330d 100644 --- a/configure.in +++ b/configure.in @@ -4186,6 +4186,10 @@ MOZ_ARG_WITH_BOOL(system-libxul, [ --with-system-libxul Use system installed libxul SDK], SYSTEM_LIBXUL=1) +if test -n "$SYSTEM_LIBXUL"; then + AC_DEFINE(SYSTEM_LIBXUL) +fi + dnl ======================================================== dnl = If NSPR was not detected in the system, dnl = use the one in the source tree (mozilla/nsprpub) From ae7a604091ae013ae8401d675a8167372ad4d36d Mon Sep 17 00:00:00 2001 From: Takanori MATSUURA Date: Tue, 24 Apr 2012 19:49:59 -0400 Subject: [PATCH 068/182] Bug 737821 - Only warn for files which are already bundled with xulrunner. r=ted --- browser/installer/Makefile.in | 3 +++ 1 file changed, 3 insertions(+) diff --git a/browser/installer/Makefile.in b/browser/installer/Makefile.in index e250b55670d..1a492a3b6b8 100644 --- a/browser/installer/Makefile.in +++ b/browser/installer/Makefile.in @@ -48,7 +48,10 @@ include $(topsrcdir)/config/rules.mk MOZ_PKG_REMOVALS = $(srcdir)/removed-files.in MOZ_PKG_MANIFEST_P = $(srcdir)/package-manifest.in +# Some files have been already bundled with xulrunner +ifndef SYSTEM_LIBXUL MOZ_PKG_FATAL_WARNINGS = 1 +endif MOZ_NONLOCALIZED_PKG_LIST = \ xpcom \ From 5a9d116b2cd2bae0bbd4d4b1fee61e2980061d19 Mon Sep 17 00:00:00 2001 From: Andrii Zui Date: Tue, 24 Apr 2012 19:49:59 -0400 Subject: [PATCH 069/182] Bug 739556 - maction: selection attribute is taken into account only with actiontype="toggle". r=karlt --- layout/mathml/nsMathMLmactionFrame.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/layout/mathml/nsMathMLmactionFrame.cpp b/layout/mathml/nsMathMLmactionFrame.cpp index 0b895387869..eb0069fdcfa 100644 --- a/layout/mathml/nsMathMLmactionFrame.cpp +++ b/layout/mathml/nsMathMLmactionFrame.cpp @@ -171,6 +171,16 @@ nsMathMLmactionFrame::GetSelectedFrame() nsAutoString value; PRInt32 selection; + // selection is applied only to toggle, return first child otherwise + if (NS_MATHML_ACTION_TYPE_TOGGLE != mActionType) { + // We don't touch mChildCount here. It's incorrect to assign it 1, + // and it's inefficient to count the children. It's fine to leave + // it be equal -1 because it's not used with other actiontypes. + mSelection = 1; + mSelectedFrame = mFrames.FirstChild(); + return mSelectedFrame; + } + GetAttribute(mContent, mPresentationData.mstyle, nsGkAtoms::selection_, value); if (!value.IsEmpty()) { From d730abad4c7ac77a0651dbb62459d3f3583a540b Mon Sep 17 00:00:00 2001 From: Andrii Zui Date: Tue, 24 Apr 2012 19:49:59 -0400 Subject: [PATCH 070/182] Bug 739556 - Static reftests. r=karlt --- .../mathml/maction-selection-ref.html | 48 ++++++++++++++ layout/reftests/mathml/maction-selection.html | 63 +++++++++++++++++++ layout/reftests/mathml/reftest.list | 1 + 3 files changed, 112 insertions(+) create mode 100644 layout/reftests/mathml/maction-selection-ref.html create mode 100644 layout/reftests/mathml/maction-selection.html diff --git a/layout/reftests/mathml/maction-selection-ref.html b/layout/reftests/mathml/maction-selection-ref.html new file mode 100644 index 00000000000..e8e73b1bcd6 --- /dev/null +++ b/layout/reftests/mathml/maction-selection-ref.html @@ -0,0 +1,48 @@ + + +maction selection + + + + +

Statusline: + + x + +

+ +

Tooltip: + + x + +

+ +

Toggle: + + + 6 + 8 + + +

+ +

Toggle 2: + + + + + 6 + 8 + + + + 3 + 4 + + + + +

+ + + diff --git a/layout/reftests/mathml/maction-selection.html b/layout/reftests/mathml/maction-selection.html new file mode 100644 index 00000000000..a6d555d9692 --- /dev/null +++ b/layout/reftests/mathml/maction-selection.html @@ -0,0 +1,63 @@ + + +maction selection + + + + +

Statusline: + + + x + square root of x + + +

+ +

Tooltip: + + + x + square root of x + + +

+ +

Toggle: + + + + + 3 + 4 + + + + 6 + 8 + + + + +

+ +

Toggle 2: + + + + + 3 + 4 + + + + 6 + 8 + + + + +

+ + + diff --git a/layout/reftests/mathml/reftest.list b/layout/reftests/mathml/reftest.list index ffeb2492e07..98d8dc1918e 100644 --- a/layout/reftests/mathml/reftest.list +++ b/layout/reftests/mathml/reftest.list @@ -97,3 +97,4 @@ fails == mstyle-5.xhtml mstyle-5-ref.xhtml # See bug 569125#c29 == munderover-empty-scripts.html munderover-empty-scripts-ref.html == positive-namedspace.html positive-namedspace-ref.html == mtable-width.html mtable-width-ref.html +== maction-selection.html maction-selection-ref.html \ No newline at end of file From c212827e5a959e56756389bf955ad7db74614827 Mon Sep 17 00:00:00 2001 From: David Rajchenbach-Teller Date: Fri, 13 Apr 2012 23:56:03 +0200 Subject: [PATCH 071/182] Bug 742384 - Have CDataFinalizer.dispose return a value. r=jorendorff --- js/src/ctypes/CTypes.cpp | 70 +++++++++---- .../ctypes/tests/jsctypes-test-finalizer.cpp | 10 ++ .../ctypes/tests/jsctypes-test-finalizer.h | 2 +- toolkit/components/ctypes/tests/unit/head.js | 4 +- .../ctypes/tests/unit/test_finalizer.js | 97 ++++++++++++++++--- 5 files changed, 145 insertions(+), 38 deletions(-) diff --git a/js/src/ctypes/CTypes.cpp b/js/src/ctypes/CTypes.cpp index 6735d9c0a53..e5789d9cda8 100644 --- a/js/src/ctypes/CTypes.cpp +++ b/js/src/ctypes/CTypes.cpp @@ -290,7 +290,9 @@ namespace CDataFinalizer { /* * Perform the actual call to the finalizer code. */ - static void CallFinalizer(Private *p, JSObject *ctypes); + static void CallFinalizer(CDataFinalizer::Private *p, + int* errnoStatus, + int32_t* lastErrorStatus); /* * Return the CType of a CDataFinalizer object, or NULL if the object @@ -6643,12 +6645,17 @@ CDataFinalizer::Construct(JSContext* cx, unsigned argc, jsval *vp) * The function fails if |this| has gone through |Forget|/|Dispose| * or |Finalize|. * - * In contexts that should update errno/winLastError, callers should provide - * argument |ctypes|, which must point to global object ctypes. In other cases, - * this argument should be NULL. + * This function does not alter the value of |errno|/|GetLastError|. + * + * If argument |errnoStatus| is non-NULL, it receives the value of |errno| + * immediately after the call. Under Windows, if argument |lastErrorStatus| + * is non-NULL, it receives the value of |GetLastError| immediately after the + * call. On other platforms, |lastErrorStatus| is ignored. */ void -CDataFinalizer::CallFinalizer(CDataFinalizer::Private *p, JSObject *ctypes) +CDataFinalizer::CallFinalizer(CDataFinalizer::Private *p, + int* errnoStatus, + int32_t* lastErrorStatus) { int savedErrno = errno; errno = 0; @@ -6659,20 +6666,15 @@ CDataFinalizer::CallFinalizer(CDataFinalizer::Private *p, JSObject *ctypes) ffi_call(&p->CIF, FFI_FN(p->code), p->rvalue, &p->cargs); - int errnoStatus = errno; + if (errnoStatus) { + *errnoStatus = errno; + } errno = savedErrno; #if defined(XP_WIN) - int32_t lastErrorStatus = GetLastError(); - SetLastError(savedLastError); -#endif // defined(XP_WIN) - - if (!ctypes) { - return; + if (lastErrorStatus) { + *lastErrorStatus = GetLastError(); } - - JS_SetReservedSlot(ctypes, SLOT_ERRNO, INT_TO_JSVAL(errnoStatus)); -#if defined(XP_WIN) - JS_SetReservedSlot(ctypes, SLOT_LASTERROR, INT_TO_JSVAL(lastErrorStatus)); + SetLastError(savedLastError); #endif // defined(XP_WIN) } @@ -6755,11 +6757,37 @@ CDataFinalizer::Methods::Dispose(JSContext* cx, unsigned argc, jsval *vp) JSObject *objCTypes = CType::GetGlobalCTypes(cx, JSVAL_TO_OBJECT(valType)); - CDataFinalizer::CallFinalizer(p, objCTypes); - CDataFinalizer::Cleanup(p, obj); + jsval valCodePtrType = JS_GetReservedSlot(obj, SLOT_DATAFINALIZER_CODETYPE); + JS_ASSERT(!JSVAL_IS_PRIMITIVE(valCodePtrType)); + JSObject *objCodePtrType = JSVAL_TO_OBJECT(valCodePtrType); - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return JS_TRUE; + JSObject *objCodeType = PointerType::GetBaseType(objCodePtrType); + JS_ASSERT(objCodeType); + JS_ASSERT(CType::GetTypeCode(objCodeType) == TYPE_function); + + JSObject *resultType = FunctionType::GetFunctionInfo(objCodeType)->mReturnType; + jsval result = JSVAL_VOID; + + int errnoStatus; +#if defined(XP_WIN) + int32_t lastErrorStatus; + CDataFinalizer::CallFinalizer(p, &errnoStatus, &lastErrorStatus); +#else + CDataFinalizer::CallFinalizer(p, &errnoStatus, NULL); +#endif // defined(XP_WIN) + + JS_SetReservedSlot(objCTypes, SLOT_ERRNO, INT_TO_JSVAL(errnoStatus)); +#if defined(XP_WIN) + JS_SetReservedSlot(objCTypes, SLOT_LASTERROR, INT_TO_JSVAL(lastErrorStatus)); +#endif // defined(XP_WIN) + + if (ConvertToJS(cx, resultType, NULL, p->rvalue, false, true, &result)) { + CDataFinalizer::Cleanup(p, obj); + JS_SET_RVAL(cx, vp, result); + return true; + } + CDataFinalizer::Cleanup(p, obj); + return false; } /* @@ -6782,7 +6810,7 @@ CDataFinalizer::Finalize(JSFreeOp* fop, JSObject* obj) return; } - CDataFinalizer::CallFinalizer(p, NULL); + CDataFinalizer::CallFinalizer(p, NULL, NULL); CDataFinalizer::Cleanup(p, NULL); } diff --git a/toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp b/toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp index 8d128c3b0dc..82a9adcf6c2 100644 --- a/toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp +++ b/toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp @@ -77,6 +77,16 @@ test_finalizer_rel_size_t_return_size_t(size_t i) return i; } +RECT +test_finalizer_rel_size_t_return_struct_t(size_t i) +{ + if (-- gFinalizerTestResources[i] < 0) { + MOZ_NOT_REACHED("Assertion failed"); + } + const PRInt32 narrowed = (PRInt32)i; + RECT result = { narrowed, narrowed, narrowed, narrowed }; + return result; +} bool test_finalizer_cmp_size_t(size_t a, size_t b) diff --git a/toolkit/components/ctypes/tests/jsctypes-test-finalizer.h b/toolkit/components/ctypes/tests/jsctypes-test-finalizer.h index 452ec2e52c7..cf3df010dea 100644 --- a/toolkit/components/ctypes/tests/jsctypes-test-finalizer.h +++ b/toolkit/components/ctypes/tests/jsctypes-test-finalizer.h @@ -8,7 +8,6 @@ NS_EXTERN_C { - EXPORT_CDECL(void) test_finalizer_start(size_t size); EXPORT_CDECL(void) test_finalizer_stop(); EXPORT_CDECL(bool) test_finalizer_resource_is_acquired(size_t i); @@ -16,6 +15,7 @@ NS_EXTERN_C EXPORT_CDECL(size_t) test_finalizer_acq_size_t(size_t i); EXPORT_CDECL(void) test_finalizer_rel_size_t(size_t i); EXPORT_CDECL(size_t) test_finalizer_rel_size_t_return_size_t(size_t i); + EXPORT_CDECL(RECT) test_finalizer_rel_size_t_return_struct_t(size_t i); EXPORT_CDECL(bool) test_finalizer_cmp_size_t(size_t a, size_t b); EXPORT_CDECL(int32_t) test_finalizer_acq_int32_t(size_t i); diff --git a/toolkit/components/ctypes/tests/unit/head.js b/toolkit/components/ctypes/tests/unit/head.js index fe37c6bfbd3..fd7043d45a6 100644 --- a/toolkit/components/ctypes/tests/unit/head.js +++ b/toolkit/components/ctypes/tests/unit/head.js @@ -45,7 +45,7 @@ function ResourceTester(start, stop) { } ResourceTester.prototype = { launch: function(size, test, args) { - Components.utils.forceGC(); + trigger_gc(); let cleaner = new ResourceCleaner(); this._start(size); try { @@ -55,7 +55,7 @@ ResourceTester.prototype = { this._stop(); throw x; } - Components.utils.forceGC(); + trigger_gc(); cleaner.cleanup(); this._stop(); } diff --git a/toolkit/components/ctypes/tests/unit/test_finalizer.js b/toolkit/components/ctypes/tests/unit/test_finalizer.js index ec0cb35c008..13fdedc2d88 100644 --- a/toolkit/components/ctypes/tests/unit/test_finalizer.js +++ b/toolkit/components/ctypes/tests/unit/test_finalizer.js @@ -13,6 +13,9 @@ function run_test() ctypes.default_abi, ctypes.bool, ctypes.size_t); + let released = function released(value, witness) { + return witness == undefined; + }; let samples = []; samples.push( @@ -31,7 +34,8 @@ function run_test() ctypes.bool, ctypes.size_t, ctypes.size_t), - status: status + status: status, + released: released }); samples.push( { @@ -49,7 +53,8 @@ function run_test() ctypes.bool, ctypes.size_t, ctypes.size_t), - status: status + status: status, + released: released }); samples.push( { @@ -67,7 +72,8 @@ function run_test() ctypes.bool, ctypes.int32_t, ctypes.int32_t), - status: status + status: status, + released: released } ); samples.push( @@ -86,7 +92,8 @@ function run_test() ctypes.bool, ctypes.int64_t, ctypes.int64_t), - status: status + status: status, + released: released } ); samples.push( @@ -105,7 +112,8 @@ function run_test() ctypes.bool, ctypes.void_t.ptr, ctypes.void_t.ptr), - status: status + status: status, + released: released } ); samples.push( @@ -124,7 +132,8 @@ function run_test() ctypes.bool, ctypes.char.ptr, ctypes.char.ptr), - status: status + status: status, + released: released } ); const rect_t = new ctypes.StructType("RECT", @@ -148,7 +157,8 @@ function run_test() ctypes.bool, rect_t, rect_t), - status: status + status: status, + released: released } ); samples.push( @@ -167,12 +177,40 @@ function run_test() ctypes.bool, ctypes.size_t, ctypes.size_t), - status: status + status: status, + released: function released_eq(i, witness) { + return i == witness; + } } ); samples.push( { - name: "null", + name: "size_t, release returns RECT", + acquire: library.declare("test_finalizer_acq_size_t", + ctypes.default_abi, + ctypes.size_t, + ctypes.size_t), + release: library.declare("test_finalizer_rel_size_t_return_struct_t", + ctypes.default_abi, + rect_t, + ctypes.size_t), + compare: library.declare("test_finalizer_cmp_size_t", + ctypes.default_abi, + ctypes.bool, + ctypes.size_t, + ctypes.size_t), + status: status, + released: function released_rect_eq(i, witness) { + return witness.top == i + && witness.bottom == i + && witness.left == i + && witness.right == i; + } + } + ); + samples.push( + { + name: "using null", acquire: library.declare("test_finalizer_acq_null_t", ctypes.default_abi, ctypes.PointerType(ctypes.void_t), @@ -189,18 +227,21 @@ function run_test() ctypes.default_abi, ctypes.bool, ctypes.void_t.ptr, - ctypes.void_t.ptr) + ctypes.void_t.ptr), + released: released } ); let tester = new ResourceTester(start, stop); samples.forEach( - function(sample) { - dump("Executing finalization test for data "+sample.name+"\n"); + function run_sample(sample) { + dump("Executing finalization test for data " + sample.name + "\n"); tester.launch(TEST_SIZE, test_executing_finalizers, sample); tester.launch(TEST_SIZE, test_do_not_execute_finalizers_on_referenced_stuff, sample); tester.launch(TEST_SIZE, test_executing_dispose, sample); tester.launch(TEST_SIZE, test_executing_forget, sample); + tester.launch(TEST_SIZE, test_result_dispose, sample); + dump("Successfully completed finalization test for data " + sample.name + "\n"); } ); @@ -209,6 +250,7 @@ function run_test() * (see bug 727371) tester.launch(TEST_SIZE, test_cycles, samples[0]); */ + dump("Successfully completed all finalization tests\n"); library.close(); } @@ -229,7 +271,7 @@ function test_cycles(size, tc) { do_test_pending(); Components.utils.schedulePreciseGC( - function() { + function after_gc() { // Check that _something_ has been finalized do_check_true(count_finalized(size, tc) > 0); do_test_finished(); @@ -257,7 +299,7 @@ function count_finalized(size, tc) { */ function test_executing_finalizers(size, tc, cleanup) { - dump("test_executing_finalizers\n"); + dump("test_executing_finalizers " + tc.name + "\n"); // Allocate |size| items without references for (let i = 0; i < size; ++i) { cleanup.add(ctypes.CDataFinalizer(tc.acquire(i), tc.release)); @@ -268,6 +310,33 @@ function test_executing_finalizers(size, tc, cleanup) do_check_true(count_finalized(size, tc) > 0); } +/** + * Check that + * - |dispose| returns the proper result + */ +function test_result_dispose(size, tc, cleanup) { + dump("test_result_dispose " + tc.name + "\n"); + let ref = []; + // Allocate |size| items with references + for (let i = 0; i < size; ++i) { + let value = ctypes.CDataFinalizer(tc.acquire(i), tc.release); + cleanup.add(value); + ref.push(value); + } + do_check_eq(count_finalized(size, tc), 0); + + for (i = 0; i < size; ++i) { + let witness = ref[i].dispose(); + ref[i] = null; + if (!tc.released(i, witness)) { + do_print("test_result_dispose failure at index "+i); + do_check_true(false); + } + } + + do_check_eq(count_finalized(size, tc), size); +} + /** * Check that From c7443b0f63508b3a6ffd361a271ca343fce0efac Mon Sep 17 00:00:00 2001 From: Masatoshi Kimura Date: Tue, 24 Apr 2012 19:50:00 -0400 Subject: [PATCH 072/182] Bug 744910 - Remove FileException from workers. r=bent --- dom/base/nsDOMException.cpp | 5 +- dom/base/nsDOMException.h | 3 +- dom/bindings/Utils.h | 5 +- dom/workers/Exceptions.cpp | 225 ++++++-------------------------- dom/workers/Exceptions.h | 16 --- dom/workers/File.cpp | 18 +-- dom/workers/FileReaderSync.cpp | 11 +- dom/workers/WorkerPrivate.cpp | 4 +- dom/workers/Workers.h | 8 ++ dom/workers/XMLHttpRequest.cpp | 119 +++++++---------- dom/workers/test/xhr2_worker.js | 30 +++++ 11 files changed, 152 insertions(+), 292 deletions(-) diff --git a/dom/base/nsDOMException.cpp b/dom/base/nsDOMException.cpp index 8782eab0dcf..4a70382b42d 100644 --- a/dom/base/nsDOMException.cpp +++ b/dom/base/nsDOMException.cpp @@ -177,7 +177,7 @@ NSResultToNameAndMessage(nsresult aNSResult, nsresult NS_GetNameAndMessageForDOMNSResult(nsresult aNSResult, const char** aName, - const char** aMessage) + const char** aMessage, PRUint16* aCode) { const char* name = nsnull; const char* message = nsnull; @@ -187,6 +187,9 @@ NS_GetNameAndMessageForDOMNSResult(nsresult aNSResult, const char** aName, if (name && message) { *aName = name; *aMessage = message; + if (aCode) { + *aCode = code; + } return NS_OK; } diff --git a/dom/base/nsDOMException.h b/dom/base/nsDOMException.h index 677925d254e..57a0c6f8d20 100644 --- a/dom/base/nsDOMException.h +++ b/dom/base/nsDOMException.h @@ -64,7 +64,8 @@ protected: nsresult NS_GetNameAndMessageForDOMNSResult(nsresult aNSResult, const char** aName, - const char** aMessage); + const char** aMessage, + PRUint16* aCode = nsnull); #define DECL_INTERNAL_DOM_EXCEPTION(domname) \ nsresult \ diff --git a/dom/bindings/Utils.h b/dom/bindings/Utils.h index f2db75b0cad..e5b4be1f0d7 100644 --- a/dom/bindings/Utils.h +++ b/dom/bindings/Utils.h @@ -8,6 +8,7 @@ #define mozilla_dom_bindings_Utils_h__ #include "mozilla/dom/bindings/DOMJSClass.h" +#include "mozilla/dom/workers/Workers.h" #include "jsapi.h" #include "jsfriendapi.h" @@ -25,12 +26,14 @@ template inline bool Throw(JSContext* cx, nsresult rv) { + using mozilla::dom::workers::exceptions::ThrowDOMExceptionForNSResult; + // XXX Introduce exception machinery. if (mainThread) { XPCThrower::Throw(rv, cx); } else { if (!JS_IsExceptionPending(cx)) { - JS_ReportError(cx, "Exception thrown (nsresult = %x).", rv); + ThrowDOMExceptionForNSResult(cx, rv); } } return false; diff --git a/dom/workers/Exceptions.cpp b/dom/workers/Exceptions.cpp index 70d78b4e0de..f7103e70943 100644 --- a/dom/workers/Exceptions.cpp +++ b/dom/workers/Exceptions.cpp @@ -43,6 +43,7 @@ #include "jsfriendapi.h" #include "jsprf.h" #include "mozilla/Util.h" +#include "nsDOMException.h" #include "nsTraceRefcnt.h" #include "WorkerInlines.h" @@ -68,6 +69,7 @@ class DOMException : public PrivatizableBase enum SLOT { SLOT_code = 0, SLOT_name, + SLOT_message, SLOT_COUNT }; @@ -87,7 +89,7 @@ public: } static JSObject* - Create(JSContext* aCx, int aCode); + Create(JSContext* aCx, nsresult aNSResult); private: DOMException() @@ -131,18 +133,23 @@ private: return false; } - char buf[100]; - JS_snprintf(buf, sizeof(buf), "%s: ", sClass.name); + jsval name = JS_GetReservedSlot(obj, SLOT_name); + JS_ASSERT(name.isString()); - JSString* classString = JS_NewStringCopyZ(aCx, buf); - if (!classString) { + JSString *colon = JS_NewStringCopyN(aCx, ": ", 2); + if (!colon){ return false; } - jsval name = JS_GetReservedSlot(obj, SLOT_name); - JS_ASSERT(JSVAL_IS_STRING(name)); + JSString* out = JS_ConcatStrings(aCx, name.toString(), colon); + if (!out) { + return false; + } - JSString* out = JS_ConcatStrings(aCx, classString, JSVAL_TO_STRING(name)); + jsval message = JS_GetReservedSlot(obj, SLOT_message); + JS_ASSERT(message.isString()); + + out = JS_ConcatStrings(aCx, out, message.toString()); if (!out) { return false; } @@ -190,6 +197,7 @@ JSClass DOMException::sClass = { JSPropertySpec DOMException::sProperties[] = { { "code", SLOT_code, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub }, { "name", SLOT_name, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub }, + { "message", SLOT_message, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub }, { 0, 0, 0, NULL, NULL } }; @@ -203,9 +211,6 @@ JSPropertySpec DOMException::sStaticProperties[] = { #define EXCEPTION_ENTRY(_name) \ { #_name, _name, CONSTANT_FLAGS, GetConstant, NULL }, - // Make sure this one is always first. - EXCEPTION_ENTRY(UNKNOWN_ERR) - EXCEPTION_ENTRY(INDEX_SIZE_ERR) EXCEPTION_ENTRY(DOMSTRING_SIZE_ERR) EXCEPTION_ENTRY(HIERARCHY_REQUEST_ERR) @@ -239,32 +244,35 @@ JSPropertySpec DOMException::sStaticProperties[] = { // static JSObject* -DOMException::Create(JSContext* aCx, int aCode) +DOMException::Create(JSContext* aCx, nsresult aNSResult) { JSObject* obj = JS_NewObject(aCx, &sClass, NULL, NULL); if (!obj) { return NULL; } - size_t foundIndex = size_t(-1); - for (size_t index = 0; index < ArrayLength(sStaticProperties) - 1; index++) { - if (sStaticProperties[index].tinyid == aCode) { - foundIndex = index; - break; - } - } - - if (foundIndex == size_t(-1)) { - foundIndex = 0; - } - - JSString* name = JS_NewStringCopyZ(aCx, sStaticProperties[foundIndex].name); - if (!name) { + const char* name; + const char* message; + uint16_t code; + if (NS_FAILED(NS_GetNameAndMessageForDOMNSResult(aNSResult, &name, &message, + &code))) { + JS_ReportError(aCx, "Exception thrown (nsresult = 0x%x).", aNSResult); return NULL; } - JS_SetReservedSlot(obj, SLOT_code, INT_TO_JSVAL(aCode)); - JS_SetReservedSlot(obj, SLOT_name, STRING_TO_JSVAL(name)); + JSString* jsname = JS_NewStringCopyZ(aCx, name); + if (!jsname) { + return NULL; + } + + JSString* jsmessage = JS_NewStringCopyZ(aCx, message); + if (!jsmessage) { + return NULL; + } + + JS_SetReservedSlot(obj, SLOT_code, INT_TO_JSVAL(code)); + JS_SetReservedSlot(obj, SLOT_name, STRING_TO_JSVAL(jsname)); + JS_SetReservedSlot(obj, SLOT_message, STRING_TO_JSVAL(jsmessage)); DOMException* priv = new DOMException(); SetJSPrivateSafeish(obj, priv); @@ -272,147 +280,6 @@ DOMException::Create(JSContext* aCx, int aCode) return obj; } -class FileException : public PrivatizableBase -{ - static JSClass sClass; - static JSPropertySpec sProperties[]; - static JSPropertySpec sStaticProperties[]; - - enum SLOT { - SLOT_code = 0, - SLOT_name, - - SLOT_COUNT - }; - -public: - static JSObject* - InitClass(JSContext* aCx, JSObject* aObj) - { - return JS_InitClass(aCx, aObj, NULL, &sClass, Construct, 0, sProperties, - NULL, sStaticProperties, NULL); - } - - static JSObject* - Create(JSContext* aCx, int aCode); - -private: - FileException() - { - MOZ_COUNT_CTOR(mozilla::dom::workers::exceptions::FileException); - } - - ~FileException() - { - MOZ_COUNT_DTOR(mozilla::dom::workers::exceptions::FileException); - } - - static JSBool - Construct(JSContext* aCx, unsigned aArgc, jsval* aVp) - { - JS_ReportErrorNumber(aCx, js_GetErrorMessage, NULL, JSMSG_WRONG_CONSTRUCTOR, - sClass.name); - return false; - } - - static void - Finalize(JSFreeOp* aFop, JSObject* aObj) - { - JS_ASSERT(JS_GetClass(aObj) == &sClass); - delete GetJSPrivateSafeish(aObj); - } - - static JSBool - GetProperty(JSContext* aCx, JSObject* aObj, jsid aIdval, jsval* aVp) - { - JS_ASSERT(JSID_IS_INT(aIdval)); - - int32 slot = JSID_TO_INT(aIdval); - - JSClass* classPtr = JS_GetClass(aObj); - - if (classPtr != &sClass || !GetJSPrivateSafeish(aObj)) { - JS_ReportErrorNumber(aCx, js_GetErrorMessage, NULL, - JSMSG_INCOMPATIBLE_PROTO, sClass.name, - sProperties[slot].name, classPtr->name); - return false; - } - - *aVp = JS_GetReservedSlot(aObj, slot); - return true; - } - - static JSBool - GetConstant(JSContext* aCx, JSObject* aObj, jsid idval, jsval* aVp) - { - JS_ASSERT(JSID_IS_INT(idval)); - *aVp = INT_TO_JSVAL(JSID_TO_INT(idval)); - return true; - } -}; - -JSClass FileException::sClass = { - "FileException", - JSCLASS_HAS_PRIVATE | JSCLASS_HAS_RESERVED_SLOTS(SLOT_COUNT), - JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, - JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, Finalize -}; - -JSPropertySpec FileException::sProperties[] = { - { "code", SLOT_code, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub }, - { "name", SLOT_name, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub }, - { 0, 0, 0, NULL, NULL } -}; - -JSPropertySpec FileException::sStaticProperties[] = { - -#define EXCEPTION_ENTRY(_name) \ - { #_name, FILE_##_name, CONSTANT_FLAGS, GetConstant, NULL }, - - EXCEPTION_ENTRY(NOT_FOUND_ERR) - EXCEPTION_ENTRY(SECURITY_ERR) - EXCEPTION_ENTRY(ABORT_ERR) - EXCEPTION_ENTRY(NOT_READABLE_ERR) - EXCEPTION_ENTRY(ENCODING_ERR) - -#undef EXCEPTION_ENTRY - - { 0, 0, 0, NULL, NULL } -}; - -// static -JSObject* -FileException::Create(JSContext* aCx, int aCode) -{ - JSObject* obj = JS_NewObject(aCx, &sClass, NULL, NULL); - if (!obj) { - return NULL; - } - - size_t foundIndex = size_t(-1); - for (size_t index = 0; index < ArrayLength(sStaticProperties) - 1; index++) { - if (sStaticProperties[index].tinyid == aCode) { - foundIndex = index; - break; - } - } - - JS_ASSERT(foundIndex != size_t(-1)); - - JSString* name = JS_NewStringCopyZ(aCx, sStaticProperties[foundIndex].name); - if (!name) { - return NULL; - } - - JS_SetReservedSlot(obj, SLOT_code, INT_TO_JSVAL(aCode)); - JS_SetReservedSlot(obj, SLOT_name, STRING_TO_JSVAL(name)); - - FileException* priv = new FileException(); - SetJSPrivateSafeish(obj, priv); - - return obj; -} - } // anonymous namespace BEGIN_WORKERS_NAMESPACE @@ -422,24 +289,16 @@ namespace exceptions { bool InitClasses(JSContext* aCx, JSObject* aGlobal) { - return DOMException::InitClass(aCx, aGlobal) && - FileException::InitClass(aCx, aGlobal); + return DOMException::InitClass(aCx, aGlobal); } void -ThrowDOMExceptionForCode(JSContext* aCx, int aCode) +ThrowDOMExceptionForNSResult(JSContext* aCx, nsresult aNSResult) { - JSObject* exception = DOMException::Create(aCx, aCode); - JS_ASSERT(exception); - - JS_SetPendingException(aCx, OBJECT_TO_JSVAL(exception)); -} - -void -ThrowFileExceptionForCode(JSContext* aCx, int aCode) -{ - JSObject* exception = FileException::Create(aCx, aCode); - JS_ASSERT(exception); + JSObject* exception = DOMException::Create(aCx, aNSResult); + if (!exception) { + return; + } JS_SetPendingException(aCx, OBJECT_TO_JSVAL(exception)); } diff --git a/dom/workers/Exceptions.h b/dom/workers/Exceptions.h index c83608c8b83..75839816d73 100644 --- a/dom/workers/Exceptions.h +++ b/dom/workers/Exceptions.h @@ -71,16 +71,6 @@ #define INVALID_NODE_TYPE_ERR 24 #define DATA_CLONE_ERR 25 -// This one isn't actually spec'd anywhere, use it when we can't find a match. -#define UNKNOWN_ERR 0 - -// FileException Codes -#define FILE_NOT_FOUND_ERR 1 -#define FILE_SECURITY_ERR 2 -#define FILE_ABORT_ERR 3 -#define FILE_NOT_READABLE_ERR 4 -#define FILE_ENCODING_ERR 5 - BEGIN_WORKERS_NAMESPACE namespace exceptions { @@ -88,12 +78,6 @@ namespace exceptions { bool InitClasses(JSContext* aCx, JSObject* aGlobal); -void -ThrowDOMExceptionForCode(JSContext* aCx, int aCode); - -void -ThrowFileExceptionForCode(JSContext* aCx, int aCode); - } // namespace exceptions END_WORKERS_NAMESPACE diff --git a/dom/workers/File.cpp b/dom/workers/File.cpp index 96a96911ac0..b895863072b 100644 --- a/dom/workers/File.cpp +++ b/dom/workers/File.cpp @@ -41,6 +41,7 @@ #include "nsIDOMFile.h" #include "nsDOMBlobBuilder.h" +#include "nsDOMError.h" #include "jsapi.h" #include "jsatom.h" @@ -58,8 +59,7 @@ USING_WORKERS_NAMESPACE -using mozilla::dom::workers::exceptions::ThrowDOMExceptionForCode; -using mozilla::dom::workers::exceptions::ThrowFileExceptionForCode; +using mozilla::dom::workers::exceptions::ThrowDOMExceptionForNSResult; namespace { @@ -125,9 +125,7 @@ private: nsresult rv = file->InitInternal(aCx, aArgc, JS_ARGV(aCx, aVp), Unwrap); if (NS_FAILED(rv)) { - ThrowDOMExceptionForCode(aCx, - NS_ERROR_GET_MODULE(rv) == NS_ERROR_MODULE_DOM ? - NS_ERROR_GET_CODE(rv) : UNKNOWN_ERR); + ThrowDOMExceptionForNSResult(aCx, rv); return false; } @@ -159,7 +157,8 @@ private: PRUint64 size; if (NS_FAILED(blob->GetSize(&size))) { - ThrowFileExceptionForCode(aCx, FILE_NOT_READABLE_ERR); + ThrowDOMExceptionForNSResult(aCx, NS_ERROR_DOM_FILE_NOT_READABLE_ERR); + return false; } if (!JS_NewNumberValue(aCx, double(size), aVp)) { @@ -179,7 +178,8 @@ private: nsString type; if (NS_FAILED(blob->GetType(type))) { - ThrowFileExceptionForCode(aCx, FILE_NOT_READABLE_ERR); + ThrowDOMExceptionForNSResult(aCx, NS_ERROR_DOM_FILE_NOT_READABLE_ERR); + return false; } JSString* jsType = JS_NewUCStringCopyN(aCx, type.get(), type.Length()); @@ -223,7 +223,7 @@ private: static_cast(end), contentType, optionalArgc, getter_AddRefs(rtnBlob)))) { - ThrowFileExceptionForCode(aCx, FILE_NOT_READABLE_ERR); + ThrowDOMExceptionForNSResult(aCx, NS_ERROR_DOM_FILE_NOT_READABLE_ERR); return false; } @@ -350,7 +350,7 @@ private: if (GetWorkerPrivateFromContext(aCx)->UsesSystemPrincipal() && NS_FAILED(file->GetMozFullPathInternal(fullPath))) { - ThrowFileExceptionForCode(aCx, FILE_NOT_READABLE_ERR); + ThrowDOMExceptionForNSResult(aCx, NS_ERROR_DOM_FILE_NOT_READABLE_ERR); return false; } diff --git a/dom/workers/FileReaderSync.cpp b/dom/workers/FileReaderSync.cpp index fc19d9f6ee6..55c3485f8c4 100644 --- a/dom/workers/FileReaderSync.cpp +++ b/dom/workers/FileReaderSync.cpp @@ -40,6 +40,7 @@ #include "FileReaderSync.h" #include "nsIDOMFile.h" +#include "nsDOMError.h" #include "jsapi.h" #include "jsatom.h" @@ -56,7 +57,7 @@ USING_WORKERS_NAMESPACE -using mozilla::dom::workers::exceptions::ThrowFileExceptionForCode; +using mozilla::dom::workers::exceptions::ThrowDOMExceptionForNSResult; namespace { @@ -67,10 +68,10 @@ EnsureSucceededOrThrow(JSContext* aCx, nsresult rv) return true; } - int code = rv == NS_ERROR_FILE_NOT_FOUND ? - FILE_NOT_FOUND_ERR : - FILE_NOT_READABLE_ERR; - ThrowFileExceptionForCode(aCx, code); + rv = rv == NS_ERROR_FILE_NOT_FOUND ? + NS_ERROR_DOM_FILE_NOT_FOUND_ERR : + NS_ERROR_DOM_FILE_NOT_READABLE_ERR; + ThrowDOMExceptionForNSResult(aCx, rv); return false; } diff --git a/dom/workers/WorkerPrivate.cpp b/dom/workers/WorkerPrivate.cpp index a1390d5b608..22e2608bab3 100644 --- a/dom/workers/WorkerPrivate.cpp +++ b/dom/workers/WorkerPrivate.cpp @@ -100,7 +100,7 @@ using mozilla::MutexAutoLock; using mozilla::TimeDuration; using mozilla::TimeStamp; -using mozilla::dom::workers::exceptions::ThrowDOMExceptionForCode; +using mozilla::dom::workers::exceptions::ThrowDOMExceptionForNSResult; USING_WORKERS_NAMESPACE using namespace mozilla::dom::workers::events; @@ -415,7 +415,7 @@ struct WorkerStructuredCloneCallbacks static void Error(JSContext* aCx, uint32_t /* aErrorId */) { - ThrowDOMExceptionForCode(aCx, DATA_CLONE_ERR); + ThrowDOMExceptionForNSResult(aCx, NS_ERROR_DOM_DATA_CLONE_ERR); } }; diff --git a/dom/workers/Workers.h b/dom/workers/Workers.h index 2f3aff8c91d..947a3541c1d 100644 --- a/dom/workers/Workers.h +++ b/dom/workers/Workers.h @@ -97,6 +97,14 @@ GetWorkerCrossThreadDispatcher(JSContext* aCx, jsval aWorker); // Random unique constant to facilitate JSPrincipal debugging const uint32_t kJSPrincipalsDebugToken = 0x7e2df9d2; +namespace exceptions { + +// Implemented in Exceptions.cpp +void +ThrowDOMExceptionForNSResult(JSContext* aCx, nsresult aNSResult); + +} // namespace exceptions + END_WORKERS_NAMESPACE #endif // mozilla_dom_workers_workers_h__ diff --git a/dom/workers/XMLHttpRequest.cpp b/dom/workers/XMLHttpRequest.cpp index 58fd37bbd3a..8a4018275d0 100644 --- a/dom/workers/XMLHttpRequest.cpp +++ b/dom/workers/XMLHttpRequest.cpp @@ -34,7 +34,7 @@ USING_WORKERS_NAMESPACE namespace XMLHttpRequestResponseTypeValues = mozilla::dom::bindings::prototypes::XMLHttpRequestResponseType; -using mozilla::dom::workers::exceptions::ThrowDOMExceptionForCode; +using mozilla::dom::workers::exceptions::ThrowDOMExceptionForNSResult; // XXX Need to figure this out... #define UNCATCHABLE_EXCEPTION NS_ERROR_OUT_OF_MEMORY @@ -214,21 +214,6 @@ END_WORKERS_NAMESPACE namespace { -inline int -GetDOMExceptionCodeFromResult(nsresult aResult) -{ - if (NS_SUCCEEDED(aResult)) { - return 0; - } - - if (NS_ERROR_GET_MODULE(aResult) == NS_ERROR_MODULE_DOM) { - return NS_ERROR_GET_CODE(aResult); - } - - NS_WARNING("Update main thread implementation for a DOM error code here!"); - return INVALID_STATE_ERR; -} - inline void ConvertResponseTypeToString(XMLHttpRequestResponseType aType, nsString& aString) { @@ -783,11 +768,11 @@ private: class ResponseRunnable : public MainThreadProxyRunnable { PRUint32 mSyncQueueKey; - int mErrorCode; + nsresult mErrorCode; public: ResponseRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, - PRUint32 aSyncQueueKey, int aErrorCode) + PRUint32 aSyncQueueKey, nsresult aErrorCode) : MainThreadProxyRunnable(aWorkerPrivate, SkipWhenClearing, aProxy), mSyncQueueKey(aSyncQueueKey), mErrorCode(aErrorCode) { @@ -797,8 +782,8 @@ private: bool WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) { - if (mErrorCode) { - ThrowDOMExceptionForCode(aCx, mErrorCode); + if (NS_FAILED(mErrorCode)) { + ThrowDOMExceptionForNSResult(aCx, mErrorCode); aWorkerPrivate->StopSyncLoop(mSyncQueueKey, false); } else { @@ -836,7 +821,7 @@ public: return true; } - virtual int + virtual nsresult MainThreadRun() = 0; NS_IMETHOD @@ -847,7 +832,7 @@ public: PRUint32 oldSyncQueueKey = mProxy->mSyncEventResponseSyncQueueKey; mProxy->mSyncEventResponseSyncQueueKey = mSyncQueueKey; - int rv = MainThreadRun(); + nsresult rv = MainThreadRun(); nsRefPtr response = new ResponseRunnable(mWorkerPrivate, mProxy, mSyncQueueKey, rv); @@ -871,7 +856,7 @@ public: MOZ_ASSERT(aProxy); } - virtual int + virtual nsresult MainThreadRun() { AssertIsOnMainThread(); @@ -892,10 +877,10 @@ public: : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mValue(aValue) { } - int + nsresult MainThreadRun() { - return GetDOMExceptionCodeFromResult(mProxy->mXHR->SetMultipart(mValue)); + return mProxy->mXHR->SetMultipart(mValue); } }; @@ -909,11 +894,10 @@ public: : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mValue(aValue) { } - int + nsresult MainThreadRun() { - nsresult rv = mProxy->mXHR->SetMozBackgroundRequest(mValue); - return GetDOMExceptionCodeFromResult(rv); + return mProxy->mXHR->SetMozBackgroundRequest(mValue); } }; @@ -927,11 +911,10 @@ public: : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mValue(aValue) { } - int + nsresult MainThreadRun() { - nsresult rv = mProxy->mXHR->SetWithCredentials(mValue); - return GetDOMExceptionCodeFromResult(rv); + return mProxy->mXHR->SetWithCredentials(mValue); } }; @@ -946,7 +929,7 @@ public: mResponseType(aResponseType) { } - int + nsresult MainThreadRun() { nsresult rv = mProxy->mXHR->SetResponseType(mResponseType); @@ -954,7 +937,7 @@ public: if (NS_SUCCEEDED(rv)) { rv = mProxy->mXHR->GetResponseType(mResponseType); } - return GetDOMExceptionCodeFromResult(rv); + return rv; } void @@ -974,10 +957,10 @@ public: mTimeout(aTimeout) { } - int + nsresult MainThreadRun() { - return GetDOMExceptionCodeFromResult(mProxy->mXHR->SetTimeout(mTimeout)); + return mProxy->mXHR->SetTimeout(mTimeout); } }; @@ -988,7 +971,7 @@ public: : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy) { } - int + nsresult MainThreadRun() { mProxy->mInnerEventStreamId++; @@ -1002,7 +985,7 @@ public: mProxy->Reset(); - return 0; + return NS_OK; } }; @@ -1017,11 +1000,11 @@ public: mResponseHeaders(aResponseHeaders) { } - int + nsresult MainThreadRun() { mProxy->mXHR->GetAllResponseHeaders(mResponseHeaders); - return 0; + return NS_OK; } }; @@ -1037,11 +1020,10 @@ public: mValue(aValue) { } - int + nsresult MainThreadRun() { - nsresult rv = mProxy->mXHR->GetResponseHeader(mHeader, mValue); - return GetDOMExceptionCodeFromResult(rv); + return mProxy->mXHR->GetResponseHeader(mHeader, mValue); } }; @@ -1068,53 +1050,45 @@ public: mTimeout(aTimeout) { } - int + nsresult MainThreadRun() { WorkerPrivate* oldWorker = mProxy->mWorkerPrivate; mProxy->mWorkerPrivate = mWorkerPrivate; - int retval = MainThreadRunInternal(); + nsresult rv = MainThreadRunInternal(); mProxy->mWorkerPrivate = oldWorker; - return retval; + return rv; } - int + nsresult MainThreadRunInternal() { if (!mProxy->Init()) { - return INVALID_STATE_ERR; + return NS_ERROR_DOM_INVALID_STATE_ERR; } nsresult rv; if (mMultipart) { rv = mProxy->mXHR->SetMultipart(mMultipart); - if (NS_FAILED(rv)) { - return GetDOMExceptionCodeFromResult(rv); - } + NS_ENSURE_SUCCESS(rv, rv); } if (mBackgroundRequest) { rv = mProxy->mXHR->SetMozBackgroundRequest(mBackgroundRequest); - if (NS_FAILED(rv)) { - return GetDOMExceptionCodeFromResult(rv); - } + NS_ENSURE_SUCCESS(rv, rv); } if (mWithCredentials) { rv = mProxy->mXHR->SetWithCredentials(mWithCredentials); - if (NS_FAILED(rv)) { - return GetDOMExceptionCodeFromResult(rv); - } + NS_ENSURE_SUCCESS(rv, rv); } if (mTimeout) { rv = mProxy->mXHR->SetTimeout(mTimeout); - if (NS_FAILED(rv)) { - return GetDOMExceptionCodeFromResult(rv); - } + NS_ENSURE_SUCCESS(rv, rv); } NS_ASSERTION(!mProxy->mInOpen, "Reentrancy is bad!"); @@ -1129,7 +1103,7 @@ public: rv = mProxy->mXHR->SetResponseType(NS_LITERAL_STRING("text")); } - return GetDOMExceptionCodeFromResult(rv); + return rv; } }; @@ -1154,7 +1128,7 @@ public: mClonedObjects.SwapElements(aClonedObjects); } - int + nsresult MainThreadRun() { nsCOMPtr variant; @@ -1164,7 +1138,7 @@ public: nsIXPConnect* xpc = nsContentUtils::XPConnect(); NS_ASSERTION(xpc, "This should never be null!"); - int error = 0; + nsresult rv = NS_OK; JSStructuredCloneCallbacks* callbacks = mWorkerPrivate->IsChromeWorker() ? @@ -1175,24 +1149,22 @@ public: if (mBody.read(cx, &body, callbacks, &mClonedObjects)) { if (NS_FAILED(xpc->JSValToVariant(cx, &body, getter_AddRefs(variant)))) { - error = INVALID_STATE_ERR; + rv = NS_ERROR_DOM_INVALID_STATE_ERR; } } else { - error = DATA_CLONE_ERR; + rv = NS_ERROR_DOM_DATA_CLONE_ERR; } mBody.clear(); mClonedObjects.Clear(); - if (error) { - return error; - } + NS_ENSURE_SUCCESS(rv, rv); } else { nsCOMPtr wvariant = do_CreateInstance(NS_VARIANT_CONTRACTID); - NS_ENSURE_TRUE(wvariant, UNKNOWN_ERR); + NS_ENSURE_TRUE(wvariant, NS_ERROR_UNEXPECTED); if (NS_FAILED(wvariant->SetAsAString(mStringBody))) { NS_ERROR("This should never fail!"); @@ -1229,7 +1201,7 @@ public: } } - return GetDOMExceptionCodeFromResult(rv); + return rv; } }; @@ -1245,11 +1217,10 @@ public: mValue(aValue) { } - int + nsresult MainThreadRun() { - nsresult rv = mProxy->mXHR->SetRequestHeader(mHeader, mValue); - return GetDOMExceptionCodeFromResult(rv); + return mProxy->mXHR->SetRequestHeader(mHeader, mValue); } }; @@ -1263,11 +1234,11 @@ public: : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mMimeType(aMimeType) { } - int + nsresult MainThreadRun() { mProxy->mXHR->OverrideMimeType(mMimeType); - return 0; + return NS_OK; } }; diff --git a/dom/workers/test/xhr2_worker.js b/dom/workers/test/xhr2_worker.js index 1d9e0ed5a83..18924a15a4e 100644 --- a/dom/workers/test/xhr2_worker.js +++ b/dom/workers/test/xhr2_worker.js @@ -66,6 +66,16 @@ onmessage = function(event) { throw new Error("Failed to throw when getting responseText on '" + type + "' type"); } + + if (exception.name != "InvalidStateError") { + throw new Error("Unexpected error when getting responseText on '" + type + + "' type"); + } + + if (exception.code != DOMException.INVALID_STATE_ERR) { + throw new Error("Unexpected error code when getting responseText on '" + type + + "' type"); + } } testResponseTextException("arraybuffer"); @@ -102,6 +112,16 @@ onmessage = function(event) { "calling open()"); } + if (exception.name != "InvalidStateError") { + throw new Error("Unexpected error when setting responseType before " + + "calling open()"); + } + + if (exception.code != DOMException.INVALID_STATE_ERR) { + throw new Error("Unexpected error code when setting responseType before " + + "calling open()"); + } + xhr.open("GET", url); xhr.responseType = "text"; xhr.onload = function(event) { @@ -152,4 +172,14 @@ onmessage = function(event) { throw new Error("Failed to throw when setting responseType after " + "calling send()"); } + + if (exception.name != "InvalidStateError") { + throw new Error("Unexpected error when setting responseType after " + + "calling send()"); + } + + if (exception.code != DOMException.INVALID_STATE_ERR) { + throw new Error("Unexpected error code when setting responseType after " + + "calling send()"); + } } From 172a842ffa3ed57af538b85f8aea1fc91de271a4 Mon Sep 17 00:00:00 2001 From: Glenn Randers-Pehrson Date: Tue, 24 Apr 2012 19:50:00 -0400 Subject: [PATCH 073/182] Bug 745178 - Update libpng to version 1.5.10. r=joe --HG-- rename : media/libpng/libpng.txt => media/libpng/libpng-manual.txt --- media/libpng/CHANGES | 50 +- media/libpng/LICENSE | 4 +- media/libpng/MOZCHANGES | 2 + media/libpng/README | 2 +- .../libpng/{libpng.txt => libpng-manual.txt} | 36 +- media/libpng/png.c | 30 +- media/libpng/png.h | 76 +-- media/libpng/pngconf.h | 6 +- media/libpng/pngget.c | 2 +- media/libpng/pngpread.c | 561 +----------------- media/libpng/pngpriv.h | 58 +- media/libpng/pngread.c | 21 +- media/libpng/pngrtran.c | 13 +- media/libpng/pngrutil.c | 19 +- media/libpng/pngset.c | 37 +- media/libpng/pngstruct.h | 15 +- media/libpng/pngtrans.c | 107 +++- media/libpng/pngwrite.c | 17 +- media/libpng/pngwutil.c | 19 +- 19 files changed, 410 insertions(+), 665 deletions(-) rename media/libpng/{libpng.txt => libpng-manual.txt} (99%) diff --git a/media/libpng/CHANGES b/media/libpng/CHANGES index 301b80c7182..70af8273e71 100644 --- a/media/libpng/CHANGES +++ b/media/libpng/CHANGES @@ -3803,13 +3803,57 @@ Version 1.5.9beta02 [February 16, 2012] Removed tests for no-longer-used *_EMPTY_PLTE_SUPPORTED from pngstruct.h Version 1.5.9rc01 [February 17, 2012] - Fixed CVE-2011-3026 buffer overrun bug. Deal more correctly with the test - on iCCP chunk length. Also removed spurious casts that may hide problems - on 16-bit systems. + Fixed CVE-2011-3026 buffer overrun bug. This bug was introduced when + iCCP chunk support was added at libpng-1.0.6. Deal more correctly with the + test on iCCP chunk length. Also removed spurious casts that may hide + problems on 16-bit systems. Version 1.5.9 [February 18, 2012] No changes. +Version 1.5.10beta01 [February 24, 2012] + Removed two useless #ifdef directives from pngread.c and one from pngrutil.c + Always put the CMAKE_LIBRARY in "lib" (removed special WIN32 case). + Removed empty vstudio/pngstest directory (Clifford Yapp). + Eliminated redundant png_push_read_tEXt|zTXt|iTXt|unknown code from + pngpread.c and use the sequential png_handle_tEXt, etc., in pngrutil.c; + now that png_ptr->buffer is inaccessible to applications, the special + handling is no longer useful. + Fixed bug with png_handle_hIST with odd chunk length (Frank Busse). + Added PNG_SAFE_LIMITS feature to pnglibconf.dfa and code in pngconf.h + to reset the user limits to safe ones if PNG_SAFE_LIMITS is defined. + To enable, use "CPPFLAGS=-DPNG_SAFE_LIMITS_SUPPORTED" on the configure + command or put "#define PNG_SAFE_LIMITS_SUPPORTED" in pnglibconf.h. + Revised the SAFE_LIMITS feature to be the same as the feature in libpng16. + Added information about the new limits in the manual. + +Version 1.5.10beta02 [February 27, 2012] + Updated Makefile.in + +Version 1.5.10beta03 [March 6, 2012] + Removed unused "current_text" members of png_struct and the png_free() + of png_ptr->current_text from pngread.c + Added palette-index checking. Issue a png_warning() if an invalid index is + found. + +Version 1.5.10beta04 [March 10, 2012] + Fixed PNG_LIBPNG_BUILD_BASE_TYPE definition. + Fixed CMF optimization of non-IDAT compressed chunks, which was added at + libpng-1.5.4. It sometimes produced too small of a window. + +Version 1.5.10beta05 [March 10, 2012] + Reject all iCCP chunks after the first, even if the first one is invalid. + Issue a png_benign_error() instead of png_warning() about bad palette index. + Fixed an off-by-one error in the palette index checking function. + Revised example.c to put text strings in a temporary character array + instead of directly assigning string constants to png_textp members. + This avoids compiler warnings when -Wwrite-strings is enabled. + +Version 1.5.10 [March 29, 2012] + Prevent PNG_EXPAND+PNG_SHIFT doing the shift twice. + Revised png_set_text_2() to avoid potential memory corruption (fixes + CVE-2011-3048). + Send comments/corrections/commendations to png-mng-implement at lists.sf.net (subscription required; visit https://lists.sourceforge.net/lists/listinfo/png-mng-implement diff --git a/media/libpng/LICENSE b/media/libpng/LICENSE index dd43d3bf2c4..b72d1258e3a 100644 --- a/media/libpng/LICENSE +++ b/media/libpng/LICENSE @@ -10,7 +10,7 @@ this sentence. This code is released under the libpng license. -libpng versions 1.2.6, August 15, 2004, through 1.5.9, February 18, 2012, are +libpng versions 1.2.6, August 15, 2004, through 1.5.10, March 29, 2012, are Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are distributed according to the same disclaimer and license as libpng-1.2.5 with the following individual added to the list of Contributing Authors @@ -108,4 +108,4 @@ certification mark of the Open Source Initiative. Glenn Randers-Pehrson glennrp at users.sourceforge.net -February 18, 2012 +March 29, 2012 diff --git a/media/libpng/MOZCHANGES b/media/libpng/MOZCHANGES index 8c7cfebc658..11bf41fd905 100644 --- a/media/libpng/MOZCHANGES +++ b/media/libpng/MOZCHANGES @@ -1,6 +1,8 @@ Changes made to pristine png source by mozilla.org developers. +2012/04/13 -- Synced with libpng-1.5.10 (bug #745178). + 2012/02/19 -- Synced with libpng-1.5.9 (bug #648690). 2011/07/20 -- Synced with libpng-1.4.8 (bug #669863). diff --git a/media/libpng/README b/media/libpng/README index ac682fecc55..e821ee4c878 100644 --- a/media/libpng/README +++ b/media/libpng/README @@ -1,4 +1,4 @@ -README for libpng version 1.5.9 - February 18, 2012 (shared library 15.0) +README for libpng version 1.5.10 - March 29, 2012 (shared library 15.0) See the note about version numbers near the top of png.h See INSTALL for instructions on how to install libpng. diff --git a/media/libpng/libpng.txt b/media/libpng/libpng-manual.txt similarity index 99% rename from media/libpng/libpng.txt rename to media/libpng/libpng-manual.txt index 7a66f1d5c28..d55e80a009c 100644 --- a/media/libpng/libpng.txt +++ b/media/libpng/libpng-manual.txt @@ -1,6 +1,6 @@ libpng-manual.txt - A description on how to use and modify libpng - libpng version 1.5.9 - February 18, 2012 + libpng version 1.5.10 - March 29, 2012 Updated and distributed by Glenn Randers-Pehrson Copyright (c) 1998-2011 Glenn Randers-Pehrson @@ -11,7 +11,7 @@ libpng-manual.txt - A description on how to use and modify libpng Based on: - libpng versions 0.97, January 1998, through 1.5.9 - February 18, 2012 + libpng versions 0.97, January 1998, through 1.5.10 - March 29, 2012 Updated and distributed by Glenn Randers-Pehrson Copyright (c) 1998-2011 Glenn Randers-Pehrson @@ -4142,6 +4142,16 @@ X. Changes to Libpng from version 1.4.x to 1.5.x From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the function) incorrectly returned a value of type png_uint_32. +Checking for invalid palette index on read or write was added at libpng +1.5.10. When an invalid index is found, libpng issues a benign error. +This is enabled by default but can be disabled in each png_ptr with + + png_set_check_for_invalid_index(png_ptr, allowed); + + allowed - one of + 0: disable + 1: enable + A. Changes that affect users of libpng There are no substantial API changes between the non-deprecated parts of @@ -4260,6 +4270,20 @@ PNG_USER_WIDTH_MAX and PNG_USER_HEIGHT_MAX, although this document said that it could be used to override them. Now this function will reduce or increase the limits. +Starting in libpng-1.5.10, the user limits can be set en masse with the +configuration option PNG_SAFE_LIMITS_SUPPORTED. If this option is enabled, +a set of "safe" limits is applied in pngpriv.h. These can be overridden by +application calls to png_set_user_limits(), png_set_user_chunk_cache_max(), +and/or png_set_user_malloc_max() that increase or decrease the limits. Also, +in libpng-1.5.10 the default width and height limits were increased +from 1,000,000 to 0x7ffffff (i.e., made unlimited). Therefore, the +limits are now + default safe + png_user_width_max 0x7fffffff 1,000,000 + png_user_height_max 0x7fffffff 1,000,000 + png_user_chunk_cache_max 0 (unlimited) 128 + png_user_chunk_malloc_max 0 (unlimited) 8,000,000 + B. Changes to the build and configuration of libpng Details of internal changes to the library code can be found in the CHANGES @@ -4545,8 +4569,8 @@ above the comment that says /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ To avoid polluting the global namespace, the names of all exported -functions and variables begin with "png_", and all publicly visible C -preprocessor macros begin with "PNG_". We request that applications that +functions and variables begin with "png_", and all publicly visible C +preprocessor macros begin with "PNG". We request that applications that use libpng *not* begin any of their own symbols with either of these strings. We put a space after each comma and after each semicolon @@ -4573,13 +4597,13 @@ Other rules can be inferred by inspecting the libpng source. XIV. Y2K Compliance in libpng -February 18, 2012 +March 29, 2012 Since the PNG Development group is an ad-hoc body, we can't make an official declaration. This is your unofficial assurance that libpng from version 0.71 and -upward through 1.5.9 are Y2K compliant. It is my belief that earlier +upward through 1.5.10 are Y2K compliant. It is my belief that earlier versions were also Y2K compliant. Libpng only has three year fields. One is a 2-byte unsigned integer that diff --git a/media/libpng/png.c b/media/libpng/png.c index ca1de48664e..cba18ba915e 100644 --- a/media/libpng/png.c +++ b/media/libpng/png.c @@ -1,8 +1,8 @@ /* png.c - location for general purpose libpng functions * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.10 [March 8, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -14,7 +14,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_5_9 Your_png_h_is_not_version_1_5_9; +typedef png_libpng_version_1_5_10 Your_png_h_is_not_version_1_5_10; /* Tells libpng that we have already handled the first "num_bytes" bytes * of the PNG file signature. If the PNG data is embedded into another @@ -655,13 +655,13 @@ png_get_copyright(png_const_structp png_ptr) #else # ifdef __STDC__ return PNG_STRING_NEWLINE \ - "libpng version 1.5.9 - February 18, 2012" PNG_STRING_NEWLINE \ + "libpng version 1.5.10 - March 29, 2012" PNG_STRING_NEWLINE \ "Copyright (c) 1998-2011 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \ PNG_STRING_NEWLINE; # else - return "libpng version 1.5.9 - February 18, 2012\ + return "libpng version 1.5.10 - March 29, 2012\ Copyright (c) 1998-2011 Glenn Randers-Pehrson\ Copyright (c) 1996-1997 Andreas Dilger\ Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc."; @@ -1467,7 +1467,7 @@ static double png_pow10(int power) { int recip = 0; - double d = 1; + double d = 1.0; /* Handle negative exponent with a reciprocal at the end because * 10 is exact whereas .1 is inexact in base 2 @@ -1481,7 +1481,7 @@ png_pow10(int power) if (power > 0) { /* Decompose power bitwise. */ - double mult = 10; + double mult = 10.0; do { if (power & 1) d *= mult; @@ -1600,7 +1600,8 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, { double d; - fp *= 10; + fp *= 10.0; + /* Use modf here, not floor and subtract, so that * the separation is done in one step. At the end * of the loop don't break the number into parts so @@ -1613,7 +1614,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, { d = floor(fp + .5); - if (d > 9) + if (d > 9.0) { /* Rounding up to 10, handle that here. */ if (czero > 0) @@ -1621,9 +1622,10 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, --czero, d = 1; if (cdigits == 0) --clead; } + else { - while (cdigits > 0 && d > 9) + while (cdigits > 0 && d > 9.0) { int ch = *--ascii; @@ -1648,7 +1650,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, * exponent but take into account the leading * decimal point. */ - if (d > 9) /* cdigits == 0 */ + if (d > 9.0) /* cdigits == 0 */ { if (exp_b10 == (-1)) { @@ -1669,18 +1671,19 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, ++exp_b10; /* In all cases we output a '1' */ - d = 1; + d = 1.0; } } } fp = 0; /* Guarantees termination below. */ } - if (d == 0) + if (d == 0.0) { ++czero; if (cdigits == 0) ++clead; } + else { /* Included embedded zeros in the digit count. */ @@ -1708,6 +1711,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, above */ --exp_b10; } + *ascii++ = (char)(48 + (int)d), ++cdigits; } } diff --git a/media/libpng/png.h b/media/libpng/png.h index 7630b2de38f..b0b81ad1d5b 100644 --- a/media/libpng/png.h +++ b/media/libpng/png.h @@ -1,7 +1,7 @@ /* png.h - header file for PNG reference library * - * libpng version 1.5.9 - February 18, 2012 + * libpng version 1.5.10 - March 29, 2012 * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -11,7 +11,7 @@ * Authors and maintainers: * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger - * libpng versions 0.97, January 1998, through 1.5.9 - February 18, 2012: Glenn + * libpng versions 0.97, January 1998, through 1.5.10 - March 29, 2012: Glenn * See also "Contributing Authors", below. * * Note about libpng version numbers: @@ -172,6 +172,8 @@ * 1.5.9beta01-02 15 10509 15.so.15.9[.0] * 1.5.9rc01 15 10509 15.so.15.9[.0] * 1.5.9 15 10509 15.so.15.9[.0] + * 1.5.10beta01-05 15 10510 15.so.15.10[.0] + * 1.5.10 15 10510 15.so.15.10[.0] * * Henceforth the source version will match the shared-library major * and minor numbers; the shared-library major version number will be @@ -181,7 +183,7 @@ * to the source version x.y.z (leading zeros in y and z). Beta versions * were given the previous public release number plus a letter, until * version 1.0.6j; from then on they were given the upcoming public - * release number plus "betaNN" or "rcN". + * release number plus "betaNN" or "rcNN". * * Binary incompatibility exists only when applications make direct access * to the info_ptr or png_ptr members through png.h, and the compiled @@ -203,7 +205,7 @@ * * This code is released under the libpng license. * - * libpng versions 1.2.6, August 15, 2004, through 1.5.9, February 18, 2012, are + * libpng versions 1.2.6, August 15, 2004, through 1.5.10, March 29, 2012, are * Copyright (c) 2004, 2006-2012 Glenn Randers-Pehrson, and are * distributed according to the same disclaimer and license as libpng-1.2.5 * with the following individual added to the list of Contributing Authors: @@ -315,13 +317,13 @@ * Y2K compliance in libpng: * ========================= * - * February 18, 2012 + * March 29, 2012 * * Since the PNG Development group is an ad-hoc body, we can't make * an official declaration. * * This is your unofficial assurance that libpng from version 0.71 and - * upward through 1.5.9 are Y2K compliant. It is my belief that + * upward through 1.5.10 are Y2K compliant. It is my belief that * earlier versions were also Y2K compliant. * * Libpng only has two year fields. One is a 2-byte unsigned integer @@ -379,9 +381,9 @@ */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.5.9" +#define PNG_LIBPNG_VER_STRING "1.5.10" #define PNG_HEADER_VERSION_STRING \ - " libpng version 1.5.9 - February 18, 2012\n" + " libpng version 1.5.10 - March 29, 2012\n" #define PNG_LIBPNG_VER_SONUM 15 #define PNG_LIBPNG_VER_DLLNUM 15 @@ -389,7 +391,7 @@ /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 5 -#define PNG_LIBPNG_VER_RELEASE 9 +#define PNG_LIBPNG_VER_RELEASE 10 /* This should match the numeric part of the final component of * PNG_LIBPNG_VER_STRING, omitting any leading zero: @@ -412,7 +414,7 @@ #define PNG_LIBPNG_BUILD_SPECIAL 32 /* Cannot be OR'ed with PNG_LIBPNG_BUILD_PRIVATE */ -#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_BETA +#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_STABLE /* Careful here. At one time, Guy wanted to use 082, but that would be octal. * We must not include leading zeros. @@ -420,7 +422,7 @@ * version 1.0.0 was mis-numbered 100 instead of 10000). From * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release */ -#define PNG_LIBPNG_VER 10509 /* 1.5.9 */ +#define PNG_LIBPNG_VER 10510 /* 1.5.10 */ #ifndef MOZPNGCONF_H # include "mozpngconf.h" @@ -547,7 +549,7 @@ extern "C" { /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char* png_libpng_version_1_5_9; +typedef char* png_libpng_version_1_5_10; /* Three color definitions. The order of the red, green, and blue, (and the * exact size) is not important, although the size of the fields need to @@ -2650,71 +2652,77 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); : (png_int_32)png_get_uint_32(buf))) #endif +#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ + defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) +PNG_EXPORT(234, void, png_set_check_for_invalid_index, (png_structp png_ptr, + int allowed)); +#endif + #ifdef PNG_APNG_SUPPORTED -PNG_EXPORT(234, png_uint_32, png_get_acTL, (png_structp png_ptr, +PNG_EXPORT(235, png_uint_32, png_get_acTL, (png_structp png_ptr, png_infop info_ptr, png_uint_32 *num_frames, png_uint_32 *num_plays)); -PNG_EXPORT(235, png_uint_32, png_set_acTL, (png_structp png_ptr, +PNG_EXPORT(236, png_uint_32, png_set_acTL, (png_structp png_ptr, png_infop info_ptr, png_uint_32 num_frames, png_uint_32 num_plays)); -PNG_EXPORT(236, png_uint_32, png_get_num_frames, (png_structp png_ptr, +PNG_EXPORT(237, png_uint_32, png_get_num_frames, (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(237, png_uint_32, png_get_num_plays, (png_structp png_ptr, +PNG_EXPORT(238, png_uint_32, png_get_num_plays, (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(238, png_uint_32, png_get_next_frame_fcTL, +PNG_EXPORT(239, png_uint_32, png_get_next_frame_fcTL, (png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, png_uint_32 *x_offset, png_uint_32 *y_offset, png_uint_16 *delay_num, png_uint_16 *delay_den, png_byte *dispose_op, png_byte *blend_op)); -PNG_EXPORT(239, png_uint_32, png_set_next_frame_fcTL, +PNG_EXPORT(240, png_uint_32, png_set_next_frame_fcTL, (png_structp png_ptr, png_infop info_ptr, png_uint_32 width, png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset, png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, png_byte blend_op)); -PNG_EXPORT(240, png_uint_32, png_get_next_frame_width, +PNG_EXPORT(241, png_uint_32, png_get_next_frame_width, (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(241, png_uint_32, png_get_next_frame_height, +PNG_EXPORT(242, png_uint_32, png_get_next_frame_height, (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(242, png_uint_32, png_get_next_frame_x_offset, +PNG_EXPORT(243, png_uint_32, png_get_next_frame_x_offset, (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(243, png_uint_32, png_get_next_frame_y_offset, +PNG_EXPORT(244, png_uint_32, png_get_next_frame_y_offset, (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(244, png_uint_16, png_get_next_frame_delay_num, +PNG_EXPORT(245, png_uint_16, png_get_next_frame_delay_num, (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(245, png_uint_16, png_get_next_frame_delay_den, +PNG_EXPORT(246, png_uint_16, png_get_next_frame_delay_den, (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(246, png_byte, png_get_next_frame_dispose_op, +PNG_EXPORT(247, png_byte, png_get_next_frame_dispose_op, (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(247, png_byte, png_get_next_frame_blend_op, +PNG_EXPORT(248, png_byte, png_get_next_frame_blend_op, (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(248, png_byte, png_get_first_frame_is_hidden, +PNG_EXPORT(249, png_byte, png_get_first_frame_is_hidden, (png_structp png_ptr, png_infop info_ptr)); -PNG_EXPORT(249, png_uint_32, png_set_first_frame_is_hidden, +PNG_EXPORT(250, png_uint_32, png_set_first_frame_is_hidden, (png_structp png_ptr, png_infop info_ptr, png_byte is_hidden)); #ifdef PNG_READ_APNG_SUPPORTED -PNG_EXPORT(250, void, png_read_frame_head, (png_structp png_ptr, +PNG_EXPORT(251, void, png_read_frame_head, (png_structp png_ptr, png_infop info_ptr)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_EXPORT(251, void, png_set_progressive_frame_fn, (png_structp png_ptr, +PNG_EXPORT(252, void, png_set_progressive_frame_fn, (png_structp png_ptr, png_progressive_frame_ptr frame_info_fn, png_progressive_frame_ptr frame_end_fn)); #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #endif /* PNG_READ_APNG_SUPPORTED */ #ifdef PNG_WRITE_APNG_SUPPORTED -PNG_EXPORT(252, void, png_write_frame_head, (png_structp png_ptr, +PNG_EXPORT(253, void, png_write_frame_head, (png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers, png_uint_32 width, png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset, png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, png_byte blend_op)); -PNG_EXPORT(253, void, png_write_frame_tail, (png_structp png_ptr, +PNG_EXPORT(254, void, png_write_frame_tail, (png_structp png_ptr, png_infop info_ptr)); #endif /* PNG_WRITE_APNG_SUPPORTED */ #endif /* PNG_APNG_SUPPORTED */ @@ -2729,9 +2737,9 @@ PNG_EXPORT(253, void, png_write_frame_tail, (png_structp png_ptr, */ #ifdef PNG_EXPORT_LAST_ORDINAL #ifdef PNG_APNG_SUPPORTED - PNG_EXPORT_LAST_ORDINAL(253); + PNG_EXPORT_LAST_ORDINAL(254); #else - PNG_EXPORT_LAST_ORDINAL(233); + PNG_EXPORT_LAST_ORDINAL(234); #endif /* PNG_APNG_SUPPORTED */ #endif diff --git a/media/libpng/pngconf.h b/media/libpng/pngconf.h index 1aa268beef5..bbb547f8eb9 100644 --- a/media/libpng/pngconf.h +++ b/media/libpng/pngconf.h @@ -1,7 +1,7 @@ /* pngconf.h - machine configurable file for libpng * - * libpng version 1.5.9 - February 18, 2012 + * libpng version 1.5.10 - March 29, 2012 * * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) @@ -51,8 +51,8 @@ /* This controls optimization of the reading of 16 and 32 bit values * from PNG files. It can be set on a per-app-file basis - it - * just changes whether a macro is used to the function is called. - * The library builder sets the default, if read functions are not + * just changes whether a macro is used when the function is called. + * The library builder sets the default; if read functions are not * built into the library the macro implementation is forced on. */ #ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED diff --git a/media/libpng/pngget.c b/media/libpng/pngget.c index cfa0da315f6..70e8185ab37 100644 --- a/media/libpng/pngget.c +++ b/media/libpng/pngget.c @@ -1172,7 +1172,7 @@ png_get_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr, if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_fcTL) && width != NULL && height != NULL && - x_offset != NULL && x_offset != NULL && + x_offset != NULL && y_offset != NULL && delay_num != NULL && delay_den != NULL && dispose_op != NULL && blend_op != NULL) { diff --git a/media/libpng/pngpread.c b/media/libpng/pngpread.c index c6e328a7f84..b26d2b12f7c 100644 --- a/media/libpng/pngpread.c +++ b/media/libpng/pngpread.c @@ -2,7 +2,7 @@ /* pngpread.c - read a png file in push mode * * Last changed in libpng 1.5.9 [February 18, 2012] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -128,30 +128,6 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr) break; } -#ifdef PNG_READ_tEXt_SUPPORTED - case PNG_READ_tEXt_MODE: - { - png_push_read_tEXt(png_ptr, info_ptr); - break; - } - -#endif -#ifdef PNG_READ_zTXt_SUPPORTED - case PNG_READ_zTXt_MODE: - { - png_push_read_zTXt(png_ptr, info_ptr); - break; - } - -#endif -#ifdef PNG_READ_iTXt_SUPPORTED - case PNG_READ_iTXt_MODE: - { - png_push_read_iTXt(png_ptr, info_ptr); - break; - } - -#endif case PNG_SKIP_MODE: { png_push_crc_finish(png_ptr); @@ -176,7 +152,7 @@ void /* PRIVATE */ png_push_read_sig(png_structp png_ptr, png_infop info_ptr) { png_size_t num_checked = png_ptr->sig_bytes, - num_to_check = 8 - num_checked; + num_to_check = 8 - num_checked; if (png_ptr->buffer_size < num_to_check) { @@ -196,6 +172,7 @@ png_push_read_sig(png_structp png_ptr, png_infop info_ptr) else png_error(png_ptr, "PNG file corrupted by ASCII conversion"); } + else { if (png_ptr->sig_bytes >= 8) @@ -650,7 +627,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) return; } - png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); + png_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); } #endif @@ -663,7 +640,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) return; } - png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); + png_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); } #endif @@ -676,7 +653,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) return; } - png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); + png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); } #endif @@ -710,7 +687,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) png_push_save_buffer(png_ptr); return; } - png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); + png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); } png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; @@ -750,6 +727,7 @@ png_push_crc_finish(png_structp png_ptr) png_ptr->save_buffer_size -= save_size; png_ptr->save_buffer_ptr += save_size; } + if (png_ptr->skip_length && png_ptr->current_buffer_size) { png_size_t save_size = png_ptr->current_buffer_size; @@ -771,6 +749,7 @@ png_push_crc_finish(png_structp png_ptr) png_ptr->current_buffer_size -= save_size; png_ptr->current_buffer_ptr += save_size; } + if (!png_ptr->skip_length) { if (png_ptr->buffer_size < 4) @@ -793,6 +772,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) return; ptr = buffer; + if (png_ptr->save_buffer_size) { png_size_t save_size; @@ -810,6 +790,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) png_ptr->save_buffer_size -= save_size; png_ptr->save_buffer_ptr += save_size; } + if (length && png_ptr->current_buffer_size) { png_size_t save_size; @@ -839,6 +820,7 @@ png_push_save_buffer(png_structp png_ptr) png_bytep dp; istop = png_ptr->save_buffer_size; + for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; i < istop; i++, sp++, dp++) { @@ -846,6 +828,7 @@ png_push_save_buffer(png_structp png_ptr) } } } + if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > png_ptr->save_buffer_max) { @@ -872,6 +855,7 @@ png_push_save_buffer(png_structp png_ptr) png_free(png_ptr, old_buffer); png_ptr->save_buffer_max = new_max; } + if (png_ptr->current_buffer_size) { png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, @@ -879,6 +863,7 @@ png_push_save_buffer(png_structp png_ptr) png_ptr->save_buffer_size += png_ptr->current_buffer_size; png_ptr->current_buffer_size = 0; } + png_ptr->save_buffer_ptr = png_ptr->save_buffer; png_ptr->buffer_size = 0; } @@ -1031,6 +1016,7 @@ png_push_read_IDAT(png_structp png_ptr) png_ptr->current_buffer_size -= save_size; png_ptr->current_buffer_ptr += save_size; } + if (!png_ptr->idat_size) { if (png_ptr->buffer_size < 4) @@ -1444,521 +1430,6 @@ png_read_push_finish_row(png_structp png_ptr) #endif /* PNG_READ_INTERLACING_SUPPORTED */ } -#ifdef PNG_READ_tEXt_SUPPORTED -void /* PRIVATE */ -png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ - png_error(png_ptr, "Out of place tEXt"); - /* NOT REACHED */ - } - -#ifdef PNG_MAX_MALLOC_64K - png_ptr->skip_length = 0; /* This may not be necessary */ - - if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ - { - png_warning(png_ptr, "tEXt chunk too large to fit in memory"); - png_ptr->skip_length = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, length + 1); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_tEXt_MODE; -} - -void /* PRIVATE */ -png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - - else - text_size = png_ptr->current_text_left; - - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp text; - png_charp key; - int ret; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - -#ifdef PNG_MAX_MALLOC_64K - if (png_ptr->skip_length) - return; -#endif - - key = png_ptr->current_text; - - for (text = key; *text; text++) - /* Empty loop */ ; - - if (text < key + png_ptr->current_text_size) - text++; - - text_ptr = (png_textp)png_malloc(png_ptr, png_sizeof(png_text)); - text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; - text_ptr->key = key; - text_ptr->itxt_length = 0; - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; - text_ptr->text = text; - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, key); - png_free(png_ptr, text_ptr); - png_ptr->current_text = NULL; - - if (ret) - png_warning(png_ptr, "Insufficient memory to store text chunk"); - } -} -#endif - -#ifdef PNG_READ_zTXt_SUPPORTED -void /* PRIVATE */ -png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ - png_error(png_ptr, "Out of place zTXt"); - /* NOT REACHED */ - } - -#ifdef PNG_MAX_MALLOC_64K - /* We can't handle zTXt chunks > 64K, since we don't have enough space - * to be able to store the uncompressed data. Actually, the threshold - * is probably around 32K, but it isn't as definite as 64K is. - */ - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "zTXt chunk too large to fit in memory"); - png_push_crc_skip(png_ptr, length); - return; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, length + 1); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_zTXt_MODE; -} - -void /* PRIVATE */ -png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - - else - text_size = png_ptr->current_text_left; - - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp text; - png_charp key; - int ret; - png_size_t text_size, key_size; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - - key = png_ptr->current_text; - - for (text = key; *text; text++) - /* Empty loop */ ; - - /* zTXt can't have zero text */ - if (text >= key + png_ptr->current_text_size) - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - return; - } - - text++; - - if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */ - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - return; - } - - text++; - - png_ptr->zstream.next_in = (png_bytep)text; - png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - - (text - key)); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - - key_size = text - key; - text_size = 0; - text = NULL; - ret = Z_STREAM_END; - - while (png_ptr->zstream.avail_in) - { - ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); - if (ret != Z_OK && ret != Z_STREAM_END) - { - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - png_ptr->current_text = NULL; - png_free(png_ptr, key); - png_free(png_ptr, text); - return; - } - - if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) - { - if (text == NULL) - { - text = (png_charp)png_malloc(png_ptr, - (png_ptr->zbuf_size - - png_ptr->zstream.avail_out + key_size + 1)); - - png_memcpy(text + key_size, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - - png_memcpy(text, key, key_size); - - text_size = key_size + png_ptr->zbuf_size - - png_ptr->zstream.avail_out; - - *(text + text_size) = '\0'; - } - - else - { - png_charp tmp; - - tmp = text; - text = (png_charp)png_malloc(png_ptr, text_size + - (png_ptr->zbuf_size - - png_ptr->zstream.avail_out + 1)); - - png_memcpy(text, tmp, text_size); - png_free(png_ptr, tmp); - - png_memcpy(text + text_size, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - - text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; - *(text + text_size) = '\0'; - } - - if (ret != Z_STREAM_END) - { - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - } - } - else - { - break; - } - - if (ret == Z_STREAM_END) - break; - } - - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - - if (ret != Z_STREAM_END) - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - png_free(png_ptr, text); - return; - } - - png_ptr->current_text = NULL; - png_free(png_ptr, key); - key = text; - text += key_size; - - text_ptr = (png_textp)png_malloc(png_ptr, - png_sizeof(png_text)); - text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; - text_ptr->key = key; - text_ptr->itxt_length = 0; - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; - text_ptr->text = text; - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, key); - png_free(png_ptr, text_ptr); - - if (ret) - png_warning(png_ptr, "Insufficient memory to store text chunk"); - } -} -#endif - -#ifdef PNG_READ_iTXt_SUPPORTED -void /* PRIVATE */ -png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ - png_error(png_ptr, "Out of place iTXt"); - /* NOT REACHED */ - } - -#ifdef PNG_MAX_MALLOC_64K - png_ptr->skip_length = 0; /* This may not be necessary */ - - if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ - { - png_warning(png_ptr, "iTXt chunk too large to fit in memory"); - png_ptr->skip_length = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, length + 1); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_iTXt_MODE; -} - -void /* PRIVATE */ -png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) -{ - - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - - else - text_size = png_ptr->current_text_left; - - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp key; - int comp_flag; - png_charp lang; - png_charp lang_key; - png_charp text; - int ret; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - -#ifdef PNG_MAX_MALLOC_64K - if (png_ptr->skip_length) - return; -#endif - - key = png_ptr->current_text; - - for (lang = key; *lang; lang++) - /* Empty loop */ ; - - if (lang < key + png_ptr->current_text_size - 3) - lang++; - - comp_flag = *lang++; - lang++; /* Skip comp_type, always zero */ - - for (lang_key = lang; *lang_key; lang_key++) - /* Empty loop */ ; - - lang_key++; /* Skip NUL separator */ - - text=lang_key; - - if (lang_key < key + png_ptr->current_text_size - 1) - { - for (; *text; text++) - /* Empty loop */ ; - } - - if (text < key + png_ptr->current_text_size) - text++; - - text_ptr = (png_textp)png_malloc(png_ptr, - png_sizeof(png_text)); - - text_ptr->compression = comp_flag + 2; - text_ptr->key = key; - text_ptr->lang = lang; - text_ptr->lang_key = lang_key; - text_ptr->text = text; - text_ptr->text_length = 0; - text_ptr->itxt_length = png_strlen(text); - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_ptr->current_text = NULL; - - png_free(png_ptr, text_ptr); - if (ret) - png_warning(png_ptr, "Insufficient memory to store iTXt chunk"); - } -} -#endif - -/* This function is called when we haven't found a handler for this - * chunk. If there isn't a problem with the chunk itself (ie a bad chunk - * name or a critical chunk), the chunk is (currently) silently ignored. - */ -void /* PRIVATE */ -png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - png_uint_32 skip = 0; - png_uint_32 chunk_name = png_ptr->chunk_name; - - if (PNG_CHUNK_CRITICAL(chunk_name)) - { -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED - if (png_chunk_unknown_handling(png_ptr, chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS -#ifdef PNG_READ_USER_CHUNKS_SUPPORTED - && png_ptr->read_user_chunk_fn == NULL -#endif - ) -#endif - png_chunk_error(png_ptr, "unknown critical chunk"); - - PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ - } - -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED - /* TODO: the code below is apparently just using the - * png_struct::unknown_chunk member as a temporarily variable, it should be - * possible to eliminate both it and the temporary buffer. - */ - if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) - { -#ifdef PNG_MAX_MALLOC_64K - if (length > 65535) - { - png_warning(png_ptr, "unknown chunk too large to fit in memory"); - skip = length - 65535; - length = 65535; - } -#endif - /* This is just a record for the user; libpng doesn't use the character - * form of the name. - */ - PNG_CSTRING_FROM_CHUNK(png_ptr->unknown_chunk.name, png_ptr->chunk_name); - - png_ptr->unknown_chunk.size = length; - - if (length == 0) - png_ptr->unknown_chunk.data = NULL; - - else - { - png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, - png_ptr->unknown_chunk.size); - png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, - png_ptr->unknown_chunk.size); - } - -#ifdef PNG_READ_USER_CHUNKS_SUPPORTED - if (png_ptr->read_user_chunk_fn != NULL) - { - /* Callback to user unknown chunk handler */ - int ret; - ret = (*(png_ptr->read_user_chunk_fn)) - (png_ptr, &png_ptr->unknown_chunk); - - if (ret < 0) - png_chunk_error(png_ptr, "error in user chunk"); - - if (ret == 0) - { - if (PNG_CHUNK_CRITICAL(png_ptr->chunk_name)) - if (png_chunk_unknown_handling(png_ptr, chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS) - png_chunk_error(png_ptr, "unknown critical chunk"); - png_set_unknown_chunks(png_ptr, info_ptr, - &png_ptr->unknown_chunk, 1); - } - } - - else -#endif - png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); - png_free(png_ptr, png_ptr->unknown_chunk.data); - png_ptr->unknown_chunk.data = NULL; - } - - else -#endif - skip=length; - png_push_crc_skip(png_ptr, skip); -} - void /* PRIVATE */ png_push_have_info(png_structp png_ptr, png_infop info_ptr) { diff --git a/media/libpng/pngpriv.h b/media/libpng/pngpriv.h index 3e3a3022a57..4f00a79f867 100644 --- a/media/libpng/pngpriv.h +++ b/media/libpng/pngpriv.h @@ -2,11 +2,11 @@ /* pngpriv.h - private declarations for use inside libpng * * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * - * Last changed in libpng 1.5.7 [December 15, 2011] + * Last changed in libpng 1.5.10 [March 29, 2012] * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer @@ -133,6 +133,46 @@ # define PNG_DLL_EXPORT #endif +/* SECURITY and SAFETY: + * + * By default libpng is built without any internal limits on image size, + * individual heap (png_malloc) allocations or the total amount of memory used. + * If PNG_SAFE_LIMITS_SUPPORTED is defined, however, the limits below are used + * (unless individually overridden). These limits are believed to be fairly + * safe, but builders of secure systems should verify the values against the + * real system capabilities. + */ + +#ifdef PNG_SAFE_LIMITS_SUPPORTED + /* 'safe' limits */ +# ifndef PNG_USER_WIDTH_MAX +# define PNG_USER_WIDTH_MAX 1000000 +# endif +# ifndef PNG_USER_HEIGHT_MAX +# define PNG_USER_HEIGHT_MAX 1000000 +# endif +# ifndef PNG_USER_CHUNK_CACHE_MAX +# define PNG_USER_CHUNK_CACHE_MAX 128 +# endif +# ifndef PNG_USER_CHUNK_MALLOC_MAX +# define PNG_USER_CHUNK_MALLOC_MAX 8000000 +# endif +#else + /* values for no limits */ +# ifndef PNG_USER_WIDTH_MAX +# define PNG_USER_WIDTH_MAX 0x7fffffff +# endif +# ifndef PNG_USER_HEIGHT_MAX +# define PNG_USER_HEIGHT_MAX 0x7fffffff +# endif +# ifndef PNG_USER_CHUNK_CACHE_MAX +# define PNG_USER_CHUNK_CACHE_MAX 0 +# endif +# ifndef PNG_USER_CHUNK_MALLOC_MAX +# define PNG_USER_CHUNK_MALLOC_MAX 0 +# endif +#endif + /* This is used for 16 bit gamma tables - only the top level pointers are const, * this could be changed: */ @@ -426,9 +466,10 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; #define PNG_BACKGROUND_IS_GRAY 0x800 #define PNG_HAVE_PNG_SIGNATURE 0x1000 #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ +#define PNG_HAVE_iCCP 0x4000 #ifdef PNG_APNG_SUPPORTED -#define PNG_HAVE_acTL 0x4000 -#define PNG_HAVE_fcTL 0x8000 +#define PNG_HAVE_acTL 0x8000 +#define PNG_HAVE_fcTL 0x10000 #endif /* Flags for the transformations the PNG library does on the image data */ @@ -1231,10 +1272,8 @@ PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); -#endif PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, png_uint_32 chunk_name)); @@ -1407,6 +1446,13 @@ PNG_EXTERN void png_check_IHDR PNGARG((png_structp png_ptr, int color_type, int interlace_type, int compression_type, int filter_type)); +/* Added at libpng version 1.5.10 */ +#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ + defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) +PNG_EXTERN void png_do_check_palette_indexes PNGARG((png_structp png_ptr, + png_row_infop row_info)); +#endif + /* Free all memory used by the read (old method - NOT DLL EXPORTED) */ PNG_EXTERN void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr)); diff --git a/media/libpng/pngread.c b/media/libpng/pngread.c index 03a845bbb49..be310dcdf04 100644 --- a/media/libpng/pngread.c +++ b/media/libpng/pngread.c @@ -1,8 +1,8 @@ /* pngread.c - read a PNG file * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.10 [March 8, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -67,15 +67,11 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, png_ptr->user_width_max = PNG_USER_WIDTH_MAX; png_ptr->user_height_max = PNG_USER_HEIGHT_MAX; -# ifdef PNG_USER_CHUNK_CACHE_MAX /* Added at libpng-1.2.43 and 1.4.0 */ png_ptr->user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX; -# endif -# ifdef PNG_SET_USER_CHUNK_MALLOC_MAX /* Added at libpng-1.2.43 and 1.4.1 */ png_ptr->user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX; -# endif #endif #ifdef PNG_SETJMP_SUPPORTED @@ -922,6 +918,13 @@ png_read_end(png_structp png_ptr, png_infop info_ptr) png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */ +#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED + /* Report invalid palette index; added at libng-1.5.10 */ + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + png_ptr->num_palette_max > png_ptr->num_palette) + png_benign_error(png_ptr, "Read palette index exceeding num_palette"); +#endif + do { png_uint_32 length = png_read_chunk_header(png_ptr); @@ -1196,12 +1199,6 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_free(png_ptr, png_ptr->save_buffer); #endif -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -#ifdef PNG_TEXT_SUPPORTED - png_free(png_ptr, png_ptr->current_text); -#endif /* PNG_TEXT_SUPPORTED */ -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - /* Save the important info out of the png_struct, in case it is * being used again. */ diff --git a/media/libpng/pngrtran.c b/media/libpng/pngrtran.c index 1079595f0af..55618528602 100644 --- a/media/libpng/pngrtran.c +++ b/media/libpng/pngrtran.c @@ -1,8 +1,8 @@ /* pngrtran.c - transforms the data in a row for PNG readers * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.10 [March 8, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -1830,12 +1830,15 @@ png_init_read_transformations(png_structp png_ptr) #ifdef PNG_READ_SHIFT_SUPPORTED if ((png_ptr->transformations & PNG_SHIFT) && + !(png_ptr->transformations & PNG_EXPAND) && (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) { int i; int istop = png_ptr->num_palette; int shift = 8 - png_ptr->sig_bit.red; + png_ptr->transformations &= ~PNG_SHIFT; + /* significant bits can be in the range 1 to 7 for a meaninful result, if * the number of significant bits is 0 then no shift is done (this is an * error condition which is silently ignored.) @@ -2296,6 +2299,12 @@ png_do_read_transformations(png_structp png_ptr, png_row_infop row_info) png_do_unpack(row_info, png_ptr->row_buf + 1); #endif +#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED + /* Added at libpng-1.5.10 */ + if (row_info->color_type == PNG_COLOR_TYPE_PALETTE) + png_do_check_palette_indexes(png_ptr, row_info); +#endif + #ifdef PNG_READ_BGR_SUPPORTED if (png_ptr->transformations & PNG_BGR) png_do_bgr(row_info, png_ptr->row_buf + 1); diff --git a/media/libpng/pngrutil.c b/media/libpng/pngrutil.c index 2e389393358..1c522bfa851 100644 --- a/media/libpng/pngrutil.c +++ b/media/libpng/pngrutil.c @@ -1,7 +1,7 @@ /* pngrutil.c - utilities to read a PNG file * - * Last changed in libpng 1.5.9 [February 18, 2012] + * Last changed in libpng 1.5.10 [March 8, 2012] * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -434,14 +434,12 @@ png_decompress_chunk(png_structp png_ptr, int comp_type, */ if (prefix_size >= (~(png_size_t)0) - 1 || expanded_size >= (~(png_size_t)0) - 1 - prefix_size -#ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED +#ifdef PNG_USER_LIMITS_SUPPORTED || (png_ptr->user_chunk_malloc_max && (prefix_size + expanded_size >= png_ptr->user_chunk_malloc_max - 1)) #else -# ifdef PNG_USER_CHUNK_MALLOC_MAX || ((PNG_USER_CHUNK_MALLOC_MAX > 0) && prefix_size + expanded_size >= PNG_USER_CHUNK_MALLOC_MAX - 1) -# endif #endif ) png_warning(png_ptr, "Exceeded size limit while expanding chunk"); @@ -1264,13 +1262,16 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Out of place iCCP chunk"); - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)) + if ((png_ptr->mode & PNG_HAVE_iCCP) || (info_ptr != NULL && + (info_ptr->valid & (PNG_INFO_iCCP|PNG_INFO_sRGB)))) { png_warning(png_ptr, "Duplicate iCCP chunk"); png_crc_finish(png_ptr, length); return; } + png_ptr->mode |= PNG_HAVE_iCCP; + #ifdef PNG_MAX_MALLOC_64K if (length > (png_uint_32)65535L) { @@ -1800,16 +1801,16 @@ png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - num = length / 2 ; - - if (num != (unsigned int)png_ptr->num_palette || num > - (unsigned int)PNG_MAX_PALETTE_LENGTH) + if (length > 2*PNG_MAX_PALETTE_LENGTH || + length != (unsigned int) (2*png_ptr->num_palette)) { png_warning(png_ptr, "Incorrect hIST chunk length"); png_crc_finish(png_ptr, length); return; } + num = length / 2 ; + for (i = 0; i < num; i++) { png_byte buf[2]; diff --git a/media/libpng/pngset.c b/media/libpng/pngset.c index e4cb7352257..9d5fc453bec 100644 --- a/media/libpng/pngset.c +++ b/media/libpng/pngset.c @@ -1,8 +1,8 @@ /* pngset.c - storage of image information into info struct * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.10 [(PENDING RELEASE)] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -697,24 +697,28 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, */ if (info_ptr->num_text + num_text > info_ptr->max_text) { + int old_max_text = info_ptr->max_text; + int old_num_text = info_ptr->num_text; + if (info_ptr->text != NULL) { png_textp old_text; - int old_max; - old_max = info_ptr->max_text; info_ptr->max_text = info_ptr->num_text + num_text + 8; old_text = info_ptr->text; + info_ptr->text = (png_textp)png_malloc_warn(png_ptr, (png_size_t)(info_ptr->max_text * png_sizeof(png_text))); if (info_ptr->text == NULL) { - png_free(png_ptr, old_text); + /* Restore to previous condition */ + info_ptr->max_text = old_max_text; + info_ptr->text = old_text; return(1); } - png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max * + png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max_text * png_sizeof(png_text))); png_free(png_ptr, old_text); } @@ -726,7 +730,12 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, info_ptr->text = (png_textp)png_malloc_warn(png_ptr, (png_size_t)(info_ptr->max_text * png_sizeof(png_text))); if (info_ptr->text == NULL) + { + /* Restore to previous condition */ + info_ptr->num_text = old_num_text; + info_ptr->max_text = old_max_text; return(1); + } info_ptr->free_me |= PNG_FREE_TEXT; } @@ -1427,4 +1436,20 @@ png_set_benign_errors(png_structp png_ptr, int allowed) png_ptr->flags &= ~PNG_FLAG_BENIGN_ERRORS_WARN; } #endif /* PNG_BENIGN_ERRORS_SUPPORTED */ + +#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED + /* Do not report invalid palette index; added at libng-1.5.10 */ +void PNGAPI +png_set_check_for_invalid_index(png_structp png_ptr, int allowed) +{ + png_debug(1, "in png_set_check_for_invalid_index"); + + if (allowed) + png_ptr->num_palette_max = 0; + + else + png_ptr->num_palette_max = -1; +} +#endif + #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/media/libpng/pngstruct.h b/media/libpng/pngstruct.h index 17429a8841f..1a3ba613232 100644 --- a/media/libpng/pngstruct.h +++ b/media/libpng/pngstruct.h @@ -5,7 +5,7 @@ * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * - * Last changed in libpng 1.5.9 [February 18, 2012] + * Last changed in libpng 1.5.9 [March 29, 2012] * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer @@ -121,6 +121,12 @@ struct png_struct_def png_uint_32 crc; /* current chunk CRC value */ png_colorp palette; /* palette from the input file */ png_uint_16 num_palette; /* number of color entries in palette */ + +/* Added at libpng-1.5.10 */ +#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED + int num_palette_max; /* maximum palette index found in IDAT */ +#endif + png_uint_16 num_trans; /* number of transparency values */ png_byte compression; /* file compression type (always 0) */ png_byte filter; /* file filter type (always 0) */ @@ -211,13 +217,6 @@ struct png_struct_def int process_mode; /* what push library is currently doing */ int cur_palette; /* current push library palette index */ -# ifdef PNG_TEXT_SUPPORTED - png_size_t current_text_size; /* current size of text input data */ - png_size_t current_text_left; /* how much text left to read in input */ - png_charp current_text; /* current text chunk buffer */ - png_charp current_text_ptr; /* current location in current_text */ -# endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */ - #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) diff --git a/media/libpng/pngtrans.c b/media/libpng/pngtrans.c index 6a6908dcd26..fef12f1851b 100644 --- a/media/libpng/pngtrans.c +++ b/media/libpng/pngtrans.c @@ -1,8 +1,8 @@ /* pngtrans.c - transforms the data in a row (used by both readers and writers) * - * Last changed in libpng 1.5.4 [July 7, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.10 [March 8, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -619,6 +619,109 @@ png_do_bgr(png_row_infop row_info, png_bytep row) } #endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ +#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ + defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) +/* Added at libpng-1.5.10 */ +void /* PRIVATE */ +png_do_check_palette_indexes(png_structp png_ptr, png_row_infop row_info) +{ + if (png_ptr->num_palette < (1 << row_info->bit_depth) && + png_ptr->num_palette_max >= 0) + { + /* Calculations moved outside switch in an attempt to stop different + * compiler warnings. 'padding' is in *bits* within the last byte, it is + * an 'int' because pixel_depth becomes an 'int' in the expression below, + * and this calculation is used because it avoids warnings that other + * forms produced on either GCC or MSVC. + */ + int padding = (-row_info->pixel_depth * row_info->width) & 7; + png_bytep rp = png_ptr->row_buf + row_info->rowbytes; + + switch (row_info->bit_depth) + { + case 1: + { + /* in this case, all bytes must be 0 so we don't need + * to unpack the pixels except for the rightmost one. + */ + for (; rp > png_ptr->row_buf; rp--) + { + if (*rp >> padding != 0) + png_ptr->num_palette_max = 1; + padding = 0; + } + + break; + } + + case 2: + { + for (; rp > png_ptr->row_buf; rp--) + { + int i = ((*rp >> padding) & 0x03); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + i = (((*rp >> padding) >> 2) & 0x03); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + i = (((*rp >> padding) >> 4) & 0x03); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + i = (((*rp >> padding) >> 6) & 0x03); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + padding = 0; + } + + break; + } + + case 4: + { + for (; rp > png_ptr->row_buf; rp--) + { + int i = ((*rp >> padding) & 0x0f); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + i = (((*rp >> padding) >> 4) & 0x0f); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + padding = 0; + } + + break; + } + + case 8: + { + for (; rp > png_ptr->row_buf; rp--) + { + if (*rp >= png_ptr->num_palette_max) + png_ptr->num_palette_max = (int) *rp; + } + + break; + } + + default: + break; + } + } +} +#endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */ + #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) #ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED diff --git a/media/libpng/pngwrite.c b/media/libpng/pngwrite.c index cd1f14e6083..cb803f0191f 100644 --- a/media/libpng/pngwrite.c +++ b/media/libpng/pngwrite.c @@ -1,8 +1,8 @@ /* pngwrite.c - general routines to write a PNG file * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.10 [March 8, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -309,6 +309,12 @@ png_write_end(png_structp png_ptr, png_infop info_ptr) if (!(png_ptr->mode & PNG_HAVE_IDAT)) png_error(png_ptr, "No IDATs written into file"); +#ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED + if (png_ptr->num_palette_max > png_ptr->num_palette) + png_benign_error(png_ptr, "Wrote palette index exceeding num_palette"); +#endif + + /* See if user wants us to write information chunks */ #ifdef PNG_WRITE_APNG_SUPPORTED if (png_ptr->num_frames_written != png_ptr->num_frames_to_write) png_error(png_ptr, "Not enough frames written"); @@ -807,6 +813,13 @@ png_write_row(png_structp png_ptr, png_const_bytep row) } #endif +/* Added at libpng-1.5.10 */ +#ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED + /* Check for out-of-range palette index */ + if(row_info.color_type == PNG_COLOR_TYPE_PALETTE) + png_do_check_palette_indexes(png_ptr, &row_info); +#endif + /* Find a filter if necessary, filter the row and write it out. */ png_write_find_filter(png_ptr, &row_info); diff --git a/media/libpng/pngwutil.c b/media/libpng/pngwutil.c index e19d6446204..1a72b171b90 100644 --- a/media/libpng/pngwutil.c +++ b/media/libpng/pngwutil.c @@ -1,8 +1,8 @@ /* pngwutil.c - utilities to write a PNG file * - * Last changed in libpng 1.5.6 [November 3, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.10 [March 8, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -569,14 +569,15 @@ png_text_compress(png_structp png_ptr, /* Ship the compressed text out via chunk writes */ static void /* PRIVATE */ -png_write_compressed_data_out(png_structp png_ptr, compression_state *comp) +png_write_compressed_data_out(png_structp png_ptr, compression_state *comp, + png_size_t data_len) { int i; /* Handle the no-compression case */ if (comp->input) { - png_write_chunk_data(png_ptr, comp->input, comp->input_len); + png_write_chunk_data(png_ptr, comp->input, data_len); return; } @@ -585,7 +586,7 @@ png_write_compressed_data_out(png_structp png_ptr, compression_state *comp) /* The zbuf_size test is because the code below doesn't work if zbuf_size is * '1'; simply skip it to avoid memory overwrite. */ - if (comp->input_len >= 2 && comp->input_len < 16384 && png_ptr->zbuf_size > 1) + if (data_len >= 2 && comp->input_len < 16384 && png_ptr->zbuf_size > 1) { unsigned int z_cmf; /* zlib compression method and flags */ @@ -1190,8 +1191,7 @@ png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type, if (profile_len) { - comp.input_len = profile_len; - png_write_compressed_data_out(png_ptr, &comp); + png_write_compressed_data_out(png_ptr, &comp, profile_len); } png_write_chunk_end(png_ptr); @@ -1761,8 +1761,7 @@ png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text, png_write_chunk_data(png_ptr, &buf, (png_size_t)1); /* Write the compressed data */ - comp.input_len = text_len; - png_write_compressed_data_out(png_ptr, &comp); + png_write_compressed_data_out(png_ptr, &comp, text_len); /* Close the chunk */ png_write_chunk_end(png_ptr); @@ -1853,7 +1852,7 @@ png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key, png_write_chunk_data(png_ptr, (lang_key ? (png_const_bytep)lang_key : cbuf), (png_size_t)(lang_key_len + 1)); - png_write_compressed_data_out(png_ptr, &comp); + png_write_compressed_data_out(png_ptr, &comp, text_len); png_write_chunk_end(png_ptr); From 25183d300956a6583580dacee774fa0fec1c34be Mon Sep 17 00:00:00 2001 From: Masatoshi Kimura Date: Tue, 24 Apr 2012 19:50:00 -0400 Subject: [PATCH 074/182] Bug 745507 - test_location.html fails if it is executed alone. r=bent --- dom/workers/test/test_location.html | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dom/workers/test/test_location.html b/dom/workers/test/test_location.html index 1709c7fc1c3..b6d824e743c 100644 --- a/dom/workers/test/test_location.html +++ b/dom/workers/test/test_location.html @@ -24,7 +24,8 @@ Tests of DOM Worker Location var workerFilename = "location_worker.js"; var href = window.location.href - var baseHref = href.substr(0, href.lastIndexOf("/") + 1); + var queryPos = href.lastIndexOf(window.location.search); + var baseHref = href.substr(0, href.substr(0, queryPos).lastIndexOf("/") + 1); var path = window.location.pathname; var basePath = path.substr(0, path.lastIndexOf("/") + 1); @@ -40,22 +41,21 @@ Tests of DOM Worker Location "hash": "" }; - var lastSlash = href.lastIndexOf("/") + 1; + var lastSlash = href.substr(0, queryPos).lastIndexOf("/") + 1; is(thisFilename, - href.substr(lastSlash, - href.lastIndexOf(window.location.search) - lastSlash), - "Correct filename"); + href.substr(lastSlash, queryPos - lastSlash), + "Correct filename "); var worker = new Worker(workerFilename); worker.onmessage = function(event) { if (event.data.string == "testfinished") { - is(event.data.value, strings["href"]); + is(event.data.value, strings["href"], "href"); SimpleTest.finish(); return; } - ok(event.data.string in strings); - is(event.data.value, strings[event.data.string]); + ok(event.data.string in strings, event.data.string); + is(event.data.value, strings[event.data.string], event.data.string); }; worker.onerror = function(event) { From bbc1dda5da538a653f742ffe62daafedaab8de27 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Tue, 24 Apr 2012 19:50:00 -0400 Subject: [PATCH 075/182] Bug 747243 - Fix MSVC warning with a little JS_FRIEND_API love. r=billm --- js/src/jsgc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/jsgc.h b/js/src/jsgc.h index 4d09ca8ed28..43e072eb517 100644 --- a/js/src/jsgc.h +++ b/js/src/jsgc.h @@ -1382,7 +1382,7 @@ MaybeGC(JSContext *cx); extern void ShrinkGCBuffers(JSRuntime *rt); -extern void +extern JS_FRIEND_API(void) PrepareForFullGC(JSRuntime *rt); /* From b4d3e4eef9213d4ad5a547ce7cdf98dd5dd45db6 Mon Sep 17 00:00:00 2001 From: Steve Fink Date: Tue, 24 Apr 2012 16:29:03 -0700 Subject: [PATCH 076/182] Bug 730208 - Implement js::IsIncrementalBarrierNeededOnScript. r=billm --HG-- extra : rebase_source : 2f065e0dae6c2789b547b677eb0e8ebb466feec2 --- js/src/jsfriendapi.cpp | 6 ++++++ js/src/jsfriendapi.h | 3 +++ 2 files changed, 9 insertions(+) diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index eae2d322b3a..aff7de5edef 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -768,6 +768,12 @@ IsIncrementalBarrierNeededOnObject(JSObject *obj) return obj->compartment()->needsBarrier(); } +JS_FRIEND_API(bool) +IsIncrementalBarrierNeededOnScript(JSScript *script) +{ + return script->compartment()->needsBarrier(); +} + extern JS_FRIEND_API(void) IncrementalReferenceBarrier(void *ptr) { diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h index 4df3f883c5c..997f4010b22 100644 --- a/js/src/jsfriendapi.h +++ b/js/src/jsfriendapi.h @@ -724,6 +724,9 @@ IsIncrementalBarrierNeeded(JSContext *cx); extern JS_FRIEND_API(bool) IsIncrementalBarrierNeededOnObject(JSObject *obj); +extern JS_FRIEND_API(bool) +IsIncrementalBarrierNeededOnScript(JSScript *obj); + extern JS_FRIEND_API(void) IncrementalReferenceBarrier(void *ptr); From 86212c400a56e7e7ded8c6a78024e8b669bbbbee Mon Sep 17 00:00:00 2001 From: Steve Fink Date: Tue, 20 Mar 2012 21:22:40 -0700 Subject: [PATCH 077/182] Bug 730208 - XPConnect changes to UnmarkGray some more objects and return them for convenience. r=mccr8 --HG-- extra : rebase_source : a1d56aa4dc9dcf1fe280c42667710494f2481a7c --- js/xpconnect/src/XPCWrappedNativeJSOps.cpp | 4 +-- js/xpconnect/src/XPCWrappedNativeScope.cpp | 4 +-- js/xpconnect/src/nsXPConnect.cpp | 12 +++++---- js/xpconnect/src/xpcprivate.h | 29 ++++++++++++++-------- js/xpconnect/src/xpcpublic.h | 19 +++++++++++--- 5 files changed, 45 insertions(+), 23 deletions(-) diff --git a/js/xpconnect/src/XPCWrappedNativeJSOps.cpp b/js/xpconnect/src/XPCWrappedNativeJSOps.cpp index d50e21c711b..3800117509e 100644 --- a/js/xpconnect/src/XPCWrappedNativeJSOps.cpp +++ b/js/xpconnect/src/XPCWrappedNativeJSOps.cpp @@ -652,11 +652,11 @@ TraceScopeJSObjects(JSTracer *trc, XPCWrappedNativeScope* scope) JSObject* obj; - obj = scope->GetGlobalJSObject(); + obj = scope->GetGlobalJSObjectPreserveColor(); NS_ASSERTION(obj, "bad scope JSObject"); JS_CALL_OBJECT_TRACER(trc, obj, "XPCWrappedNativeScope::mGlobalJSObject"); - obj = scope->GetPrototypeJSObject(); + obj = scope->GetPrototypeJSObjectPreserveColor(); if (obj) { JS_CALL_OBJECT_TRACER(trc, obj, "XPCWrappedNativeScope::mPrototypeJSObject"); diff --git a/js/xpconnect/src/XPCWrappedNativeScope.cpp b/js/xpconnect/src/XPCWrappedNativeScope.cpp index 16577c0dd8b..cd562c4ff89 100644 --- a/js/xpconnect/src/XPCWrappedNativeScope.cpp +++ b/js/xpconnect/src/XPCWrappedNativeScope.cpp @@ -158,7 +158,7 @@ XPCWrappedNativeScope::XPCWrappedNativeScope(XPCCallContext& ccx, #ifdef DEBUG for (XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext) - NS_ASSERTION(aGlobal != cur->GetGlobalJSObject(), "dup object"); + MOZ_ASSERT(aGlobal != cur->GetGlobalJSObjectPreserveColor(), "dup object"); #endif mNext = gScopes; @@ -764,7 +764,7 @@ XPCWrappedNativeScope::FindInJSObjectScope(JSContext* cx, JSObject* obj, DEBUG_TrackScopeTraversal(); for (XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext) { - if (obj == cur->GetGlobalJSObject()) { + if (obj == cur->GetGlobalJSObjectPreserveColor()) { found = cur; break; } diff --git a/js/xpconnect/src/nsXPConnect.cpp b/js/xpconnect/src/nsXPConnect.cpp index eb93c104481..ee65397b200 100644 --- a/js/xpconnect/src/nsXPConnect.cpp +++ b/js/xpconnect/src/nsXPConnect.cpp @@ -774,17 +774,19 @@ UnmarkGrayChildren(JSTracer *trc, void **thingp, JSGCTraceKind kind) } void -xpc_UnmarkGrayObjectRecursive(JSObject *obj) +xpc_UnmarkGrayGCThingRecursive(void *thing, JSGCTraceKind kind) { - NS_ASSERTION(obj, "Don't pass me null!"); + MOZ_ASSERT(thing, "Don't pass me null!"); + MOZ_ASSERT(kind != JSTRACE_SHAPE, "UnmarkGrayGCThingRecursive not intended for Shapes"); // Unmark. - js::gc::AsCell(obj)->unmark(js::gc::GRAY); + static_cast(thing)->unmark(js::gc::GRAY); // Trace children. UnmarkGrayTracer trc; - JS_TracerInit(&trc, JS_GetObjectRuntime(obj), UnmarkGrayChildren); - JS_TraceChildren(&trc, obj, JSTRACE_OBJECT); + JSRuntime *rt = nsXPConnect::GetRuntimeInstance()->GetJSRuntime(); + JS_TracerInit(&trc, rt, UnmarkGrayChildren); + JS_TraceChildren(&trc, thing, kind); } struct TraversalTracer : public JSTracer diff --git a/js/xpconnect/src/xpcprivate.h b/js/xpconnect/src/xpcprivate.h index ea70c69cde2..704171c3c5d 100644 --- a/js/xpconnect/src/xpcprivate.h +++ b/js/xpconnect/src/xpcprivate.h @@ -1289,7 +1289,7 @@ public: if (mCcx) return mCcx->GetScopeForNewJSObjects(); - return mObj; + return xpc_UnmarkGrayObject(mObj); } void SetScopeForNewJSObjects(JSObject *obj) { @@ -1305,7 +1305,7 @@ public: if (mCcx) return mCcx->GetFlattenedJSObject(); - return mFlattenedJSObject; + return xpc_UnmarkGrayObject(mFlattenedJSObject); } XPCCallContext &GetXPCCallContext() { @@ -1313,8 +1313,9 @@ public: mCcxToDestroy = mCcx = new (mData) XPCCallContext(mCallerLanguage, mCx, mCallBeginRequest == CALL_BEGINREQUEST, - mObj, - mFlattenedJSObject, mWrapper, + xpc_UnmarkGrayObject(mObj), + xpc_UnmarkGrayObject(mFlattenedJSObject), + mWrapper, mTearOff); if (!mCcx->IsValid()) { NS_ERROR("This is not supposed to fail!"); @@ -1523,10 +1524,18 @@ public: GetComponents() const {return mComponents;} JSObject* - GetGlobalJSObject() const {return mGlobalJSObject;} + GetGlobalJSObject() const + {return xpc_UnmarkGrayObject(mGlobalJSObject);} JSObject* - GetPrototypeJSObject() const {return mPrototypeJSObject;} + GetGlobalJSObjectPreserveColor() const {return mGlobalJSObject;} + + JSObject* + GetPrototypeJSObject() const + {return xpc_UnmarkGrayObject(mPrototypeJSObject);} + + JSObject* + GetPrototypeJSObjectPreserveColor() const {return mPrototypeJSObject;} // Getter for the prototype that we use for wrappers that have no // helper. @@ -2238,7 +2247,7 @@ public: GetRuntime() const {return mScope->GetRuntime();} JSObject* - GetJSProtoObject() const {return mJSProtoObject;} + GetJSProtoObject() const {return xpc_UnmarkGrayObject(mJSProtoObject);} nsIClassInfo* GetClassInfo() const {return mClassInfo;} @@ -3026,8 +3035,7 @@ public: * This getter clears the gray bit before handing out the JSObject which * means that the object is guaranteed to be kept alive past the next CC. */ - JSObject* GetJSObject() const {xpc_UnmarkGrayObject(mJSObj); - return mJSObj;} + JSObject* GetJSObject() const {return xpc_UnmarkGrayObject(mJSObj);} /** * This getter does not change the color of the JSObject meaning that the @@ -4487,8 +4495,7 @@ struct CompartmentPrivate */ JSObject *LookupExpandoObject(XPCWrappedNative *wn) { JSObject *obj = LookupExpandoObjectPreserveColor(wn); - xpc_UnmarkGrayObject(obj); - return obj; + return xpc_UnmarkGrayObject(obj); } bool RegisterDOMExpandoObject(JSObject *expando) { diff --git a/js/xpconnect/src/xpcpublic.h b/js/xpconnect/src/xpcpublic.h index ff23f465bac..30d8e3ddf58 100644 --- a/js/xpconnect/src/xpcpublic.h +++ b/js/xpconnect/src/xpcpublic.h @@ -177,19 +177,32 @@ xpc_GCThingIsGrayCCThing(void *thing); // Implemented in nsXPConnect.cpp. extern void -xpc_UnmarkGrayObjectRecursive(JSObject* obj); +xpc_UnmarkGrayGCThingRecursive(void *thing, JSGCTraceKind kind); // Remove the gray color from the given JSObject and any other objects that can // be reached through it. -inline void +inline JSObject * xpc_UnmarkGrayObject(JSObject *obj) { if (obj) { if (xpc_IsGrayGCThing(obj)) - xpc_UnmarkGrayObjectRecursive(obj); + xpc_UnmarkGrayGCThingRecursive(obj, JSTRACE_OBJECT); else if (js::IsIncrementalBarrierNeededOnObject(obj)) js::IncrementalReferenceBarrier(obj); } + return obj; +} + +inline JSScript * +xpc_UnmarkGrayScript(JSScript *script) +{ + if (script) { + if (xpc_IsGrayGCThing(script)) + xpc_UnmarkGrayGCThingRecursive(script, JSTRACE_SCRIPT); + else if (js::IsIncrementalBarrierNeededOnScript(script)) + js::IncrementalReferenceBarrier(script); + } + return script; } // If aVariant is an XPCVariant, this marks the object to be in aGeneration. From 5843a0733d8dea22e10b21e3bf64bd2e2ba51bcd Mon Sep 17 00:00:00 2001 From: Steve Fink Date: Tue, 20 Mar 2012 21:29:47 -0700 Subject: [PATCH 078/182] Bug 730208 - UnmarkGray various JS objects to prevent them from being used to create black -> gray edges. r=smaug --HG-- extra : rebase_source : 00bd6f20a900e97173fafa9f5512e2ebbd3a0cac --- dom/base/nsDOMClassInfo.cpp | 4 ++-- dom/base/nsGlobalWindow.cpp | 6 ++++-- dom/base/nsIJSEventListener.h | 5 +++-- dom/base/nsJSEnvironment.cpp | 27 +++++++++++++++++++++++++-- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index 035ddd60380..a090117ba2f 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -5463,8 +5463,8 @@ nsWindowSH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, nsCOMPtr holder; jsval v; - rv = WrapNative(cx, frameWin->GetGlobalJSObject(), frame, - &NS_GET_IID(nsIDOMWindow), true, &v, + rv = WrapNative(cx, xpc_UnmarkGrayObject(frameWin->GetGlobalJSObject()), + frame, &NS_GET_IID(nsIDOMWindow), true, &v, getter_AddRefs(holder)); NS_ENSURE_SUCCESS(rv, rv); diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index 1e43714903c..65de956bef9 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -2039,6 +2039,7 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument, newInnerWindow = currentInner; if (aDocument != oldDoc) { + xpc_UnmarkGrayObject(currentInner->mJSObject); nsWindowSH::InvalidateGlobalScopePolluter(cx, currentInner->mJSObject); } @@ -2047,6 +2048,7 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument, // don't expose that API because the implementation would be // identical to that of JS_TransplantObject, so we just call that // instead. + xpc_UnmarkGrayObject(mJSObject); if (!JS_TransplantObject(cx, mJSObject, mJSObject)) { return NS_ERROR_FAILURE; } @@ -2129,7 +2131,7 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument, mJSObject = mContext->GetNativeGlobal(); SetWrapper(mJSObject); } else { - JSObject *outerObject = NewOuterWindowProxy(cx, newInnerWindow->mJSObject); + JSObject *outerObject = NewOuterWindowProxy(cx, xpc_UnmarkGrayObject(newInnerWindow->mJSObject)); if (!outerObject) { NS_ERROR("out of memory"); return NS_ERROR_FAILURE; @@ -2200,7 +2202,7 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument, proto = nsnull; } - if (!JS_SetPrototype(cx, mJSObject, proto)) { + if (!JS_SetPrototype(cx, mJSObject, xpc_UnmarkGrayObject(proto))) { NS_ERROR("can't set prototype"); return NS_ERROR_FAILURE; } diff --git a/dom/base/nsIJSEventListener.h b/dom/base/nsIJSEventListener.h index b67276c40f2..9da88ad9441 100644 --- a/dom/base/nsIJSEventListener.h +++ b/dom/base/nsIJSEventListener.h @@ -40,6 +40,7 @@ #include "nsIScriptContext.h" #include "jsapi.h" +#include "xpcpublic.h" #include "nsIDOMEventListener.h" class nsIScriptObjectOwner; @@ -86,12 +87,12 @@ public: JSObject* GetEventScope() const { - return mScopeObject; + return xpc_UnmarkGrayObject(mScopeObject); } JSObject *GetHandler() const { - return mHandler; + return xpc_UnmarkGrayObject(mHandler); } // Set a handler for this event listener. Must not be called if diff --git a/dom/base/nsJSEnvironment.cpp b/dom/base/nsJSEnvironment.cpp index c2734619532..cf9a19db624 100644 --- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -1194,6 +1194,7 @@ nsJSContext::EvaluateStringWithValue(const nsAString& aScript, return NS_OK; } + xpc_UnmarkGrayObject(aScopeObject); nsAutoMicroTask mt; // Safety first: get an object representing the script's principals, i.e., @@ -1396,6 +1397,8 @@ nsJSContext::EvaluateString(const nsAString& aScript, aScopeObject = JS_GetGlobalObject(mContext); } + xpc_UnmarkGrayObject(aScopeObject); + // Safety first: get an object representing the script's principals, i.e., // the entities who signed this script, or the fully-qualified-domain-name // or "codebase" from which it was loaded. @@ -1513,6 +1516,7 @@ nsJSContext::CompileScript(const PRUnichar* aText, NS_ENSURE_ARG_POINTER(aPrincipal); JSObject* scopeObject = ::JS_GetGlobalObject(mContext); + xpc_UnmarkGrayObject(scopeObject); bool ok = false; @@ -1572,6 +1576,9 @@ nsJSContext::ExecuteScript(JSScript* aScriptObject, aScopeObject = JS_GetGlobalObject(mContext); } + xpc_UnmarkGrayScript(aScriptObject); + xpc_UnmarkGrayObject(aScopeObject); + // Push our JSContext on our thread's context stack, in case native code // called from JS calls back into JS via XPConnect. nsresult rv; @@ -1674,7 +1681,7 @@ nsJSContext::JSObjectFromInterface(nsISupports* aTarget, JSObject* aScope, JSObj NS_ASSERTION(native == targetSupp, "Native should be the target!"); #endif - *aRet = JSVAL_TO_OBJECT(v); + *aRet = xpc_UnmarkGrayObject(JSVAL_TO_OBJECT(v)); return NS_OK; } @@ -1766,6 +1773,8 @@ nsJSContext::CompileFunction(JSObject* aTarget, return NS_ERROR_ILLEGAL_VALUE; } + xpc_UnmarkGrayObject(aTarget); + nsIScriptGlobalObject *global = GetGlobalObject(); nsCOMPtr principal; if (global) { @@ -1826,6 +1835,9 @@ nsJSContext::CallEventHandler(nsISupports* aTarget, JSObject* aScope, nsAutoMicroTask mt; JSAutoRequest ar(mContext); + xpc_UnmarkGrayObject(aScope); + xpc_UnmarkGrayObject(aHandler); + JSObject* target = nsnull; nsresult rv = JSObjectFromInterface(aTarget, aScope, &target); NS_ENSURE_SUCCESS(rv, rv); @@ -1883,6 +1895,11 @@ nsJSContext::CallEventHandler(nsISupports* aTarget, JSObject* aScope, // in the same scope as aTarget. rv = ConvertSupportsTojsvals(aargv, target, &argc, &argv, tempStorage); NS_ENSURE_SUCCESS(rv, rv); + for (uint32_t i = 0; i < argc; i++) { + if (!JSVAL_IS_PRIMITIVE(argv[i])) { + xpc_UnmarkGrayObject(JSVAL_TO_OBJECT(argv[i])); + } + } ++mExecuteDepth; bool ok = ::JS_CallFunctionValue(mContext, target, @@ -1930,6 +1947,9 @@ nsJSContext::BindCompiledEventHandler(nsISupports* aTarget, JSObject* aScope, NS_PRECONDITION(!aBoundHandler, "Shouldn't already have a bound handler!"); JSAutoRequest ar(mContext); + xpc_UnmarkGrayObject(aScope); + xpc_UnmarkGrayObject(aHandler); + // Get the jsobject associated with this target JSObject *target = nsnull; @@ -1978,6 +1998,8 @@ nsJSContext::Serialize(nsIObjectOutputStream* aStream, JSScript* aScriptObject) return NS_ERROR_FAILURE; return nsContentUtils::XPConnect()->WriteScript(aStream, mContext, aScriptObject); + xpc_UnmarkGrayScript(aScriptObject); + } nsresult @@ -2441,8 +2463,9 @@ nsJSContext::AddSupportsPrimitiveTojsvals(nsISupports *aArg, jsval *aArgv) AutoFree iidGuard(iid); // Free iid upon destruction. nsCOMPtr wrapper; + JSObject *global = xpc_UnmarkGrayObject(::JS_GetGlobalObject(cx)); jsval v; - nsresult rv = nsContentUtils::WrapNative(cx, ::JS_GetGlobalObject(cx), + nsresult rv = nsContentUtils::WrapNative(cx, global, data, iid, &v, getter_AddRefs(wrapper)); NS_ENSURE_SUCCESS(rv, rv); From 70566081934e8dca577e6e29148d92929a79619e Mon Sep 17 00:00:00 2001 From: Steve Fink Date: Tue, 20 Mar 2012 21:29:47 -0700 Subject: [PATCH 079/182] Bug 730208 - UnmarkGray the global object held by nsXULPDGlobalObject to avoid it getting used to create black -> gray edges. r=smaug --HG-- extra : rebase_source : 08ec063f13679b0a0a32c1b56415f6192a657280 --- content/xul/document/src/nsXULPrototypeDocument.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/xul/document/src/nsXULPrototypeDocument.cpp b/content/xul/document/src/nsXULPrototypeDocument.cpp index e0321082db2..ef7572495e9 100644 --- a/content/xul/document/src/nsXULPrototypeDocument.cpp +++ b/content/xul/document/src/nsXULPrototypeDocument.cpp @@ -773,7 +773,7 @@ nsXULPDGlobalObject::GetScriptContext() JSObject* nsXULPDGlobalObject::GetGlobalJSObject() { - return mJSObject; + return xpc_UnmarkGrayObject(mJSObject); } From c8e72b6a5435d5dac5111f9bdbc6fec1a872ea44 Mon Sep 17 00:00:00 2001 From: Steve Fink Date: Tue, 20 Mar 2012 21:29:47 -0700 Subject: [PATCH 080/182] Bug 730208 - Root JSD's pet global so it can't participate in CC cycles. r=billm --HG-- extra : rebase_source : 9211b881e0c0931bd7df16989bed492449b1c74f --- js/jsd/jsd_high.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/js/jsd/jsd_high.c b/js/jsd/jsd_high.c index 97698dd47b4..78fb7c05d6b 100644 --- a/js/jsd/jsd_high.c +++ b/js/jsd/jsd_high.c @@ -148,6 +148,9 @@ _newJSDContext(JSRuntime* jsrt, if( ! call ) goto label_newJSDContext_failure; + if ( ! JS_AddNamedObjectRoot(jsdc->dumbContext, &jsdc->glob, "JSD context global") ) + goto label_newJSDContext_failure; + ok = JS_InitStandardClasses(jsdc->dumbContext, jsdc->glob); JS_LeaveCrossCompartmentCall(call); @@ -167,6 +170,8 @@ _newJSDContext(JSRuntime* jsrt, label_newJSDContext_failure: if( jsdc ) { + if ( jsdc->dumbContext && jsdc->glob ) + JS_RemoveObjectRoot(jsdc->dumbContext, &jsdc->glob); jsd_DestroyObjectManager(jsdc); jsd_DestroyAtomTable(jsdc); if( jsdc->dumbContext ) @@ -185,6 +190,8 @@ _destroyJSDContext(JSDContext* jsdc) JS_REMOVE_LINK(&jsdc->links); JSD_UNLOCK(); + if ( jsdc->dumbContext && jsdc->glob ) + JS_RemoveObjectRoot(jsdc->dumbContext, &jsdc->glob); jsd_DestroyObjectManager(jsdc); jsd_DestroyAtomTable(jsdc); From f05afcc260db6cdea389b3a4497811d3f617be0a Mon Sep 17 00:00:00 2001 From: Steve Fink Date: Wed, 14 Mar 2012 09:32:58 -0700 Subject: [PATCH 081/182] Bug 730208 - UnmarkGray fixups for globals and contexts. r=billm A common source of potential black -> gray edges is JSAPI calls made on objects with gray globals or contexts holding gray globals. (The call could potentially update a black object with a pointer to that global.) This patch mostly traps places where contexts are used, and unmarks their globals. It also includes some more global unmarking. --HG-- extra : rebase_source : 1286bdbc4c337956242c292e0fa385629ee8850b --- dom/base/nsGlobalWindow.cpp | 2 +- dom/base/nsJSEnvironment.cpp | 23 ++++++++++++----------- js/xpconnect/src/XPCWrappedJSClass.cpp | 2 +- js/xpconnect/src/nsXPConnect.cpp | 4 ++-- js/xpconnect/src/xpcpublic.h | 24 ++++++++++++++++++++++++ 5 files changed, 40 insertions(+), 15 deletions(-) diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index 65de956bef9..9414831a1b5 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -2027,7 +2027,7 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument, return NS_ERROR_FAILURE; } - JSAutoRequest ar(cx); + XPCAutoRequest ar(cx); nsCOMPtr wsh = do_QueryInterface(aState); NS_ASSERTION(!aState || wsh, "What kind of weird state are you giving me here?"); diff --git a/dom/base/nsJSEnvironment.cpp b/dom/base/nsJSEnvironment.cpp index cf9a19db624..2fb4e09fc65 100644 --- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -1244,7 +1244,7 @@ nsJSContext::EvaluateStringWithValue(const nsAString& aScript, // check it isn't JSVERSION_UNKNOWN. if (ok && ((JSVersion)aVersion) != JSVERSION_UNKNOWN) { - JSAutoRequest ar(mContext); + XPCAutoRequest ar(mContext); JSAutoEnterCompartment ac; if (!ac.enter(mContext, aScopeObject)) { @@ -1447,7 +1447,7 @@ nsJSContext::EvaluateString(const nsAString& aScript, // Since the caller is responsible for parsing the version strings, we just // check it isn't JSVERSION_UNKNOWN. if (ok && JSVersion(aVersion) != JSVERSION_UNKNOWN) { - JSAutoRequest ar(mContext); + XPCAutoRequest ar(mContext); JSAutoEnterCompartment ac; if (!ac.enter(mContext, aScopeObject)) { stack->Pop(nsnull); @@ -1471,7 +1471,7 @@ nsJSContext::EvaluateString(const nsAString& aScript, // If all went well, convert val to a string if one is wanted. if (ok) { - JSAutoRequest ar(mContext); + XPCAutoRequest ar(mContext); JSAutoEnterCompartment ac; if (!ac.enter(mContext, aScopeObject)) { stack->Pop(nsnull); @@ -1533,7 +1533,8 @@ nsJSContext::CompileScript(const PRUnichar* aText, if (!ok || JSVersion(aVersion) == JSVERSION_UNKNOWN) return NS_OK; - JSAutoRequest ar(mContext); + XPCAutoRequest ar(mContext); + JSScript* script = ::JS_CompileUCScriptForPrincipalsVersion(mContext, @@ -1598,7 +1599,7 @@ nsJSContext::ExecuteScript(JSScript* aScriptObject, NS_ENSURE_SUCCESS(rv, rv); nsJSContext::TerminationFuncHolder holder(this); - JSAutoRequest ar(mContext); + XPCAutoRequest ar(mContext); ++mExecuteDepth; // The result of evaluation, used only if there were no errors. This need @@ -1726,7 +1727,7 @@ nsJSContext::CompileEventHandler(nsIAtom *aName, // Event handlers are always shared, and must be bound before use. // Therefore we never bother compiling with principals. // (that probably means we should avoid JS_CompileUCFunctionForPrincipals!) - JSAutoRequest ar(mContext); + XPCAutoRequest ar(mContext); JSFunction* fun = ::JS_CompileUCFunctionForPrincipalsVersion(mContext, @@ -1789,7 +1790,7 @@ nsJSContext::CompileFunction(JSObject* aTarget, JSObject *target = aTarget; - JSAutoRequest ar(mContext); + XPCAutoRequest ar(mContext); JSFunction* fun = ::JS_CompileUCFunctionForPrincipalsVersion(mContext, @@ -1834,10 +1835,10 @@ nsJSContext::CallEventHandler(nsISupports* aTarget, JSObject* aScope, SAMPLE_LABEL("JS", "CallEventHandler"); nsAutoMicroTask mt; - JSAutoRequest ar(mContext); xpc_UnmarkGrayObject(aScope); xpc_UnmarkGrayObject(aHandler); + XPCAutoRequest ar(mContext); JSObject* target = nsnull; nsresult rv = JSObjectFromInterface(aTarget, aScope, &target); NS_ENSURE_SUCCESS(rv, rv); @@ -1946,10 +1947,10 @@ nsJSContext::BindCompiledEventHandler(nsISupports* aTarget, JSObject* aScope, NS_ENSURE_TRUE(mIsInitialized, NS_ERROR_NOT_INITIALIZED); NS_PRECONDITION(!aBoundHandler, "Shouldn't already have a bound handler!"); - JSAutoRequest ar(mContext); xpc_UnmarkGrayObject(aScope); xpc_UnmarkGrayObject(aHandler); + XPCAutoRequest ar(mContext); // Get the jsobject associated with this target JSObject *target = nsnull; @@ -2106,7 +2107,7 @@ nsJSContext::CreateNativeGlobalForInner( JSContext* nsJSContext::GetNativeContext() { - return mContext; + return xpc_UnmarkGrayContext(mContext); } nsresult @@ -2152,7 +2153,7 @@ nsJSContext::SetProperty(JSObject* aTarget, const char* aPropName, nsISupports* PRUint32 argc; jsval *argv = nsnull; - JSAutoRequest ar(mContext); + XPCAutoRequest ar(mContext); Maybe tempStorage; diff --git a/js/xpconnect/src/XPCWrappedJSClass.cpp b/js/xpconnect/src/XPCWrappedJSClass.cpp index 6177c20e1a5..18019fee528 100644 --- a/js/xpconnect/src/XPCWrappedJSClass.cpp +++ b/js/xpconnect/src/XPCWrappedJSClass.cpp @@ -1189,7 +1189,7 @@ nsXPCWrappedJSClass::CallMethod(nsXPCWrappedJS* wrapper, uint16_t methodIndex, return retval; XPCContext *xpcc = ccx.GetXPCContext(); - JSContext *cx = ccx.GetJSContext(); + JSContext *cx = xpc_UnmarkGrayContext(ccx.GetJSContext()); if (!cx || !xpcc || !IsReflectable(methodIndex)) return NS_ERROR_FAILURE; diff --git a/js/xpconnect/src/nsXPConnect.cpp b/js/xpconnect/src/nsXPConnect.cpp index ee65397b200..8526ab88d32 100644 --- a/js/xpconnect/src/nsXPConnect.cpp +++ b/js/xpconnect/src/nsXPConnect.cpp @@ -2487,7 +2487,7 @@ nsXPConnect::Peek(JSContext * *_retval) return NS_ERROR_FAILURE; } - *_retval = data->GetJSContextStack()->Peek(); + *_retval = xpc_UnmarkGrayContext(data->GetJSContextStack()->Peek()); return NS_OK; } @@ -2592,7 +2592,7 @@ nsXPConnect::Pop(JSContext * *_retval) JSContext *cx = data->GetJSContextStack()->Pop(); if (_retval) - *_retval = cx; + *_retval = xpc_UnmarkGrayContext(cx); return NS_OK; } diff --git a/js/xpconnect/src/xpcpublic.h b/js/xpconnect/src/xpcpublic.h index 30d8e3ddf58..257300283c9 100644 --- a/js/xpconnect/src/xpcpublic.h +++ b/js/xpconnect/src/xpcpublic.h @@ -205,6 +205,30 @@ xpc_UnmarkGrayScript(JSScript *script) return script; } +inline JSContext * +xpc_UnmarkGrayContext(JSContext *cx) +{ + if (cx) { + JSObject *global = JS_GetGlobalObject(cx); + xpc_UnmarkGrayObject(global); + if (JS_IsInRequest(JS_GetRuntime(cx))) { + JSObject *scope = JS_GetGlobalForScopeChain(cx); + if (scope != global) + xpc_UnmarkGrayObject(scope); + } + } + return cx; +} + +#ifdef __cplusplus +class XPCAutoRequest : public JSAutoRequest { +public: + XPCAutoRequest(JSContext *cx) : JSAutoRequest(cx) { + xpc_UnmarkGrayContext(cx); + } +}; +#endif + // If aVariant is an XPCVariant, this marks the object to be in aGeneration. // This also unmarks the gray JSObject. extern void From 62a5eb37257c1bb4346732968645fabd5cfe300c Mon Sep 17 00:00:00 2001 From: Steve Fink Date: Mon, 30 Jan 2012 16:13:24 -0800 Subject: [PATCH 082/182] Bug 747543 - Convert JIT registration API to use JITChunks nearly everywhere in place of JITScripts. r=bhackett --HG-- extra : rebase_source : fd1ab3d4e24b8046b85421b29dfa96e1a74bf608 --- js/src/jsprobes.cpp | 12 ++++++------ js/src/jsprobes.h | 14 +++++++------- js/src/methodjit/BaseCompiler.h | 2 +- js/src/methodjit/Compiler.cpp | 2 +- js/src/methodjit/MethodJIT.cpp | 4 +++- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/js/src/jsprobes.cpp b/js/src/jsprobes.cpp index c786e8e98e2..5a59e556718 100644 --- a/js/src/jsprobes.cpp +++ b/js/src/jsprobes.cpp @@ -217,33 +217,33 @@ Probes::JITWatcher::CollectNativeRegions(RegionVector ®ions, } void -Probes::registerMJITCode(JSContext *cx, js::mjit::JITScript *jscr, +Probes::registerMJITCode(JSContext *cx, js::mjit::JITChunk *chunk, js::mjit::JSActiveFrame *outerFrame, js::mjit::JSActiveFrame **inlineFrames, void *mainCodeAddress, size_t mainCodeSize, void *stubCodeAddress, size_t stubCodeSize) { for (JITWatcher **p = jitWatchers.begin(); p != jitWatchers.end(); ++p) - (*p)->registerMJITCode(cx, jscr, outerFrame, + (*p)->registerMJITCode(cx, chunk, outerFrame, inlineFrames, mainCodeAddress, mainCodeSize, stubCodeAddress, stubCodeSize); } void -Probes::discardMJITCode(FreeOp *fop, mjit::JITScript *jscr, JSScript *script, void* address) +Probes::discardMJITCode(FreeOp *fop, mjit::JITScript *jscr, mjit::JITChunk *chunk, void* address) { for (JITWatcher **p = jitWatchers.begin(); p != jitWatchers.end(); ++p) - (*p)->discardMJITCode(fop, jscr, script, address); + (*p)->discardMJITCode(fop, jscr, chunk, address); } void Probes::registerICCode(JSContext *cx, - mjit::JITScript *jscr, JSScript *script, jsbytecode* pc, + mjit::JITChunk *chunk, JSScript *script, jsbytecode* pc, void *start, size_t size) { for (JITWatcher **p = jitWatchers.begin(); p != jitWatchers.end(); ++p) - (*p)->registerICCode(cx, jscr, script, pc, start, size); + (*p)->registerICCode(cx, chunk, script, pc, start, size); } #endif diff --git a/js/src/jsprobes.h b/js/src/jsprobes.h index 1c44f96c7ee..c64daf4e211 100644 --- a/js/src/jsprobes.h +++ b/js/src/jsprobes.h @@ -258,17 +258,17 @@ public: mjit::JSActiveFrame *outerFrame, mjit::JSActiveFrame **inlineFrames); - virtual void registerMJITCode(JSContext *cx, js::mjit::JITScript *jscr, + virtual void registerMJITCode(JSContext *cx, js::mjit::JITChunk *chunk, mjit::JSActiveFrame *outerFrame, mjit::JSActiveFrame **inlineFrames, void *mainCodeAddress, size_t mainCodeSize, void *stubCodeAddress, size_t stubCodeSize) = 0; - virtual void discardMJITCode(FreeOp *fop, mjit::JITScript *jscr, JSScript *script, + virtual void discardMJITCode(FreeOp *fop, mjit::JITScript *jscr, mjit::JITChunk *chunk, void* address) = 0; virtual void registerICCode(JSContext *cx, - js::mjit::JITScript *jscr, JSScript *script, jsbytecode* pc, + js::mjit::JITChunk *chunk, JSScript *script, jsbytecode* pc, void *start, size_t size) = 0; #endif @@ -306,7 +306,7 @@ JITGranularityRequested(); * New method JIT code has been created */ void -registerMJITCode(JSContext *cx, js::mjit::JITScript *jscr, +registerMJITCode(JSContext *cx, js::mjit::JITChunk *chunk, mjit::JSActiveFrame *outerFrame, mjit::JSActiveFrame **inlineFrames, void *mainCodeAddress, size_t mainCodeSize, @@ -316,14 +316,14 @@ registerMJITCode(JSContext *cx, js::mjit::JITScript *jscr, * Method JIT code is about to be discarded */ void -discardMJITCode(FreeOp *fop, mjit::JITScript *jscr, JSScript *script, void* address); +discardMJITCode(FreeOp *fop, mjit::JITScript *jscr, mjit::JITChunk *chunk, void* address); /* - * IC code has been allocated within the given JITScript + * IC code has been allocated within the given JITChunk */ void registerICCode(JSContext *cx, - mjit::JITScript *jscr, JSScript *script, jsbytecode* pc, + mjit::JITChunk *chunk, JSScript *script, jsbytecode* pc, void *start, size_t size); #endif /* JS_METHODJIT */ diff --git a/js/src/methodjit/BaseCompiler.h b/js/src/methodjit/BaseCompiler.h index 24f65022da4..ad31e63fdf4 100644 --- a/js/src/methodjit/BaseCompiler.h +++ b/js/src/methodjit/BaseCompiler.h @@ -171,7 +171,7 @@ class LinkerHelper : public JSC::LinkBuffer JSC::CodeLocationLabel finalize(VMFrame &f) { masm.finalize(*this); JSC::CodeLocationLabel label = finalizeCodeAddendum(); - Probes::registerICCode(f.cx, f.jit(), f.script(), f.pc(), + Probes::registerICCode(f.cx, f.chunk(), f.script(), f.pc(), label.executableAddress(), masm.size()); return label; } diff --git a/js/src/methodjit/Compiler.cpp b/js/src/methodjit/Compiler.cpp index f9d47fdd84c..aeed084fbb7 100644 --- a/js/src/methodjit/Compiler.cpp +++ b/js/src/methodjit/Compiler.cpp @@ -1774,7 +1774,7 @@ mjit::Compiler::finishThisUp() JSC::ExecutableAllocator::makeExecutable(result, masm.size() + stubcc.size()); JSC::ExecutableAllocator::cacheFlush(result, masm.size() + stubcc.size()); - Probes::registerMJITCode(cx, jit, + Probes::registerMJITCode(cx, chunk, a, (JSActiveFrame**) inlineFrames.begin(), result, masm.size(), diff --git a/js/src/methodjit/MethodJIT.cpp b/js/src/methodjit/MethodJIT.cpp index 66162ad9d2d..49ea633e221 100644 --- a/js/src/methodjit/MethodJIT.cpp +++ b/js/src/methodjit/MethodJIT.cpp @@ -1328,7 +1328,7 @@ JITScript::destroyChunk(FreeOp *fop, unsigned chunkIndex, bool resetUses) ChunkDescriptor &desc = chunkDescriptor(chunkIndex); if (desc.chunk) { - Probes::discardMJITCode(fop, this, script, desc.chunk->code.m_code.executableAddress()); + Probes::discardMJITCode(fop, this, desc.chunk, desc.chunk->code.m_code.executableAddress()); fop->delete_(desc.chunk); desc.chunk = NULL; @@ -1484,6 +1484,8 @@ JITScript::nativeToPC(void *returnAddress, CallSite **pinline) JITChunk *chunk = findCodeChunk(returnAddress); JS_ASSERT(chunk); + JS_ASSERT(chunk->isValidCode(returnAddress)); + size_t low = 0; size_t high = chunk->nCallICs; js::mjit::ic::CallICInfo *callICs_ = chunk->callICs(); From 6141585084e9814cdb29ec64f97c647545798039 Mon Sep 17 00:00:00 2001 From: Justin Lebar Date: Wed, 18 Apr 2012 11:30:42 +1000 Subject: [PATCH 083/182] Bug 745662 - Trigger a fatal release-time crash when the discard tracker is used off the main thread. r=joe --- image/src/DiscardTracker.cpp | 21 +++++++++++++++++++++ image/src/DiscardTracker.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/image/src/DiscardTracker.cpp b/image/src/DiscardTracker.cpp index fb9e03b5c14..7456a352f2d 100644 --- a/image/src/DiscardTracker.cpp +++ b/image/src/DiscardTracker.cpp @@ -45,6 +45,8 @@ DiscardTimeoutChangedCallback(const char* aPref, void *aClosure) nsresult DiscardTracker::Reset(Node *node) { + EnsureMainThread(); + // We shouldn't call Reset() with a null |img| pointer, on images which can't // be discarded, or on animated images (which should be marked as // non-discardable, anyway). @@ -84,6 +86,8 @@ DiscardTracker::Reset(Node *node) void DiscardTracker::Remove(Node *node) { + EnsureMainThread(); + if (node->isInList()) node->remove(); @@ -97,6 +101,8 @@ DiscardTracker::Remove(Node *node) void DiscardTracker::Shutdown() { + EnsureMainThread(); + if (sTimer) { sTimer->Cancel(); sTimer = NULL; @@ -109,6 +115,8 @@ DiscardTracker::Shutdown() void DiscardTracker::DiscardAll() { + EnsureMainThread(); + if (!sInitialized) return; @@ -126,6 +134,8 @@ DiscardTracker::DiscardAll() void DiscardTracker::InformAllocation(PRInt64 bytes) { + EnsureMainThread(); + // This function is called back e.g. from RasterImage::Discard(); be careful! sCurrentDecodedImageBytes += bytes; @@ -136,6 +146,17 @@ DiscardTracker::InformAllocation(PRInt64 bytes) MaybeDiscardSoon(); } +void +DiscardTracker::EnsureMainThread() +{ + // NS_RUNTIMEABORT is a fatal crash even in release builds. We need to crash + // release builds here in order to investigate bug 745141 -- we're being + // called from off main thread, but we don't know how! + if (!NS_IsMainThread()) { + NS_RUNTIMEABORT("Must be on main thread!"); + } +} + /** * Initialize the tracker. */ diff --git a/image/src/DiscardTracker.h b/image/src/DiscardTracker.h index ef51e5c59ec..7713ef7146f 100644 --- a/image/src/DiscardTracker.h +++ b/image/src/DiscardTracker.h @@ -100,6 +100,8 @@ class DiscardTracker static void TimerCallback(nsITimer *aTimer, void *aClosure); static void DiscardNow(); + static void EnsureMainThread(); + static LinkedList sDiscardableImages; static nsCOMPtr sTimer; static bool sInitialized; From 79aadde3ffd53c9837e6c30b45562b8566456f81 Mon Sep 17 00:00:00 2001 From: Justin Lebar Date: Wed, 18 Apr 2012 13:22:20 +1000 Subject: [PATCH 084/182] Back out bug 745662 (changeset b938f2e550c0) -- it's done its job, triggered the crash we were looking for. --- image/src/DiscardTracker.cpp | 21 --------------------- image/src/DiscardTracker.h | 2 -- 2 files changed, 23 deletions(-) diff --git a/image/src/DiscardTracker.cpp b/image/src/DiscardTracker.cpp index 7456a352f2d..fb9e03b5c14 100644 --- a/image/src/DiscardTracker.cpp +++ b/image/src/DiscardTracker.cpp @@ -45,8 +45,6 @@ DiscardTimeoutChangedCallback(const char* aPref, void *aClosure) nsresult DiscardTracker::Reset(Node *node) { - EnsureMainThread(); - // We shouldn't call Reset() with a null |img| pointer, on images which can't // be discarded, or on animated images (which should be marked as // non-discardable, anyway). @@ -86,8 +84,6 @@ DiscardTracker::Reset(Node *node) void DiscardTracker::Remove(Node *node) { - EnsureMainThread(); - if (node->isInList()) node->remove(); @@ -101,8 +97,6 @@ DiscardTracker::Remove(Node *node) void DiscardTracker::Shutdown() { - EnsureMainThread(); - if (sTimer) { sTimer->Cancel(); sTimer = NULL; @@ -115,8 +109,6 @@ DiscardTracker::Shutdown() void DiscardTracker::DiscardAll() { - EnsureMainThread(); - if (!sInitialized) return; @@ -134,8 +126,6 @@ DiscardTracker::DiscardAll() void DiscardTracker::InformAllocation(PRInt64 bytes) { - EnsureMainThread(); - // This function is called back e.g. from RasterImage::Discard(); be careful! sCurrentDecodedImageBytes += bytes; @@ -146,17 +136,6 @@ DiscardTracker::InformAllocation(PRInt64 bytes) MaybeDiscardSoon(); } -void -DiscardTracker::EnsureMainThread() -{ - // NS_RUNTIMEABORT is a fatal crash even in release builds. We need to crash - // release builds here in order to investigate bug 745141 -- we're being - // called from off main thread, but we don't know how! - if (!NS_IsMainThread()) { - NS_RUNTIMEABORT("Must be on main thread!"); - } -} - /** * Initialize the tracker. */ diff --git a/image/src/DiscardTracker.h b/image/src/DiscardTracker.h index 7713ef7146f..ef51e5c59ec 100644 --- a/image/src/DiscardTracker.h +++ b/image/src/DiscardTracker.h @@ -100,8 +100,6 @@ class DiscardTracker static void TimerCallback(nsITimer *aTimer, void *aClosure); static void DiscardNow(); - static void EnsureMainThread(); - static LinkedList sDiscardableImages; static nsCOMPtr sTimer; static bool sInitialized; From b2aeb24653008681d5cccbfb81081c8660b3b331 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Tue, 17 Apr 2012 20:50:19 +0300 Subject: [PATCH 085/182] Bug 745528 - execCommand() should apply style="" to only inline elements, not blocks; r=ehsan --- editor/libeditor/html/nsHTMLEditorStyle.cpp | 124 +++++---- .../lib/richtext2/currentStatus.js | 248 +++++++++--------- layout/reftests/bugs/388980-1-ref.html | 4 +- 3 files changed, 186 insertions(+), 190 deletions(-) diff --git a/editor/libeditor/html/nsHTMLEditorStyle.cpp b/editor/libeditor/html/nsHTMLEditorStyle.cpp index 995458df503..b8fbb45f46d 100644 --- a/editor/libeditor/html/nsHTMLEditorStyle.cpp +++ b/editor/libeditor/html/nsHTMLEditorStyle.cpp @@ -374,11 +374,46 @@ nsHTMLEditor::SetInlinePropertyOnNode( nsIDOMNode *aNode, aProperty->ToString(tag); ToLowerCase(tag); + // If this is an element that can't be contained in a span, we have to + // recurse to its children. + if (!TagCanContain(NS_LITERAL_STRING("span"), aNode)) { + nsCOMPtr childNodes; + res = aNode->GetChildNodes(getter_AddRefs(childNodes)); + NS_ENSURE_SUCCESS(res, res); + if (childNodes) { + PRInt32 j; + PRUint32 childCount; + childNodes->GetLength(&childCount); + if (childCount) { + nsCOMArray arrayOfNodes; + nsCOMPtr node; + + // populate the list + for (j = 0; j < (PRInt32)childCount; j++) { + nsCOMPtr childNode; + res = childNodes->Item(j, getter_AddRefs(childNode)); + if ((NS_SUCCEEDED(res)) && childNode && IsEditable(childNode)) { + arrayOfNodes.AppendObject(childNode); + } + } + + // then loop through the list, set the property on each node + PRInt32 listCount = arrayOfNodes.Count(); + for (j = 0; j < listCount; j++) { + node = arrayOfNodes[j]; + res = SetInlinePropertyOnNode(node, aProperty, aAttribute, aValue); + NS_ENSURE_SUCCESS(res, res); + } + } + } + return res; + } + bool useCSS = (IsCSSEnabled() && mHTMLCSSUtils->IsCSSEditableProperty(aNode, aProperty, aAttribute)) || // bgcolor is always done using CSS aAttribute->EqualsLiteral("bgcolor"); - + if (useCSS) { nsCOMPtr tmp = aNode; if (IsTextNode(tmp)) @@ -444,72 +479,33 @@ nsHTMLEditor::SetInlinePropertyOnNode( nsIDOMNode *aNode, return SetAttribute(elem, *aAttribute, *aValue); } - // can it be put inside inline node? - if (TagCanContain(tag, aNode)) + // Either put it inside a neighboring node, or make a new one. + + nsCOMPtr priorNode, nextNode; + // is either of it's neighbors the right kind of node? + GetPriorHTMLSibling(aNode, address_of(priorNode)); + GetNextHTMLSibling(aNode, address_of(nextNode)); + if (priorNode && NodeIsType(priorNode, aProperty) && + HasAttrVal(priorNode, aAttribute, aValue) && + IsOnlyAttribute(priorNode, aAttribute) ) { - nsCOMPtr priorNode, nextNode; - // is either of it's neighbors the right kind of node? - GetPriorHTMLSibling(aNode, address_of(priorNode)); - GetNextHTMLSibling(aNode, address_of(nextNode)); - if (priorNode && NodeIsType(priorNode, aProperty) && - HasAttrVal(priorNode, aAttribute, aValue) && - IsOnlyAttribute(priorNode, aAttribute) ) - { - // previous sib is already right kind of inline node; slide this over into it - res = MoveNode(aNode, priorNode, -1); - } - else if (nextNode && NodeIsType(nextNode, aProperty) && - HasAttrVal(nextNode, aAttribute, aValue) && - IsOnlyAttribute(priorNode, aAttribute) ) - { - // following sib is already right kind of inline node; slide this over into it - res = MoveNode(aNode, nextNode, 0); - } - else - { - // ok, chuck it in its very own container - res = InsertContainerAbove(aNode, address_of(tmp), tag, aAttribute, aValue); - } - NS_ENSURE_SUCCESS(res, res); - return RemoveStyleInside(aNode, aProperty, aAttribute); + // previous sib is already right kind of inline node; slide this over into it + res = MoveNode(aNode, priorNode, -1); + } + else if (nextNode && NodeIsType(nextNode, aProperty) && + HasAttrVal(nextNode, aAttribute, aValue) && + IsOnlyAttribute(priorNode, aAttribute) ) + { + // following sib is already right kind of inline node; slide this over into it + res = MoveNode(aNode, nextNode, 0); + } + else + { + // ok, chuck it in its very own container + res = InsertContainerAbove(aNode, address_of(tmp), tag, aAttribute, aValue); } - // none of the above? then cycle through the children. - nsCOMPtr childNodes; - res = aNode->GetChildNodes(getter_AddRefs(childNodes)); NS_ENSURE_SUCCESS(res, res); - if (childNodes) - { - PRInt32 j; - PRUint32 childCount; - childNodes->GetLength(&childCount); - if (childCount) - { - nsCOMArray arrayOfNodes; - nsCOMPtr node; - - // populate the list - for (j=0 ; j < (PRInt32)childCount; j++) - { - nsCOMPtr childNode; - res = childNodes->Item(j, getter_AddRefs(childNode)); - if ((NS_SUCCEEDED(res)) && (childNode) && IsEditable(childNode)) - { - arrayOfNodes.AppendObject(childNode); - } - } - - // then loop through the list, set the property on each node - PRInt32 listCount = arrayOfNodes.Count(); - for (j = 0; j < listCount; j++) - { - node = arrayOfNodes[j]; - res = SetInlinePropertyOnNode(node, aProperty, aAttribute, aValue); - NS_ENSURE_SUCCESS(res, res); - } - arrayOfNodes.Clear(); - } - } - return res; + return RemoveStyleInside(aNode, aProperty, aAttribute); } diff --git a/editor/libeditor/html/tests/browserscope/lib/richtext2/currentStatus.js b/editor/libeditor/html/tests/browserscope/lib/richtext2/currentStatus.js index b8311b147fa..93ff319df25 100644 --- a/editor/libeditor/html/tests/browserscope/lib/richtext2/currentStatus.js +++ b/editor/libeditor/html/tests/browserscope/lib/richtext2/currentStatus.js @@ -5922,15 +5922,15 @@ const TEST_RESULTS = { "bodyOuterHTML": "`[foobarbaz]´" }, "div": { - "valscore": 0, - "selscore": 0, - "valresult": 6, - "selresult": 3, - "output": "
`[foobarbaz]´
", - "innerHTML": "`[foobarbaz]´", - "outerHTML": "
`[foobarbaz]´
", - "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", - "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" + "valscore": 1, + "selscore": 1, + "valresult": 8, + "selresult": 5, + "output": "`[foobarbaz]´", + "innerHTML": "`[foobarbaz]´", + "outerHTML": "
`[foobarbaz]´
", + "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", + "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" } }, "BC:00f_SPANs:bc:f00-1_SW": { @@ -5957,15 +5957,15 @@ const TEST_RESULTS = { "bodyOuterHTML": "`[foobarbaz]´" }, "div": { - "valscore": 0, - "selscore": 0, - "valresult": 6, - "selresult": 3, - "output": "
`[foobarbaz]´
", - "innerHTML": "`[foobarbaz]´", - "outerHTML": "
`[foobarbaz]´
", - "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", - "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" + "valscore": 1, + "selscore": 1, + "valresult": 8, + "selresult": 5, + "output": "`[foobarbaz]´", + "innerHTML": "`[foobarbaz]´", + "outerHTML": "
`[foobarbaz]´
", + "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", + "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" } }, "BC:ace_FONT.ass.s:bc:rgb-1_SW": { @@ -5992,15 +5992,15 @@ const TEST_RESULTS = { "bodyOuterHTML": "`[foobarbaz]´" }, "div": { - "valscore": 0, - "selscore": 0, - "valresult": 6, - "selresult": 3, - "output": "
`[foobarbaz]´
", - "innerHTML": "`[foobarbaz]´", - "outerHTML": "
`[foobarbaz]´
", - "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", - "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" + "valscore": 1, + "selscore": 1, + "valresult": 8, + "selresult": 5, + "output": "`[foobarbaz]´", + "innerHTML": "`[foobarbaz]´", + "outerHTML": "
`[foobarbaz]´
", + "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", + "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" } }, "FC:g_FONTc:b-1_SW": { @@ -6167,15 +6167,15 @@ const TEST_RESULTS = { "bodyOuterHTML": "`[foobarbaz]´" }, "div": { - "valscore": 0, - "selscore": 0, - "valresult": 6, - "selresult": 3, - "output": "
`[foobarbaz]´
", - "innerHTML": "`[foobarbaz]´", - "outerHTML": "
`[foobarbaz]´
", - "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", - "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" + "valscore": 1, + "selscore": 1, + "valresult": 8, + "selresult": 5, + "output": "`[foobarbaz]´", + "innerHTML": "`[foobarbaz]´", + "outerHTML": "
`[foobarbaz]´
", + "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", + "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" } }, "HC:g_SPANs:c:g-1_SW": { @@ -6202,15 +6202,15 @@ const TEST_RESULTS = { "bodyOuterHTML": "`[foobarbaz]´" }, "div": { - "valscore": 0, - "selscore": 0, - "valresult": 6, - "selresult": 3, - "output": "
`[foobarbaz]´
", - "innerHTML": "`[foobarbaz]´", - "outerHTML": "
`[foobarbaz]´
", - "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", - "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" + "valscore": 1, + "selscore": 1, + "valresult": 8, + "selresult": 5, + "output": "`[foobarbaz]´", + "innerHTML": "`[foobarbaz]´", + "outerHTML": "
`[foobarbaz]´
", + "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", + "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" } }, "HC:g_SPAN.ass.s:c:rgb-1_SW": { @@ -6237,15 +6237,15 @@ const TEST_RESULTS = { "bodyOuterHTML": "`[foobarbaz]´" }, "div": { - "valscore": 0, - "selscore": 0, - "valresult": 6, - "selresult": 3, - "output": "
`[foobarbaz]´
", - "innerHTML": "`[foobarbaz]´", - "outerHTML": "
`[foobarbaz]´
", - "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", - "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" + "valscore": 1, + "selscore": 1, + "valresult": 8, + "selresult": 5, + "output": "`[foobarbaz]´", + "innerHTML": "`[foobarbaz]´", + "outerHTML": "
`[foobarbaz]´
", + "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", + "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" } }, "FN:c_FONTf:a-1_SW": { @@ -6976,15 +6976,15 @@ const TEST_RESULTS = { "bodyOuterHTML": "`[foobarbaz]´" }, "div": { - "valscore": 0, - "selscore": 0, - "valresult": 6, - "selresult": 3, - "output": "
`[foobarbaz]´
", - "innerHTML": "`[foobarbaz]´", - "outerHTML": "
`[foobarbaz]´
", - "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", - "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" + "valscore": 1, + "selscore": 1, + "valresult": 8, + "selresult": 5, + "output": "`[foobarbaz]´", + "innerHTML": "`[foobarbaz]´", + "outerHTML": "
`[foobarbaz]´
", + "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", + "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" } }, "BC:gray_SPANs:bc:b-1_SO": { @@ -7011,15 +7011,15 @@ const TEST_RESULTS = { "bodyOuterHTML": "{`foobarbaz´}" }, "div": { - "valscore": 0, - "selscore": 0, - "valresult": 6, - "selresult": 3, - "output": "
{`foobarbaz´}
", - "innerHTML": "{`foobarbaz´}", - "outerHTML": "
{`foobarbaz´}
", - "bodyInnerHTML": "CAN
ARY
{`foobarbaz´}
CAN
ARY", - "bodyOuterHTML": "CAN
ARY
{`foobarbaz´}
CAN
ARY" + "valscore": 1, + "selscore": 1, + "valresult": 8, + "selresult": 5, + "output": "{`foobarbaz´}", + "innerHTML": "{`foobarbaz´}", + "outerHTML": "
{`foobarbaz´}
", + "bodyInnerHTML": "CAN
ARY
{`foobarbaz´}
CAN
ARY", + "bodyOuterHTML": "CAN
ARY
{`foobarbaz´}
CAN
ARY" } }, "BC:gray_SPANs:bc:b-1_SI": { @@ -7063,33 +7063,33 @@ const TEST_RESULTS = { "selscore": 1, "valresult": 8, "selresult": 5, - "output": "

`[foobarbaz]´

", - "innerHTML": "

`[foobarbaz]´

", - "outerHTML": "

`[foobarbaz]´

", - "bodyInnerHTML": "

`[foobarbaz]´

", - "bodyOuterHTML": "

`[foobarbaz]´

" + "output": "

`[foobarbaz]´

", + "innerHTML": "

`[foobarbaz]´

", + "outerHTML": "

`[foobarbaz]´

", + "bodyInnerHTML": "

`[foobarbaz]´

", + "bodyOuterHTML": "

`[foobarbaz]´

" }, "body": { "valscore": 1, "selscore": 1, "valresult": 8, "selresult": 5, - "output": "

`[foobarbaz]´

", - "innerHTML": "

`[foobarbaz]´

", - "outerHTML": "

`[foobarbaz]´

", - "bodyInnerHTML": "

`[foobarbaz]´

", - "bodyOuterHTML": "

`[foobarbaz]´

" + "output": "

`[foobarbaz]´

", + "innerHTML": "

`[foobarbaz]´

", + "outerHTML": "

`[foobarbaz]´

", + "bodyInnerHTML": "

`[foobarbaz]´

", + "bodyOuterHTML": "

`[foobarbaz]´

" }, "div": { - "valscore": 0, - "selscore": 0, - "valresult": 6, - "selresult": 3, - "output": "

`[foobarbaz]´

", - "innerHTML": "

`[foobarbaz]´

", - "outerHTML": "

`[foobarbaz]´

", - "bodyInnerHTML": "CAN
ARY

`[foobarbaz]´

CAN
ARY", - "bodyOuterHTML": "CAN
ARY

`[foobarbaz]´

CAN
ARY" + "valscore": 1, + "selscore": 1, + "valresult": 8, + "selresult": 5, + "output": "

`[foobarbaz]´

", + "innerHTML": "

`[foobarbaz]´

", + "outerHTML": "

`[foobarbaz]´

", + "bodyInnerHTML": "CAN
ARY

`[foobarbaz]´

CAN
ARY", + "bodyOuterHTML": "CAN
ARY

`[foobarbaz]´

CAN
ARY" } }, "BC:gray_P-SPANs:bc:b-2_SW": { @@ -7291,15 +7291,15 @@ const TEST_RESULTS = { "bodyOuterHTML": "`[foobarbaz]´" }, "div": { - "valscore": 0, - "selscore": 0, - "valresult": 6, - "selresult": 3, - "output": "
`[foobarbaz]´
", - "innerHTML": "`[foobarbaz]´", - "outerHTML": "
`[foobarbaz]´
", - "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", - "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" + "valscore": 1, + "selscore": 1, + "valresult": 8, + "selresult": 5, + "output": "`[foobarbaz]´", + "innerHTML": "`[foobarbaz]´", + "outerHTML": "
`[foobarbaz]´
", + "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", + "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" } }, "FN:c_FONTf:a-1_SW": { @@ -7330,11 +7330,11 @@ const TEST_RESULTS = { "selscore": 0, "valresult": 6, "selresult": 3, - "output": "
`[foobarbaz]´
", - "innerHTML": "`[foobarbaz]´", - "outerHTML": "
`[foobarbaz]´
", - "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", - "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" + "output": "`[foobarbaz]´", + "innerHTML": "`[foobarbaz]´", + "outerHTML": "
`[foobarbaz]´
", + "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", + "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" } }, "FN:c_FONTf:a-1_SI": { @@ -7435,11 +7435,11 @@ const TEST_RESULTS = { "selscore": 0, "valresult": 6, "selresult": 3, - "output": "
`[foobarbaz]´
", - "innerHTML": "`[foobarbaz]´", - "outerHTML": "
`[foobarbaz]´
", - "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", - "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" + "output": "`[foobarbaz]´", + "innerHTML": "`[foobarbaz]´", + "outerHTML": "
`[foobarbaz]´
", + "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", + "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" } }, "FN:a_FONTf:a-1_SO": { @@ -7470,11 +7470,11 @@ const TEST_RESULTS = { "selscore": 0, "valresult": 6, "selresult": 3, - "output": "
{`foobarbaz´}
", - "innerHTML": "{`foobarbaz´}", - "outerHTML": "
{`foobarbaz´}
", - "bodyInnerHTML": "CAN
ARY
{`foobarbaz´}
CAN
ARY", - "bodyOuterHTML": "CAN
ARY
{`foobarbaz´}
CAN
ARY" + "output": "{`foobarbaz´}", + "innerHTML": "{`foobarbaz´}", + "outerHTML": "
{`foobarbaz´}
", + "bodyInnerHTML": "CAN
ARY
{`foobarbaz´}
CAN
ARY", + "bodyOuterHTML": "CAN
ARY
{`foobarbaz´}
CAN
ARY" } }, "FN:a_SPANs:ff:a-1_SI": { @@ -7501,15 +7501,15 @@ const TEST_RESULTS = { "bodyOuterHTML": "`[foobarbaz]´" }, "div": { - "valscore": 0, - "selscore": 0, - "valresult": 6, - "selresult": 3, - "output": "
`[foobarbaz]´
", - "innerHTML": "`[foobarbaz]´", - "outerHTML": "
`[foobarbaz]´
", - "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", - "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" + "valscore": 1, + "selscore": 1, + "valresult": 8, + "selresult": 5, + "output": "`[foobarbaz]´", + "innerHTML": "`[foobarbaz]´", + "outerHTML": "
`[foobarbaz]´
", + "bodyInnerHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY", + "bodyOuterHTML": "CAN
ARY
`[foobarbaz]´
CAN
ARY" } }, "FN:c_FONTf:a-2_SL": { diff --git a/layout/reftests/bugs/388980-1-ref.html b/layout/reftests/bugs/388980-1-ref.html index 5c5e4277f95..8b14d7e185c 100644 --- a/layout/reftests/bugs/388980-1-ref.html +++ b/layout/reftests/bugs/388980-1-ref.html @@ -4,8 +4,8 @@ + +Mozilla Bug 745685 +Test text +1 +2 +3 +4 +5 +6 +7 + From 7d3b10e9e20ca4f818e008b35a5add8ad1a6f900 Mon Sep 17 00:00:00 2001 From: Daniel Holbert Date: Thu, 19 Apr 2012 10:38:00 -0700 Subject: [PATCH 103/182] Bug 746646: Remove useless bounds-check for unsigned >= 0 in nsContentEventHandler::ExpandToClusterBoundary. r=masayuki --- content/events/src/nsContentEventHandler.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/events/src/nsContentEventHandler.cpp b/content/events/src/nsContentEventHandler.cpp index d9bd3bffec5..ef78387c782 100644 --- a/content/events/src/nsContentEventHandler.cpp +++ b/content/events/src/nsContentEventHandler.cpp @@ -357,8 +357,8 @@ static nsresult GenerateFlatTextContent(nsRange* aRange, nsresult nsContentEventHandler::ExpandToClusterBoundary(nsIContent* aContent, - bool aForward, - PRUint32* aXPOffset) + bool aForward, + PRUint32* aXPOffset) { // XXX This method assumes that the frame boundaries must be cluster // boundaries. It's false, but no problem now, maybe. @@ -366,7 +366,7 @@ nsContentEventHandler::ExpandToClusterBoundary(nsIContent* aContent, *aXPOffset == 0 || *aXPOffset == aContent->TextLength()) return NS_OK; - NS_ASSERTION(*aXPOffset >= 0 && *aXPOffset <= aContent->TextLength(), + NS_ASSERTION(*aXPOffset <= aContent->TextLength(), "offset is out of range."); nsRefPtr fs = mPresShell->FrameSelection(); From ceda947d1e3f348465607e764e3b74bda5cf3f56 Mon Sep 17 00:00:00 2001 From: Justin Lebar Date: Fri, 20 Apr 2012 09:54:43 +1000 Subject: [PATCH 104/182] Bug 714861 - Run - - From fbfac2ce86b992600ede8dd9675fee07c3e6306d Mon Sep 17 00:00:00 2001 From: Gabor Krizsanits Date: Tue, 24 Apr 2012 21:47:54 -0400 Subject: [PATCH 122/182] Bug 735280 - Part 1: Connect XPCWrappedNativeScope and Components. r=bholley --- js/xpconnect/src/XPCComponents.cpp | 8 +++++--- js/xpconnect/src/XPCWrappedNativeScope.cpp | 15 ++++++++++++--- js/xpconnect/src/xpcprivate.h | 7 +++++-- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/js/xpconnect/src/XPCComponents.cpp b/js/xpconnect/src/XPCComponents.cpp index a712e196782..15f8ac927b5 100644 --- a/js/xpconnect/src/XPCComponents.cpp +++ b/js/xpconnect/src/XPCComponents.cpp @@ -4245,8 +4245,9 @@ nsXPCComponents::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc) return NS_ERROR_NOT_AVAILABLE; } -nsXPCComponents::nsXPCComponents() - : mInterfaces(nsnull), +nsXPCComponents::nsXPCComponents(XPCWrappedNativeScope* aScope) + : mScope(aScope), + mInterfaces(nsnull), mInterfacesByID(nsnull), mClasses(nsnull), mClassesByID(nsnull), @@ -4256,6 +4257,7 @@ nsXPCComponents::nsXPCComponents() mConstructor(nsnull), mUtils(nsnull) { + MOZ_ASSERT(aScope, "aScope must not be null"); } nsXPCComponents::~nsXPCComponents() @@ -4434,7 +4436,7 @@ nsXPCComponents::AttachNewComponentsObject(XPCCallContext& ccx, if (!aGlobal) return false; - nsXPCComponents* components = new nsXPCComponents(); + nsXPCComponents* components = new nsXPCComponents(aScope); if (!components) return false; diff --git a/js/xpconnect/src/XPCWrappedNativeScope.cpp b/js/xpconnect/src/XPCWrappedNativeScope.cpp index 1a58273759b..1fbe13f9f3b 100644 --- a/js/xpconnect/src/XPCWrappedNativeScope.cpp +++ b/js/xpconnect/src/XPCWrappedNativeScope.cpp @@ -190,11 +190,15 @@ XPCWrappedNativeScope::IsDyingScope(XPCWrappedNativeScope *scope) void XPCWrappedNativeScope::SetComponents(nsXPCComponents* aComponents) { - NS_IF_ADDREF(aComponents); - NS_IF_RELEASE(mComponents); mComponents = aComponents; } +nsXPCComponents* +XPCWrappedNativeScope::GetComponents() +{ + return mComponents; +} + // Dummy JS class to let wrappers w/o an xpc prototype share // scopes. By doing this we avoid allocating a new scope for every // wrapper on creation of the wrapper, and most wrappers won't need @@ -308,9 +312,14 @@ XPCWrappedNativeScope::~XPCWrappedNativeScope() if (mContext) mContext->RemoveScope(this); + // This should not be necessary, since the Components object should die + // with the scope but just in case. + if (mComponents) + mComponents->mScope = nsnull; + // XXX we should assert that we are dead or that xpconnect has shutdown // XXX might not want to do this at xpconnect shutdown time??? - NS_IF_RELEASE(mComponents); + mComponents = nsnull; JSRuntime *rt = mRuntime->GetJSRuntime(); mGlobalJSObject.finalize(rt); diff --git a/js/xpconnect/src/xpcprivate.h b/js/xpconnect/src/xpcprivate.h index 9b0733ded1f..d9fde002840 100644 --- a/js/xpconnect/src/xpcprivate.h +++ b/js/xpconnect/src/xpcprivate.h @@ -1610,6 +1610,7 @@ public: IsDyingScope(XPCWrappedNativeScope *scope); void SetComponents(nsXPCComponents* aComponents); + nsXPCComponents *GetComponents(); void SetGlobal(XPCCallContext& ccx, JSObject* aGlobal, nsISupports* aNative); static void InitStatics() { gScopes = nsnull; gDyingScopes = nsnull; } @@ -1659,7 +1660,7 @@ private: Native2WrappedNativeMap* mWrappedNativeMap; ClassInfo2WrappedNativeProtoMap* mWrappedNativeProtoMap; ClassInfo2WrappedNativeProtoMap* mMainThreadWrappedNativeProtoMap; - nsXPCComponents* mComponents; + nsRefPtr mComponents; XPCWrappedNativeScope* mNext; // The JS global object for this scope. If non-null, this will be the // default parent for the XPCWrappedNatives that have us as the scope, @@ -3911,10 +3912,12 @@ public: virtual ~nsXPCComponents(); private: - nsXPCComponents(); + nsXPCComponents(XPCWrappedNativeScope* aScope); void ClearMembers(); private: + friend class XPCWrappedNativeScope; + XPCWrappedNativeScope* mScope; nsXPCComponents_Interfaces* mInterfaces; nsXPCComponents_InterfacesByID* mInterfacesByID; nsXPCComponents_Classes* mClasses; From 5e3c4050c61a0b1361a323d011659cf32b4cb70a Mon Sep 17 00:00:00 2001 From: Gabor Krizsanits Date: Tue, 24 Apr 2012 21:48:01 -0400 Subject: [PATCH 123/182] Bug 735280 - Part 2: Add pre-create to nsXPComponents. r=bholley --- js/xpconnect/src/XPCComponents.cpp | 34 ++++++++++++++++++++++-------- js/xpconnect/src/nsXPConnect.cpp | 4 ++-- js/xpconnect/src/xpcprivate.h | 6 +++--- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/js/xpconnect/src/XPCComponents.cpp b/js/xpconnect/src/XPCComponents.cpp index 15f8ac927b5..d4a94e49ea1 100644 --- a/js/xpconnect/src/XPCComponents.cpp +++ b/js/xpconnect/src/XPCComponents.cpp @@ -4193,7 +4193,8 @@ NS_IMETHODIMP nsXPCComponents::GetHelperForLanguage(PRUint32 language, nsISupports **retval) { - *retval = nsnull; + *retval = static_cast(this); + NS_ADDREF(this); return NS_OK; } @@ -4341,6 +4342,7 @@ nsXPCComponents::GetManager(nsIComponentManager * *aManager) #define XPC_MAP_WANT_NEWRESOLVE #define XPC_MAP_WANT_GETPROPERTY #define XPC_MAP_WANT_SETPROPERTY +#define XPC_MAP_WANT_PRECREATE #define XPC_MAP_FLAGS nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE #include "xpc_map_end.h" /* This will #undef the above */ @@ -4429,16 +4431,20 @@ nsXPCComponents::SetProperty(nsIXPConnectWrappedNative *wrapper, // static JSBool -nsXPCComponents::AttachNewComponentsObject(XPCCallContext& ccx, - XPCWrappedNativeScope* aScope, - JSObject* aGlobal) +nsXPCComponents::AttachComponentsObject(XPCCallContext& ccx, + XPCWrappedNativeScope* aScope, + JSObject* aGlobal) { if (!aGlobal) return false; - nsXPCComponents* components = new nsXPCComponents(aScope); - if (!components) - return false; + nsXPCComponents* components = aScope->GetComponents(); + if (!components) { + components = new nsXPCComponents(aScope); + if (!components) + return false; + aScope->SetComponents(components); + } nsCOMPtr cholder(components); @@ -4454,8 +4460,6 @@ nsXPCComponents::AttachNewComponentsObject(XPCCallContext& ccx, if (!wrapper) return false; - aScope->SetComponents(components); - jsid id = ccx.GetRuntime()->GetStringID(XPCJSRuntime::IDX_COMPONENTS); JSObject* obj; @@ -4530,3 +4534,15 @@ nsXPCComponents::CanSetProperty(const nsIID * iid, const PRUnichar *propertyName *_retval = nsnull; return NS_OK; } + +NS_IMETHODIMP +nsXPCComponents::PreCreate(nsISupports *nativeObj, JSContext *cx, JSObject *globalObj, JSObject **parentObj) +{ + // this should never happen + if (!mScope) { + NS_WARNING("mScope must not be null when nsXPCComponents::PreCreate is called"); + return NS_ERROR_FAILURE; + } + *parentObj = mScope->GetGlobalJSObject(); + return NS_OK; +} \ No newline at end of file diff --git a/js/xpconnect/src/nsXPConnect.cpp b/js/xpconnect/src/nsXPConnect.cpp index 8526ab88d32..e3dee711c44 100644 --- a/js/xpconnect/src/nsXPConnect.cpp +++ b/js/xpconnect/src/nsXPConnect.cpp @@ -1131,7 +1131,7 @@ nsXPConnect::InitClasses(JSContext * aJSContext, JSObject * aGlobalJSObj) scope->RemoveWrappedNativeProtos(); - if (!nsXPCComponents::AttachNewComponentsObject(ccx, scope, aGlobalJSObj)) + if (!nsXPCComponents::AttachComponentsObject(ccx, scope, aGlobalJSObj)) return UnexpectedFailure(NS_ERROR_FAILURE); if (XPCPerThreadData::IsMainThread(ccx)) { @@ -1333,7 +1333,7 @@ nsXPConnect::InitClassesWithNewWrappedGlobal(JSContext * aJSContext, if (!(aFlags & nsIXPConnect::OMIT_COMPONENTS_OBJECT)) { // XPCCallContext gives us an active request needed to save/restore. - if (!nsXPCComponents::AttachNewComponentsObject(ccx, wrappedGlobal->GetScope(), global)) + if (!nsXPCComponents::AttachComponentsObject(ccx, wrappedGlobal->GetScope(), global)) return UnexpectedFailure(NS_ERROR_FAILURE); if (XPCPerThreadData::IsMainThread(ccx)) { diff --git a/js/xpconnect/src/xpcprivate.h b/js/xpconnect/src/xpcprivate.h index d9fde002840..e1161f27ec8 100644 --- a/js/xpconnect/src/xpcprivate.h +++ b/js/xpconnect/src/xpcprivate.h @@ -3903,9 +3903,9 @@ public: public: static JSBool - AttachNewComponentsObject(XPCCallContext& ccx, - XPCWrappedNativeScope* aScope, - JSObject* aGlobal); + AttachComponentsObject(XPCCallContext& ccx, + XPCWrappedNativeScope* aScope, + JSObject* aGlobal); void SystemIsBeingShutDown() {ClearMembers();} From 0a0e1a6bd0ffe6143b660c9060f9d0ba87091a10 Mon Sep 17 00:00:00 2001 From: Gabor Krizsanits Date: Tue, 24 Apr 2012 21:48:02 -0400 Subject: [PATCH 124/182] Bug 735280 - Part 3: Components object specific wrapper. r=bholley --- caps/tests/mochitest/test_bug246699.html | 11 +++-- js/src/tests/js1_5/Regress/regress-328897.js | 5 ++- js/xpconnect/src/XPCComponents.cpp | 14 ++++--- js/xpconnect/src/XPCWrappedNative.cpp | 6 +++ js/xpconnect/tests/unit/test_components.js | 43 ++++++++++++++++++++ js/xpconnect/tests/unit/xpcshell.ini | 1 + js/xpconnect/wrappers/AccessCheck.cpp | 25 ++++++++++++ js/xpconnect/wrappers/AccessCheck.h | 6 +++ js/xpconnect/wrappers/FilteringWrapper.cpp | 8 +++- js/xpconnect/wrappers/WrapperFactory.cpp | 23 +++++++++++ js/xpconnect/wrappers/WrapperFactory.h | 6 +++ 11 files changed, 136 insertions(+), 12 deletions(-) create mode 100644 js/xpconnect/tests/unit/test_components.js diff --git a/caps/tests/mochitest/test_bug246699.html b/caps/tests/mochitest/test_bug246699.html index e06f60d6b2f..8bbb3d5aedf 100644 --- a/caps/tests/mochitest/test_bug246699.html +++ b/caps/tests/mochitest/test_bug246699.html @@ -5,14 +5,14 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=246699 --> Test for Bug 246699 - + Mozilla Bug 246699

 
+          
   
 
 
 Mozilla Bug 246699
 

 
+  
+
+
+

+ +
+
+
+ + diff --git a/content/events/test/test_dom_mouse_event.html b/content/events/test/test_dom_mouse_event.html new file mode 100644 index 00000000000..b73b8d62784 --- /dev/null +++ b/content/events/test/test_dom_mouse_event.html @@ -0,0 +1,140 @@ + + + + Test for DOM MouseEvent + + + + +

+ +
+
+
+ + diff --git a/dom/interfaces/events/nsIDOMDragEvent.idl b/dom/interfaces/events/nsIDOMDragEvent.idl index b9b84723f7f..4618455e545 100644 --- a/dom/interfaces/events/nsIDOMDragEvent.idl +++ b/dom/interfaces/events/nsIDOMDragEvent.idl @@ -40,7 +40,7 @@ interface nsIDOMDataTransfer; -[scriptable, uuid(54cbd977-dae1-41ae-a155-a5ee5a5c6985)] +[scriptable, uuid(179c67d0-283e-4178-9b72-458313b197eb)] interface nsIDOMDragEvent : nsIDOMMouseEvent { readonly attribute nsIDOMDataTransfer dataTransfer; diff --git a/dom/interfaces/events/nsIDOMKeyEvent.idl b/dom/interfaces/events/nsIDOMKeyEvent.idl index d93023bfb9e..a795d8c4547 100644 --- a/dom/interfaces/events/nsIDOMKeyEvent.idl +++ b/dom/interfaces/events/nsIDOMKeyEvent.idl @@ -39,7 +39,7 @@ #include "nsIDOMUIEvent.idl" -[scriptable, uuid(def974c3-b491-481b-bc67-29174af4b26a)] +[scriptable, uuid(5d33fb45-dd4b-4342-bff8-ff33737b2b54)] interface nsIDOMKeyEvent : nsIDOMUIEvent { const unsigned long DOM_VK_CANCEL = 0x03; @@ -200,4 +200,6 @@ interface nsIDOMKeyEvent : nsIDOMUIEvent in boolean metaKeyArg, in unsigned long keyCodeArg, in unsigned long charCodeArg); + + bool getModifierState(in DOMString keyArg); }; diff --git a/dom/interfaces/events/nsIDOMMouseEvent.idl b/dom/interfaces/events/nsIDOMMouseEvent.idl index 518aad1f981..9387c891976 100644 --- a/dom/interfaces/events/nsIDOMMouseEvent.idl +++ b/dom/interfaces/events/nsIDOMMouseEvent.idl @@ -48,7 +48,7 @@ * http://www.w3.org/TR/DOM-Level-2-Events/ */ -[scriptable, uuid(8de83489-863a-4377-8ce4-f1965c23b8c7)] +[scriptable, uuid(22f9f2ef-18f0-4f8f-a459-6ec8cfaa4f59)] interface nsIDOMMouseEvent : nsIDOMUIEvent { readonly attribute long screenX; @@ -116,6 +116,8 @@ interface nsIDOMMouseEvent : nsIDOMUIEvent in nsIDOMEventTarget relatedTargetArg, in float pressure, in unsigned short inputSourceArg); + + bool getModifierState(in DOMString keyArg); }; dictionary MouseEventInit : UIEventInit diff --git a/dom/interfaces/events/nsIDOMMouseScrollEvent.idl b/dom/interfaces/events/nsIDOMMouseScrollEvent.idl index c4539b8a5f1..e9a61f4e300 100644 --- a/dom/interfaces/events/nsIDOMMouseScrollEvent.idl +++ b/dom/interfaces/events/nsIDOMMouseScrollEvent.idl @@ -38,7 +38,7 @@ #include "nsIDOMMouseEvent.idl" -[scriptable, uuid(E9CF55A5-0436-4F8B-91B6-7C14115B5033)] +[scriptable, uuid(6b3631e5-8244-480e-9015-b70e2f88cc81)] interface nsIDOMMouseScrollEvent : nsIDOMMouseEvent { const long HORIZONTAL_AXIS = 1; diff --git a/dom/interfaces/events/nsIDOMMozTouchEvent.idl b/dom/interfaces/events/nsIDOMMozTouchEvent.idl index aac5d53046a..088c540604e 100644 --- a/dom/interfaces/events/nsIDOMMozTouchEvent.idl +++ b/dom/interfaces/events/nsIDOMMozTouchEvent.idl @@ -40,7 +40,7 @@ #include "nsIDOMMouseEvent.idl" -[scriptable, uuid(0830197e-952c-4413-be83-a94e08f4f321)] +[scriptable, uuid(b908dcc3-955b-45ce-93f9-0bda953884f7)] interface nsIDOMMozTouchEvent : nsIDOMMouseEvent { readonly attribute unsigned long streamId; diff --git a/dom/interfaces/events/nsIDOMSimpleGestureEvent.idl b/dom/interfaces/events/nsIDOMSimpleGestureEvent.idl index 082a7dc7edd..0b20ddbea4f 100644 --- a/dom/interfaces/events/nsIDOMSimpleGestureEvent.idl +++ b/dom/interfaces/events/nsIDOMSimpleGestureEvent.idl @@ -97,7 +97,7 @@ * consuming events. */ -[scriptable, uuid(3aa7b4e8-b7a2-4e42-963d-b6d157eac1cd)] +[scriptable, uuid(2f8bca5a-3a7c-4d69-a87b-c668307db52f)] interface nsIDOMSimpleGestureEvent : nsIDOMMouseEvent { /* Swipe direction constants */ From b4b316af1857780629300d1e0a8c0acb174055b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Frontczak?= Date: Wed, 25 Apr 2012 12:06:21 +0900 Subject: [PATCH 145/182] Bug 727722 - Create an accessible for HTML table row by frame, r=tbsaunde, roc, surkov --- .../src/base/nsAccessibilityService.cpp | 17 ++++++++------ accessible/src/base/nsAccessibilityService.h | 2 ++ .../tests/mochitest/tree/test_table.html | 22 +++++++++++++++++++ layout/tables/nsTableRowFrame.cpp | 15 +++++++++++++ layout/tables/nsTableRowFrame.h | 4 ++++ 5 files changed, 53 insertions(+), 7 deletions(-) diff --git a/accessible/src/base/nsAccessibilityService.cpp b/accessible/src/base/nsAccessibilityService.cpp index d2de5ccb3ad..0d4c8c0a8ad 100644 --- a/accessible/src/base/nsAccessibilityService.cpp +++ b/accessible/src/base/nsAccessibilityService.cpp @@ -426,6 +426,16 @@ nsAccessibilityService::CreateHTMLTableCellAccessible(nsIContent* aContent, return accessible; } +already_AddRefed +nsAccessibilityService::CreateHTMLTableRowAccessible(nsIContent* aContent, + nsIPresShell* aPresShell) +{ + nsAccessible* accessible = + new nsEnumRoleAccessible(aContent, GetDocAccessible(aPresShell), roles::ROW); + NS_ADDREF(accessible); + return accessible; +} + already_AddRefed nsAccessibilityService::CreateHTMLTextAccessible(nsIContent* aContent, nsIPresShell* aPresShell) @@ -1684,13 +1694,6 @@ nsAccessibilityService::CreateHTMLAccessibleByMarkup(nsIFrame* aFrame, return accessible; } - if (tag == nsGkAtoms::tr) { - nsAccessible* accessible = new nsEnumRoleAccessible(aContent, aDoc, - roles::ROW); - NS_IF_ADDREF(accessible); - return accessible; - } - if (nsCoreUtils::IsHTMLTableHeader(aContent)) { nsAccessible* accessible = new nsHTMLTableHeaderCellAccessibleWrap(aContent, aDoc); diff --git a/accessible/src/base/nsAccessibilityService.h b/accessible/src/base/nsAccessibilityService.h index cdd7a8a9452..7fcb1614dc6 100644 --- a/accessible/src/base/nsAccessibilityService.h +++ b/accessible/src/base/nsAccessibilityService.h @@ -131,6 +131,8 @@ public: CreateHTMLTableAccessible(nsIContent* aContent, nsIPresShell* aPresShell); already_AddRefed CreateHTMLTableCellAccessible(nsIContent* aContent, nsIPresShell* aPresShell); + already_AddRefed + CreateHTMLTableRowAccessible(nsIContent* aContent, nsIPresShell* aPresShell); already_AddRefed CreateHTMLTextAccessible(nsIContent* aContent, nsIPresShell* aPresShell); already_AddRefed diff --git a/accessible/tests/mochitest/tree/test_table.html b/accessible/tests/mochitest/tree/test_table.html index 0269c935223..74d92b8e2f7 100644 --- a/accessible/tests/mochitest/tree/test_table.html +++ b/accessible/tests/mochitest/tree/test_table.html @@ -128,6 +128,17 @@ testAccessibleTree("table3", accTree); + ///////////////////////////////////////////////////////////////////////// + // table4 (display: table-row) + accTree = + { TABLE: [ + { ROW: [ + { CELL: [ + { TEXT_LEAF: [ ] } + ] } + ] } ] + }; + testAccessibleTree("table4", accTree); SimpleTest.finish(); } @@ -142,6 +153,11 @@ href="https://bugzilla.mozilla.org/show_bug.cgi?id=529621"> Mozilla Bug 529621 + + Mozilla Bug 727722 +

@@ -189,5 +205,11 @@
       cell
     
   
+
+  
+    
+
+ +
cell1
diff --git a/layout/tables/nsTableRowFrame.cpp b/layout/tables/nsTableRowFrame.cpp index b63cdb30723..2ae468f506c 100644 --- a/layout/tables/nsTableRowFrame.cpp +++ b/layout/tables/nsTableRowFrame.cpp @@ -50,6 +50,9 @@ #include "nsTableColFrame.h" #include "nsCOMPtr.h" #include "nsDisplayList.h" +#ifdef ACCESSIBILITY +#include "nsAccessibilityService.h" +#endif using namespace mozilla; @@ -1346,7 +1349,19 @@ void nsTableRowFrame::SetContinuousBCBorderWidth(PRUint8 aForSide, NS_ERROR("invalid NS_SIDE arg"); } } +#ifdef ACCESSIBILITY +already_AddRefed +nsTableRowFrame::CreateAccessible() +{ + nsAccessibilityService* accService = nsIPresShell::AccService(); + if (accService) { + return accService->CreateHTMLTableRowAccessible(mContent, + PresContext()->PresShell()); + } + return nsnull; +} +#endif /** * Sets the NS_ROW_HAS_CELL_WITH_STYLE_HEIGHT bit to indicate whether * this row has any cells that have non-auto-height. (Row-spanning diff --git a/layout/tables/nsTableRowFrame.h b/layout/tables/nsTableRowFrame.h index 77a5fdc7481..9e9eea399b8 100644 --- a/layout/tables/nsTableRowFrame.h +++ b/layout/tables/nsTableRowFrame.h @@ -255,6 +255,10 @@ public: void SetContinuousBCBorderWidth(PRUint8 aForSide, BCPixelSize aPixelValue); +#ifdef ACCESSIBILITY + virtual already_AddRefed CreateAccessible(); +#endif + protected: /** protected constructor. From b6abd5dcace0b89b5cc8b51958fb7f8404ddfe2a Mon Sep 17 00:00:00 2001 From: Mark Capella Date: Wed, 25 Apr 2012 12:12:31 +0900 Subject: [PATCH 146/182] Bug 559759 - add a11y mochitests for , r=marcoz, f=surkov --- .../tests/mochitest/states/test_inputs.html | 8 ++++++++ .../tests/mochitest/tree/test_txtctrl.html | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/accessible/tests/mochitest/states/test_inputs.html b/accessible/tests/mochitest/states/test_inputs.html index 0b0bb817e9e..13c1f20092a 100644 --- a/accessible/tests/mochitest/states/test_inputs.html +++ b/accessible/tests/mochitest/states/test_inputs.html @@ -110,6 +110,7 @@ testStates("autocomplete-list", 0, EXT_STATE_SUPPORTS_AUTOCOMPLETION); testStates("autocomplete-list2", 0, EXT_STATE_SUPPORTS_AUTOCOMPLETION); testStates("autocomplete-tel", 0, EXT_STATE_SUPPORTS_AUTOCOMPLETION); + testStates("autocomplete-email", 0, EXT_STATE_SUPPORTS_AUTOCOMPLETION); SimpleTest.finish(); } @@ -235,5 +236,12 @@ + Email Address: + + + + + + diff --git a/accessible/tests/mochitest/tree/test_txtctrl.html b/accessible/tests/mochitest/tree/test_txtctrl.html index 9f8a247ccf0..cea17afca53 100644 --- a/accessible/tests/mochitest/tree/test_txtctrl.html +++ b/accessible/tests/mochitest/tree/test_txtctrl.html @@ -90,6 +90,19 @@ testAccessibleTree("txc6", accTree); + // input@type="email", value + accTree = { + role: ROLE_ENTRY, + children: [ + { // text child + role: ROLE_TEXT_LEAF, + children: [] + } + ] + }; + + testAccessibleTree("txc7", accTree); + SimpleTest.finish(); } @@ -132,5 +145,12 @@ + Email Address: + + + + + + From 78eaf458dea9c39230d10371323c1d41fe7d24e4 Mon Sep 17 00:00:00 2001 From: Max Li Date: Thu, 19 Apr 2012 17:32:11 -0400 Subject: [PATCH 147/182] Bug 739882 - decomtaminate getting row and column count on accessible tables, r=tbsaunde --- accessible/src/generic/ARIAGridAccessible.cpp | 34 +++++++----------- accessible/src/generic/ARIAGridAccessible.h | 4 +++ accessible/src/html/nsHTMLTableAccessible.cpp | 36 +++++++------------ accessible/src/html/nsHTMLTableAccessible.h | 2 ++ accessible/src/xpcom/xpcAccessibleTable.cpp | 26 ++++++++++++++ accessible/src/xpcom/xpcAccessibleTable.h | 8 +++-- accessible/src/xul/nsXULListboxAccessible.cpp | 33 +++++------------ accessible/src/xul/nsXULListboxAccessible.h | 4 +++ .../src/xul/nsXULTreeGridAccessible.cpp | 29 +++++---------- accessible/src/xul/nsXULTreeGridAccessible.h | 4 +++ 10 files changed, 88 insertions(+), 92 deletions(-) diff --git a/accessible/src/generic/ARIAGridAccessible.cpp b/accessible/src/generic/ARIAGridAccessible.cpp index c1fe92d35a8..74a57a502b5 100644 --- a/accessible/src/generic/ARIAGridAccessible.cpp +++ b/accessible/src/generic/ARIAGridAccessible.cpp @@ -84,43 +84,33 @@ ARIAGridAccessible::Shutdown() //////////////////////////////////////////////////////////////////////////////// // nsIAccessibleTable -NS_IMETHODIMP -ARIAGridAccessible::GetColumnCount(PRInt32* aColumnCount) +PRUint32 +ARIAGridAccessible::ColCount() { - NS_ENSURE_ARG_POINTER(aColumnCount); - *aColumnCount = 0; - - if (IsDefunct()) - return NS_ERROR_FAILURE; - AccIterator rowIter(this, filters::GetRow); nsAccessible* row = rowIter.Next(); if (!row) - return NS_OK; + return 0; AccIterator cellIter(row, filters::GetCell); - nsAccessible *cell = nsnull; + nsAccessible* cell = nsnull; + PRUint32 colCount = 0; while ((cell = cellIter.Next())) - (*aColumnCount)++; + colCount++; - return NS_OK; + return colCount; } -NS_IMETHODIMP -ARIAGridAccessible::GetRowCount(PRInt32* aRowCount) +PRUint32 +ARIAGridAccessible::RowCount() { - NS_ENSURE_ARG_POINTER(aRowCount); - *aRowCount = 0; - - if (IsDefunct()) - return NS_ERROR_FAILURE; - + PRUint32 rowCount = 0; AccIterator rowIter(this, filters::GetRow); while (rowIter.Next()) - (*aRowCount)++; + rowCount++; - return NS_OK; + return rowCount; } NS_IMETHODIMP diff --git a/accessible/src/generic/ARIAGridAccessible.h b/accessible/src/generic/ARIAGridAccessible.h index cb03a535f3f..5af7ca61a09 100644 --- a/accessible/src/generic/ARIAGridAccessible.h +++ b/accessible/src/generic/ARIAGridAccessible.h @@ -71,6 +71,10 @@ public: // nsAccessNode virtual void Shutdown(); + // TableAccessible + virtual PRUint32 ColCount(); + virtual PRUint32 RowCount(); + protected: /** * Return true if the given row index is valid. diff --git a/accessible/src/html/nsHTMLTableAccessible.cpp b/accessible/src/html/nsHTMLTableAccessible.cpp index d0ae46f2230..9fcb3a00fd8 100644 --- a/accessible/src/html/nsHTMLTableAccessible.cpp +++ b/accessible/src/html/nsHTMLTableAccessible.cpp @@ -563,36 +563,24 @@ nsHTMLTableAccessible::Summary(nsString& aSummary) table->GetSummary(aSummary); } -NS_IMETHODIMP -nsHTMLTableAccessible::GetColumnCount(PRInt32 *acolumnCount) +PRUint32 +nsHTMLTableAccessible::ColCount() { - NS_ENSURE_ARG_POINTER(acolumnCount); - *acolumnCount = nsnull; + nsITableLayout* tableLayout = GetTableLayout(); - if (IsDefunct()) - return NS_ERROR_FAILURE; - - nsITableLayout *tableLayout = GetTableLayout(); - NS_ENSURE_STATE(tableLayout); - - PRInt32 rows; - return tableLayout->GetTableSize(rows, *acolumnCount); + PRInt32 rowCount = 0, colCount = 0; + tableLayout->GetTableSize(rowCount, colCount); + return colCount; } -NS_IMETHODIMP -nsHTMLTableAccessible::GetRowCount(PRInt32 *arowCount) +PRUint32 +nsHTMLTableAccessible::RowCount() { - NS_ENSURE_ARG_POINTER(arowCount); - *arowCount = 0; + nsITableLayout* tableLayout = GetTableLayout(); - if (IsDefunct()) - return NS_ERROR_FAILURE; - - nsITableLayout *tableLayout = GetTableLayout(); - NS_ENSURE_STATE(tableLayout); - - PRInt32 columns; - return tableLayout->GetTableSize(*arowCount, columns); + PRInt32 rowCount = 0, colCount = 0; + tableLayout->GetTableSize(rowCount, colCount); + return rowCount; } NS_IMETHODIMP diff --git a/accessible/src/html/nsHTMLTableAccessible.h b/accessible/src/html/nsHTMLTableAccessible.h index bf3e2151d74..dafe89d4fcf 100644 --- a/accessible/src/html/nsHTMLTableAccessible.h +++ b/accessible/src/html/nsHTMLTableAccessible.h @@ -129,6 +129,8 @@ public: // TableAccessible virtual nsAccessible* Caption(); + virtual PRUint32 ColCount(); + virtual PRUint32 RowCount(); virtual void Summary(nsString& aSummary); virtual bool IsProbablyLayoutTable(); diff --git a/accessible/src/xpcom/xpcAccessibleTable.cpp b/accessible/src/xpcom/xpcAccessibleTable.cpp index aed5607374b..254889304a3 100644 --- a/accessible/src/xpcom/xpcAccessibleTable.cpp +++ b/accessible/src/xpcom/xpcAccessibleTable.cpp @@ -21,6 +21,32 @@ xpcAccessibleTable::GetCaption(nsIAccessible** aCaption) return NS_OK; } +nsresult +xpcAccessibleTable::GetColumnCount(PRInt32* aColumnCount) +{ + NS_ENSURE_ARG_POINTER(aColumnCount); + *aColumnCount = 0; + + if (!mTable) + return NS_ERROR_FAILURE; + + *aColumnCount = mTable->ColCount(); + return NS_OK; +} + +nsresult +xpcAccessibleTable::GetRowCount(PRInt32* aRowCount) +{ + NS_ENSURE_ARG_POINTER(aRowCount); + *aRowCount = 0; + + if (!mTable) + return NS_ERROR_FAILURE; + + *aRowCount = mTable->RowCount(); + return NS_OK; +} + nsresult xpcAccessibleTable::GetSummary(nsAString& aSummary) { diff --git a/accessible/src/xpcom/xpcAccessibleTable.h b/accessible/src/xpcom/xpcAccessibleTable.h index 980ad90845c..6e0b2ab9d78 100644 --- a/accessible/src/xpcom/xpcAccessibleTable.h +++ b/accessible/src/xpcom/xpcAccessibleTable.h @@ -23,6 +23,8 @@ public: xpcAccessibleTable(mozilla::a11y::TableAccessible* aTable) : mTable(aTable) { } nsresult GetCaption(nsIAccessible** aCaption); + nsresult GetColumnCount(PRInt32* aColumnCount); + nsresult GetRowCount(PRInt32* aRowCount); nsresult GetSummary(nsAString& aSummary); nsresult IsProbablyForLayout(bool* aIsForLayout); @@ -35,8 +37,10 @@ protected: { return xpcAccessibleTable::GetCaption(aCaption); } \ NS_SCRIPTABLE NS_IMETHOD GetSummary(nsAString & aSummary) \ { return xpcAccessibleTable::GetSummary(aSummary); } \ - NS_SCRIPTABLE NS_IMETHOD GetColumnCount(PRInt32 *aColumnCount); \ - NS_SCRIPTABLE NS_IMETHOD GetRowCount(PRInt32 *aRowCount); \ + NS_SCRIPTABLE NS_IMETHOD GetColumnCount(PRInt32* aColumnCount) \ + { return xpcAccessibleTable::GetColumnCount(aColumnCount); } \ + NS_SCRIPTABLE NS_IMETHOD GetRowCount(PRInt32* aRowCount) \ + { return xpcAccessibleTable::GetRowCount(aRowCount); } \ NS_SCRIPTABLE NS_IMETHOD GetCellAt(PRInt32 rowIndex, PRInt32 columnIndex, nsIAccessible * *_retval NS_OUTPARAM); \ NS_SCRIPTABLE NS_IMETHOD GetCellIndexAt(PRInt32 rowIndex, PRInt32 columnIndex, PRInt32 *_retval NS_OUTPARAM); \ NS_SCRIPTABLE NS_IMETHOD GetColumnIndexAt(PRInt32 cellIndex, PRInt32 *_retval NS_OUTPARAM); \ diff --git a/accessible/src/xul/nsXULListboxAccessible.cpp b/accessible/src/xul/nsXULListboxAccessible.cpp index 534b34c4f63..6a6441ee230 100644 --- a/accessible/src/xul/nsXULListboxAccessible.cpp +++ b/accessible/src/xul/nsXULListboxAccessible.cpp @@ -241,15 +241,9 @@ nsXULListboxAccessible::NativeRole() //////////////////////////////////////////////////////////////////////////////// // nsXULListboxAccessible. nsIAccessibleTable -NS_IMETHODIMP -nsXULListboxAccessible::GetColumnCount(PRInt32 *aColumnsCout) +PRUint32 +nsXULListboxAccessible::ColCount() { - NS_ENSURE_ARG_POINTER(aColumnsCout); - *aColumnsCout = 0; - - if (IsDefunct()) - return NS_ERROR_FAILURE; - nsIContent* headContent = nsnull; for (nsIContent* childContent = mContent->GetFirstChild(); childContent; childContent = childContent->GetNextSibling()) { @@ -259,7 +253,7 @@ nsXULListboxAccessible::GetColumnCount(PRInt32 *aColumnsCout) } } if (!headContent) - return NS_OK; + return 0; PRUint32 columnCount = 0; for (nsIContent* childContent = headContent->GetFirstChild(); childContent; @@ -270,28 +264,19 @@ nsXULListboxAccessible::GetColumnCount(PRInt32 *aColumnsCout) } } - *aColumnsCout = columnCount; - return NS_OK; + return columnCount; } -NS_IMETHODIMP -nsXULListboxAccessible::GetRowCount(PRInt32 *aRowCount) +PRUint32 +nsXULListboxAccessible::RowCount() { - NS_ENSURE_ARG_POINTER(aRowCount); - *aRowCount = 0; - - if (IsDefunct()) - return NS_ERROR_FAILURE; - nsCOMPtr element(do_QueryInterface(mContent)); - NS_ENSURE_STATE(element); PRUint32 itemCount = 0; - nsresult rv = element->GetItemCount(&itemCount); - NS_ENSURE_SUCCESS(rv, rv); + if(element) + element->GetItemCount(&itemCount); - *aRowCount = itemCount; - return NS_OK; + return itemCount; } NS_IMETHODIMP diff --git a/accessible/src/xul/nsXULListboxAccessible.h b/accessible/src/xul/nsXULListboxAccessible.h index 6a6e05128e8..fb612cd1828 100644 --- a/accessible/src/xul/nsXULListboxAccessible.h +++ b/accessible/src/xul/nsXULListboxAccessible.h @@ -104,6 +104,10 @@ public: // nsIAccessibleTable NS_DECL_OR_FORWARD_NSIACCESSIBLETABLE_WITH_XPCACCESSIBLETABLE + // TableAccessible + virtual PRUint32 ColCount(); + virtual PRUint32 RowCount(); + // nsAccessNode virtual void Shutdown(); diff --git a/accessible/src/xul/nsXULTreeGridAccessible.cpp b/accessible/src/xul/nsXULTreeGridAccessible.cpp index 624d0d75a85..44fb4b96e62 100644 --- a/accessible/src/xul/nsXULTreeGridAccessible.cpp +++ b/accessible/src/xul/nsXULTreeGridAccessible.cpp @@ -72,32 +72,21 @@ NS_IMPL_ISUPPORTS_INHERITED1(nsXULTreeGridAccessible, //////////////////////////////////////////////////////////////////////////////// // nsXULTreeGridAccessible: nsIAccessibleTable implementation -NS_IMETHODIMP -nsXULTreeGridAccessible::GetColumnCount(PRInt32 *aColumnCount) +PRUint32 +nsXULTreeGridAccessible::ColCount() { - NS_ENSURE_ARG_POINTER(aColumnCount); - *aColumnCount = 0; - - if (IsDefunct()) - return NS_ERROR_FAILURE; - - *aColumnCount = nsCoreUtils::GetSensibleColumnCount(mTree); - return NS_OK; + return nsCoreUtils::GetSensibleColumnCount(mTree); } -NS_IMETHODIMP -nsXULTreeGridAccessible::GetRowCount(PRInt32* aRowCount) +PRUint32 +nsXULTreeGridAccessible::RowCount() { - NS_ENSURE_ARG_POINTER(aRowCount); - *aRowCount = 0; - - if (IsDefunct()) - return NS_ERROR_FAILURE; - if (!mTreeView) - return NS_OK; + return 0; - return mTreeView->GetRowCount(aRowCount); + PRInt32 rowCount = 0; + mTreeView->GetRowCount(&rowCount); + return rowCount >= 0 ? rowCount : 0; } NS_IMETHODIMP diff --git a/accessible/src/xul/nsXULTreeGridAccessible.h b/accessible/src/xul/nsXULTreeGridAccessible.h index d72e9d0698b..b80a3adcd07 100644 --- a/accessible/src/xul/nsXULTreeGridAccessible.h +++ b/accessible/src/xul/nsXULTreeGridAccessible.h @@ -60,6 +60,10 @@ public: // nsIAccessibleTable NS_DECL_OR_FORWARD_NSIACCESSIBLETABLE_WITH_XPCACCESSIBLETABLE + // TableAccessible + virtual PRUint32 ColCount(); + virtual PRUint32 RowCount(); + // nsAccessNode virtual void Shutdown(); From 29bc50b92cdade4c1ca7429e025ff7bb62acf3fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20=C3=81vila=20de=20Esp=C3=ADndola?= Date: Fri, 20 Apr 2012 16:43:48 -0400 Subject: [PATCH 148/182] Bug 743680 - nsGlobalWindow.h uses GetWrapper, include nsWrapperCacheInlines.h. r=dbolter. --HG-- extra : rebase_source : 9e0b59c3b4929b7c48767be1732269133cb4e18f --- dom/base/nsGlobalWindow.h | 1 + 1 file changed, 1 insertion(+) diff --git a/dom/base/nsGlobalWindow.h b/dom/base/nsGlobalWindow.h index 890c9bee72c..fcc0cad7979 100644 --- a/dom/base/nsGlobalWindow.h +++ b/dom/base/nsGlobalWindow.h @@ -98,6 +98,7 @@ #include "mozilla/TimeStamp.h" #include "nsIDOMTouchEvent.h" #include "nsIInlineEventHandlers.h" +#include "nsWrapperCacheInlines.h" // JS includes #include "jsapi.h" From eb17dfe5fff714cbe058e04c43b58aa187e46ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20=C3=81vila=20de=20Esp=C3=ADndola?= Date: Fri, 20 Apr 2012 16:49:31 -0400 Subject: [PATCH 149/182] Bug 746541 - nsXPConnect::ReleaseXPConnectSingleton should be the one to remove the last reference to nsXPConnect. r=rbenjamin. --- layout/build/nsLayoutModule.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp index aad367dcfa7..8a5be4d58fd 100644 --- a/layout/build/nsLayoutModule.cpp +++ b/layout/build/nsLayoutModule.cpp @@ -1229,9 +1229,8 @@ static const mozilla::Module::CategoryEntry kLayoutCategories[] = { static void LayoutModuleDtor() { - xpcModuleDtor(); - nsScriptSecurityManager::Shutdown(); + xpcModuleDtor(); } static const mozilla::Module kLayoutModule = { From f46cd86f86e5e760c095da7b904cc474bf85a694 Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Fri, 20 Apr 2012 17:48:54 -0400 Subject: [PATCH 150/182] Bug 747516 - Admit mozilla::dom::Link into a weight loss program; r=bz --- content/base/src/Link.cpp | 8 ++++---- content/base/src/Link.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/content/base/src/Link.cpp b/content/base/src/Link.cpp index 2486d391278..1d41cf1b1ff 100644 --- a/content/base/src/Link.cpp +++ b/content/base/src/Link.cpp @@ -55,10 +55,10 @@ namespace mozilla { namespace dom { Link::Link(Element *aElement) - : mLinkState(defaultState) - , mRegistered(false) - , mElement(aElement) + : mElement(aElement) , mHistory(services::GetHistoryService()) + , mLinkState(defaultState) + , mRegistered(false) { NS_ABORT_IF_FALSE(mElement, "Must have an element"); } @@ -75,7 +75,7 @@ Link::GetLinkState() const "Getting the link state of an unregistered Link!"); NS_ASSERTION(mLinkState != eLinkState_Unknown, "Getting the link state with an unknown value!"); - return mLinkState; + return nsLinkState(mLinkState); } void diff --git a/content/base/src/Link.h b/content/base/src/Link.h index 1b43bd80ab8..ea9e18ed276 100644 --- a/content/base/src/Link.h +++ b/content/base/src/Link.h @@ -149,17 +149,17 @@ private: already_AddRefed GetURIToMutate(); void SetHrefAttribute(nsIURI *aURI); - nsLinkState mLinkState; - mutable nsCOMPtr mCachedURI; - bool mRegistered; - Element * const mElement; // Strong reference to History. The link has to unregister before History // can disappear. nsCOMPtr mHistory; + + PRUint16 mLinkState; + + bool mRegistered; }; NS_DEFINE_STATIC_IID_ACCESSOR(Link, MOZILLA_DOM_LINK_IMPLEMENTATION_IID) From bc55090eed350068a8deece641ef892a16494123 Mon Sep 17 00:00:00 2001 From: Daniel Holbert Date: Fri, 20 Apr 2012 16:04:28 -0700 Subject: [PATCH 151/182] Bug 747469: Add PRInt32 cast to make bounds-check effective, in nsHTMLDocument::ChangeContentEditableCount. r=ehsan --- content/html/document/src/nsHTMLDocument.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/html/document/src/nsHTMLDocument.cpp b/content/html/document/src/nsHTMLDocument.cpp index 5f22c9158f6..7ce72103195 100644 --- a/content/html/document/src/nsHTMLDocument.cpp +++ b/content/html/document/src/nsHTMLDocument.cpp @@ -2305,7 +2305,7 @@ nsresult nsHTMLDocument::ChangeContentEditableCount(nsIContent *aElement, PRInt32 aChange) { - NS_ASSERTION(mContentEditableCount + aChange >= 0, + NS_ASSERTION(PRInt32(mContentEditableCount) + aChange >= 0, "Trying to decrement too much."); mContentEditableCount += aChange; From 8a4584d3dae75dd1fb6900e100166329125b16fb Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Mon, 23 Apr 2012 14:08:11 +0100 Subject: [PATCH 152/182] Bug 747860 - Put vs2010 configurations into a common directory - move them to under build/ where the other compiler type mozconfigs are. r=ted --HG-- rename : browser/config/mozconfigs/win32/vs2010-mozconfig => build/win32/mozconfig.vs2010 rename : browser/config/mozconfigs/win64/vs2010-mozconfig => build/win64/mozconfig.vs2010 --- browser/config/mozconfigs/win32/debug | 2 +- browser/config/mozconfigs/win32/l10n-mozconfig | 2 +- browser/config/mozconfigs/win32/nightly | 2 +- browser/config/mozconfigs/win32/release | 2 +- browser/config/mozconfigs/win64/debug | 2 +- browser/config/mozconfigs/win64/nightly | 2 +- .../win32/vs2010-mozconfig => build/win32/mozconfig.vs2010 | 0 .../win64/vs2010-mozconfig => build/win64/mozconfig.vs2010 | 0 8 files changed, 6 insertions(+), 6 deletions(-) rename browser/config/mozconfigs/win32/vs2010-mozconfig => build/win32/mozconfig.vs2010 (100%) rename browser/config/mozconfigs/win64/vs2010-mozconfig => build/win64/mozconfig.vs2010 (100%) diff --git a/browser/config/mozconfigs/win32/debug b/browser/config/mozconfigs/win32/debug index 8fd9d74a4b7..4f6676db27d 100644 --- a/browser/config/mozconfigs/win32/debug +++ b/browser/config/mozconfigs/win32/debug @@ -7,7 +7,7 @@ export MOZILLA_OFFICIAL=1 mk_add_options MOZ_MAKE_FLAGS=-j1 -. $topsrcdir/browser/config/mozconfigs/win32/vs2010-mozconfig +. $topsrcdir/build/win32/mozconfig.vs2010 # Package js shell. export MOZ_PACKAGE_JSSHELL=1 diff --git a/browser/config/mozconfigs/win32/l10n-mozconfig b/browser/config/mozconfigs/win32/l10n-mozconfig index 28c83ebb29c..41575360d98 100644 --- a/browser/config/mozconfigs/win32/l10n-mozconfig +++ b/browser/config/mozconfigs/win32/l10n-mozconfig @@ -3,4 +3,4 @@ ac_add_options --enable-update-packaging ac_add_options --enable-official-branding ac_add_options --with-l10n-base=../../l10n-central -. $topsrcdir/browser/config/mozconfigs/win32/vs2010-mozconfig +. $topsrcdir/build/win32/mozconfig.vs2010 diff --git a/browser/config/mozconfigs/win32/nightly b/browser/config/mozconfigs/win32/nightly index a345e1c492a..f4bbb3b1c7e 100644 --- a/browser/config/mozconfigs/win32/nightly +++ b/browser/config/mozconfigs/win32/nightly @@ -16,7 +16,7 @@ export MOZ_TELEMETRY_REPORTING=1 mk_add_options MOZ_MAKE_FLAGS=-j1 -. $topsrcdir/browser/config/mozconfigs/win32/vs2010-mozconfig +. $topsrcdir/build/win32/mozconfig.vs2010 # Package js shell. export MOZ_PACKAGE_JSSHELL=1 diff --git a/browser/config/mozconfigs/win32/release b/browser/config/mozconfigs/win32/release index 67e2fd468c0..61091d62c1f 100644 --- a/browser/config/mozconfigs/win32/release +++ b/browser/config/mozconfigs/win32/release @@ -12,7 +12,7 @@ export MOZILLA_OFFICIAL=1 export MOZ_TELEMETRY_REPORTING=1 -. $topsrcdir/browser/config/mozconfigs/win32/vs2010-mozconfig +. $topsrcdir/build/win32/mozconfig.vs2010 # Package js shell. export MOZ_PACKAGE_JSSHELL=1 diff --git a/browser/config/mozconfigs/win64/debug b/browser/config/mozconfigs/win64/debug index 3836edf09ea..416499e03c0 100644 --- a/browser/config/mozconfigs/win64/debug +++ b/browser/config/mozconfigs/win64/debug @@ -13,4 +13,4 @@ mk_add_options MOZ_MAKE_FLAGS=-j1 # Package js shell. export MOZ_PACKAGE_JSSHELL=1 -. $topsrcdir/browser/config/mozconfigs/win64/vs2010-mozconfig +. $topsrcdir/build/win64/mozconfig.vs2010 diff --git a/browser/config/mozconfigs/win64/nightly b/browser/config/mozconfigs/win64/nightly index 4cd888f17c1..b4456d82b79 100644 --- a/browser/config/mozconfigs/win64/nightly +++ b/browser/config/mozconfigs/win64/nightly @@ -22,4 +22,4 @@ mk_add_options MOZ_MAKE_FLAGS=-j1 # Package js shell. export MOZ_PACKAGE_JSSHELL=1 -. $topsrcdir/browser/config/mozconfigs/win64/vs2010-mozconfig +. $topsrcdir/build/win64/mozconfig.vs2010 diff --git a/browser/config/mozconfigs/win32/vs2010-mozconfig b/build/win32/mozconfig.vs2010 similarity index 100% rename from browser/config/mozconfigs/win32/vs2010-mozconfig rename to build/win32/mozconfig.vs2010 diff --git a/browser/config/mozconfigs/win64/vs2010-mozconfig b/build/win64/mozconfig.vs2010 similarity index 100% rename from browser/config/mozconfigs/win64/vs2010-mozconfig rename to build/win64/mozconfig.vs2010 From 061dbcd557854d48393c17de1c25b3d462779c77 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Mon, 23 Apr 2012 14:09:41 +0100 Subject: [PATCH 153/182] Bug 723135 - Language packs should work for all releases of a branch, maxVersion should use * for compatibility ranges. r=ted --- b2g/locales/generic/install.rdf | 2 +- browser/locales/generic/install.rdf | 2 +- config/autoconf.mk.in | 1 + configure.in | 15 +++++++++++++++ mobile/android/locales/generic/install.rdf | 2 +- mobile/xul/locales/generic/install.rdf | 2 +- toolkit/locales/l10n.mk | 1 + 7 files changed, 21 insertions(+), 4 deletions(-) diff --git a/b2g/locales/generic/install.rdf b/b2g/locales/generic/install.rdf index 1a5a12073ec..b7a51b7398e 100644 --- a/b2g/locales/generic/install.rdf +++ b/b2g/locales/generic/install.rdf @@ -55,7 +55,7 @@ {3c2e2abc-06d4-11e1-ac3b-374f68613e61} @MOZ_APP_VERSION@ - @MOZ_APP_VERSION@ + @MOZ_APP_MAXVERSION@ diff --git a/browser/locales/generic/install.rdf b/browser/locales/generic/install.rdf index fbfe3cd5bbf..683c8de61e9 100644 --- a/browser/locales/generic/install.rdf +++ b/browser/locales/generic/install.rdf @@ -55,7 +55,7 @@ {ec8030f7-c20a-464f-9b0e-13a3a9e97384} @MOZ_APP_VERSION@ - @MOZ_APP_VERSION@ + @MOZ_APP_MAXVERSION@ diff --git a/config/autoconf.mk.in b/config/autoconf.mk.in index 7930a5ee720..cf8746a2c91 100644 --- a/config/autoconf.mk.in +++ b/config/autoconf.mk.in @@ -59,6 +59,7 @@ MOZ_PROFILE_MIGRATOR = @MOZ_PROFILE_MIGRATOR@ MOZ_EXTENSION_MANAGER = @MOZ_EXTENSION_MANAGER@ MOZ_APP_UA_NAME = @MOZ_APP_UA_NAME@ MOZ_APP_VERSION = @MOZ_APP_VERSION@ +MOZ_APP_MAXVERSION = @MOZ_APP_MAXVERSION@ MOZ_UA_BUILDID = @MOZ_UA_BUILDID@ MOZ_MACBUNDLE_NAME = @MOZ_MACBUNDLE_NAME@ MOZ_APP_STATIC_INI = @MOZ_APP_STATIC_INI@ diff --git a/configure.in b/configure.in index 15161e1e065..6580c8fb073 100644 --- a/configure.in +++ b/configure.in @@ -8518,6 +8518,20 @@ if test -z "$MOZ_APP_NAME"; then MOZ_APP_NAME=`echo $MOZ_APP_BASENAME | tr A-Z a-z` fi +# For extensions and langpacks, we require a max version that is compatible +# across security releases. MOZ_APP_MAXVERSION is our method for doing that. +# 10.0a1 and 10.0a2 aren't affected +# 10.0 becomes 10.0.* +# 10.0.1 becomes 10.0.* +IS_ALPHA=`echo $MOZ_APP_VERSION | grep a` +if test -z "$IS_ALPHA"; then + changequote(,) + MOZ_APP_MAXVERSION=`echo $MOZ_APP_VERSION | sed "s|\(^[0-9]*.[0-9]*\).*|\1|"`.* + changequote([,]) +else + MOZ_APP_MAXVERSION=$MOZ_APP_VERSION +fi + AC_SUBST(MOZ_APP_NAME) AC_SUBST(MOZ_APP_DISPLAYNAME) AC_SUBST(MOZ_APP_BASENAME) @@ -8532,6 +8546,7 @@ AC_DEFINE_UNQUOTED(MOZ_APP_UA_NAME, "$MOZ_APP_UA_NAME") AC_SUBST(MOZ_APP_UA_NAME) AC_DEFINE_UNQUOTED(MOZ_APP_UA_VERSION, "$MOZ_APP_VERSION") AC_SUBST(MOZ_APP_VERSION) +AC_SUBST(MOZ_APP_MAXVERSION) AC_DEFINE_UNQUOTED(MOZ_UA_FIREFOX_VERSION, "$FIREFOX_VERSION") AC_DEFINE_UNQUOTED(FIREFOX_VERSION,$FIREFOX_VERSION) AC_SUBST(FIREFOX_VERSION) diff --git a/mobile/android/locales/generic/install.rdf b/mobile/android/locales/generic/install.rdf index 3f7091d8d3b..bd9fd18833f 100644 --- a/mobile/android/locales/generic/install.rdf +++ b/mobile/android/locales/generic/install.rdf @@ -55,7 +55,7 @@ {a23983c0-fd0e-11dc-95ff-0800200c9a66} @MOZ_APP_VERSION@ - @MOZ_APP_VERSION@ + @MOZ_APP_MAXVERSION@ diff --git a/mobile/xul/locales/generic/install.rdf b/mobile/xul/locales/generic/install.rdf index 3f7091d8d3b..bd9fd18833f 100644 --- a/mobile/xul/locales/generic/install.rdf +++ b/mobile/xul/locales/generic/install.rdf @@ -55,7 +55,7 @@ {a23983c0-fd0e-11dc-95ff-0800200c9a66} @MOZ_APP_VERSION@ - @MOZ_APP_VERSION@ + @MOZ_APP_MAXVERSION@ diff --git a/toolkit/locales/l10n.mk b/toolkit/locales/l10n.mk index 2409c086542..06885c8f7d8 100644 --- a/toolkit/locales/l10n.mk +++ b/toolkit/locales/l10n.mk @@ -85,6 +85,7 @@ DEFINES += \ -DAB_CD=$(AB_CD) \ -DMOZ_LANGPACK_EID=$(MOZ_LANGPACK_EID) \ -DMOZ_APP_VERSION=$(MOZ_APP_VERSION) \ + -DMOZ_APP_MAXVERSION=$(MOZ_APP_MAXVERSION) \ -DLOCALE_SRCDIR=$(call core_abspath,$(LOCALE_SRCDIR)) \ -DPKG_BASENAME="$(PKG_BASENAME)" \ -DPKG_INST_BASENAME="$(PKG_INST_BASENAME)" \ From ac93d3f1ab6252dffd331c652abab147a5000aef Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Tue, 24 Apr 2012 09:06:11 +0300 Subject: [PATCH 154/182] Bug 599983 part 1 - Clean up nsEditor::MarkNodeDirty; r=ehsan --- editor/libeditor/base/nsEditor.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/editor/libeditor/base/nsEditor.cpp b/editor/libeditor/base/nsEditor.cpp index 6986d437371..23c650d7f7a 100644 --- a/editor/libeditor/base/nsEditor.cpp +++ b/editor/libeditor/base/nsEditor.cpp @@ -1273,11 +1273,11 @@ nsEditor::RemoveAttribute(nsIDOMElement *aElement, const nsAString& aAttribute) NS_IMETHODIMP nsEditor::MarkNodeDirty(nsIDOMNode* aNode) { - // mark the node dirty. - nsCOMPtr element (do_QueryInterface(aNode)); - if (element) + nsCOMPtr element = do_QueryInterface(aNode); + if (element) { element->SetAttr(kNameSpaceID_None, nsEditProperty::mozdirty, EmptyString(), false); + } return NS_OK; } From c7d23199c4dc6b557e77c6c4f17da1c23bde324b Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Tue, 24 Apr 2012 09:06:11 +0300 Subject: [PATCH 155/182] Bug 599983 part 2 - Don't emit or process _moz_dirty more than necessary; r=ehsan,bz --- content/base/public/nsIDocumentEncoder.idl | 6 ++ content/base/src/nsHTMLContentSerializer.cpp | 4 +- content/base/src/nsXHTMLContentSerializer.cpp | 8 +-- .../html/content/src/nsGenericHTMLElement.cpp | 25 +++++-- editor/idl/nsIEditor.idl | 8 ++- editor/libeditor/base/nsEditor.cpp | 14 ++++ editor/libeditor/base/tests/Makefile.in | 2 + .../libeditor/base/tests/test_bug599983.html | 16 +++++ .../libeditor/base/tests/test_bug599983.xul | 70 +++++++++++++++++++ 9 files changed, 139 insertions(+), 14 deletions(-) create mode 100644 editor/libeditor/base/tests/test_bug599983.html create mode 100644 editor/libeditor/base/tests/test_bug599983.xul diff --git a/content/base/public/nsIDocumentEncoder.idl b/content/base/public/nsIDocumentEncoder.idl index 66ec90a492a..b3259585df0 100644 --- a/content/base/public/nsIDocumentEncoder.idl +++ b/content/base/public/nsIDocumentEncoder.idl @@ -243,6 +243,12 @@ interface nsIDocumentEncoder : nsISupports */ const unsigned long OutputDropInvisibleBreak = (1 << 21); + /** + * Don't check for _moz_dirty attributes when deciding whether to + * pretty-print if this flag is set (bug 599983). + */ + const unsigned long OutputIgnoreMozDirty = (1 << 22); + /** * Initialize with a pointer to the document and the mime type. * @param aDocument Document to encode. diff --git a/content/base/src/nsHTMLContentSerializer.cpp b/content/base/src/nsHTMLContentSerializer.cpp index a93dd4649f2..537c3433775 100644 --- a/content/base/src/nsHTMLContentSerializer.cpp +++ b/content/base/src/nsHTMLContentSerializer.cpp @@ -347,8 +347,8 @@ nsHTMLContentSerializer::AppendElementEnd(Element* aElement, --mDisableEntityEncoding; } - bool forceFormat = content->HasAttr(kNameSpaceID_None, - nsGkAtoms::mozdirty); + bool forceFormat = !(mFlags & nsIDocumentEncoder::OutputIgnoreMozDirty) && + content->HasAttr(kNameSpaceID_None, nsGkAtoms::mozdirty); if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw) { DecrIndentation(name); diff --git a/content/base/src/nsXHTMLContentSerializer.cpp b/content/base/src/nsXHTMLContentSerializer.cpp index 76b4b83fe4e..fb1ac47752c 100644 --- a/content/base/src/nsXHTMLContentSerializer.cpp +++ b/content/base/src/nsXHTMLContentSerializer.cpp @@ -565,8 +565,8 @@ nsXHTMLContentSerializer::CheckElementStart(nsIContent * aContent, // The _moz_dirty attribute is emitted by the editor to // indicate that this element should be pretty printed // even if we're not in pretty printing mode - aForceFormat = aContent->HasAttr(kNameSpaceID_None, - nsGkAtoms::mozdirty); + aForceFormat = !(mFlags & nsIDocumentEncoder::OutputIgnoreMozDirty) && + aContent->HasAttr(kNameSpaceID_None, nsGkAtoms::mozdirty); nsIAtom *name = aContent->Tag(); PRInt32 namespaceID = aContent->GetNameSpaceID(); @@ -592,8 +592,8 @@ nsXHTMLContentSerializer::CheckElementEnd(nsIContent * aContent, { NS_ASSERTION(!mIsHTMLSerializer, "nsHTMLContentSerializer shouldn't call this method !"); - aForceFormat = aContent->HasAttr(kNameSpaceID_None, - nsGkAtoms::mozdirty); + aForceFormat = !(mFlags & nsIDocumentEncoder::OutputIgnoreMozDirty) && + aContent->HasAttr(kNameSpaceID_None, nsGkAtoms::mozdirty); nsIAtom *name = aContent->Tag(); PRInt32 namespaceID = aContent->GetNameSpaceID(); diff --git a/content/html/content/src/nsGenericHTMLElement.cpp b/content/html/content/src/nsGenericHTMLElement.cpp index a65fb85b6e5..73bd3699403 100644 --- a/content/html/content/src/nsGenericHTMLElement.cpp +++ b/content/html/content/src/nsGenericHTMLElement.cpp @@ -697,13 +697,24 @@ nsGenericHTMLElement::GetMarkup(bool aIncludeSelf, nsAString& aMarkup) NS_ENSURE_TRUE(docEncoder, NS_ERROR_FAILURE); - nsresult rv = docEncoder->NativeInit(doc, contentType, - nsIDocumentEncoder::OutputEncodeBasicEntities | - // Output DOM-standard newlines - nsIDocumentEncoder::OutputLFLineBreak | - // Don't do linebreaking that's not present in - // the source - nsIDocumentEncoder::OutputRaw); + PRUint32 flags = nsIDocumentEncoder::OutputEncodeBasicEntities | + // Output DOM-standard newlines + nsIDocumentEncoder::OutputLFLineBreak | + // Don't do linebreaking that's not present in + // the source + nsIDocumentEncoder::OutputRaw | + // Only check for mozdirty when necessary (bug 599983) + nsIDocumentEncoder::OutputIgnoreMozDirty; + + if (IsEditable()) { + nsCOMPtr editor; + GetEditorInternal(getter_AddRefs(editor)); + if (editor && editor->OutputsMozDirty()) { + flags &= ~nsIDocumentEncoder::OutputIgnoreMozDirty; + } + } + + nsresult rv = docEncoder->NativeInit(doc, contentType, flags); NS_ENSURE_SUCCESS(rv, rv); if (aIncludeSelf) { diff --git a/editor/idl/nsIEditor.idl b/editor/idl/nsIEditor.idl index 5e31af79541..01af001f15f 100644 --- a/editor/idl/nsIEditor.idl +++ b/editor/idl/nsIEditor.idl @@ -55,7 +55,7 @@ interface nsIEditActionListener; interface nsIInlineSpellChecker; interface nsITransferable; -[scriptable, uuid(2e14b183-29d4-4282-9475-589277a70654)] +[scriptable, uuid(7861fe14-9977-413f-a893-3e1000c40817)] interface nsIEditor : nsISupports { @@ -497,6 +497,12 @@ interface nsIEditor : nsISupports */ void deleteNode(in nsIDOMNode child); + /** + * Returns true if markNodeDirty() has any effect. Returns false if + * markNodeDirty() is a no-op. + */ + [notxpcom] boolean outputsMozDirty(); + /** * markNodeDirty() sets a special dirty attribute on the node. * Usually this will be called immediately after creating a new node. diff --git a/editor/libeditor/base/nsEditor.cpp b/editor/libeditor/base/nsEditor.cpp index 23c650d7f7a..0d220148e52 100644 --- a/editor/libeditor/base/nsEditor.cpp +++ b/editor/libeditor/base/nsEditor.cpp @@ -1270,9 +1270,23 @@ nsEditor::RemoveAttribute(nsIDOMElement *aElement, const nsAString& aAttribute) } +bool +nsEditor::OutputsMozDirty() +{ + // Return true for Composer (!eEditorAllowInteraction) or mail + // (eEditorMailMask), but false for webpages. + return !(mFlags & nsIPlaintextEditor::eEditorAllowInteraction) || + (mFlags & nsIPlaintextEditor::eEditorMailMask); +} + + NS_IMETHODIMP nsEditor::MarkNodeDirty(nsIDOMNode* aNode) { + // Mark the node dirty, but not for webpages (bug 599983) + if (!OutputsMozDirty()) { + return NS_OK; + } nsCOMPtr element = do_QueryInterface(aNode); if (element) { element->SetAttr(kNameSpaceID_None, nsEditProperty::mozdirty, diff --git a/editor/libeditor/base/tests/Makefile.in b/editor/libeditor/base/tests/Makefile.in index df93aa38c99..daa17e80b7d 100644 --- a/editor/libeditor/base/tests/Makefile.in +++ b/editor/libeditor/base/tests/Makefile.in @@ -50,6 +50,7 @@ _TEST_FILES = \ test_bug567213.html \ file_bug586662.html \ test_bug586662.html \ + test_bug599983.html \ $(NULL) _CHROME_TEST_FILES = \ @@ -57,6 +58,7 @@ _CHROME_TEST_FILES = \ test_bug46555.html \ test_bug646194.xul \ test_dragdrop.html \ + test_bug599983.xul \ $(NULL) libs:: $(_TEST_FILES) diff --git a/editor/libeditor/base/tests/test_bug599983.html b/editor/libeditor/base/tests/test_bug599983.html new file mode 100644 index 00000000000..08fc9a228a8 --- /dev/null +++ b/editor/libeditor/base/tests/test_bug599983.html @@ -0,0 +1,16 @@ + + +Test for Bug 599983 + + + +Mozilla Bug 599983 +
foo
+ diff --git a/editor/libeditor/base/tests/test_bug599983.xul b/editor/libeditor/base/tests/test_bug599983.xul new file mode 100644 index 00000000000..8b5d52a8c96 --- /dev/null +++ b/editor/libeditor/base/tests/test_bug599983.xul @@ -0,0 +1,70 @@ + + + + + + + From d9fb0a3314f250890b603b808bca9b19e693dccf Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Tue, 24 Apr 2012 13:57:23 +0300 Subject: [PATCH 156/182] Bug 480647 part 2 - Move ParseLegacyFontSize to nsContentUtils so editor/ can use it; r=bz --- content/base/public/nsContentUtils.h | 9 +++ content/base/src/nsContentUtils.cpp | 53 ++++++++++++++++++ .../html/content/src/nsHTMLFontElement.cpp | 55 +------------------ 3 files changed, 63 insertions(+), 54 deletions(-) diff --git a/content/base/public/nsContentUtils.h b/content/base/public/nsContentUtils.h index e958223c28d..36710c369e0 100644 --- a/content/base/public/nsContentUtils.h +++ b/content/base/public/nsContentUtils.h @@ -444,6 +444,15 @@ public: */ static bool ParseIntMarginValue(const nsAString& aString, nsIntMargin& aResult); + /** + * Parse the value of the attribute according to the HTML5 + * spec as of April 16, 2012. + * + * @param aValue the value to parse + * @return 1 to 7, or 0 if the value couldn't be parsed + */ + static PRInt32 ParseLegacyFontSize(const nsAString& aValue); + static void Shutdown(); /** diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp index b252ba0e629..3a0049d9059 100644 --- a/content/base/src/nsContentUtils.cpp +++ b/content/base/src/nsContentUtils.cpp @@ -1307,6 +1307,59 @@ nsContentUtils::ParseIntMarginValue(const nsAString& aString, nsIntMargin& resul return true; } +// static +PRInt32 +nsContentUtils::ParseLegacyFontSize(const nsAString& aValue) +{ + nsAString::const_iterator iter, end; + aValue.BeginReading(iter); + aValue.EndReading(end); + + while (iter != end && nsContentUtils::IsHTMLWhitespace(*iter)) { + ++iter; + } + + if (iter == end) { + return 0; + } + + bool relative = false; + bool negate = false; + if (*iter == PRUnichar('-')) { + relative = true; + negate = true; + ++iter; + } else if (*iter == PRUnichar('+')) { + relative = true; + ++iter; + } + + if (*iter < PRUnichar('0') || *iter > PRUnichar('9')) { + return 0; + } + + // We don't have to worry about overflow, since we can bail out as soon as + // we're bigger than 7. + PRInt32 value = 0; + while (iter != end && *iter >= PRUnichar('0') && *iter <= PRUnichar('9')) { + value = 10*value + (*iter - PRUnichar('0')); + if (value >= 7) { + break; + } + ++iter; + } + + if (relative) { + if (negate) { + value = 3 - value; + } else { + value = 3 + value; + } + } + + return clamped(value, 1, 7); +} + /* static */ void nsContentUtils::GetOfflineAppManifest(nsIDocument *aDocument, nsIURI **aURI) diff --git a/content/html/content/src/nsHTMLFontElement.cpp b/content/html/content/src/nsHTMLFontElement.cpp index 61dace3e4bc..be86a4290f8 100644 --- a/content/html/content/src/nsHTMLFontElement.cpp +++ b/content/html/content/src/nsHTMLFontElement.cpp @@ -118,59 +118,6 @@ NS_IMPL_STRING_ATTR(nsHTMLFontElement, Face, face) NS_IMPL_STRING_ATTR(nsHTMLFontElement, Size, size) -// Returns 1 to 7, or 0 on error. Follows HTML spec as of April 16, 2012. -static PRInt32 -ParseLegacyFontSize(const nsAString& aValue) -{ - nsAString::const_iterator iter, end; - aValue.BeginReading(iter); - aValue.EndReading(end); - - while (iter != end && nsContentUtils::IsHTMLWhitespace(*iter)) { - ++iter; - } - - if (iter == end) { - return 0; - } - - bool relative = false; - bool negate = false; - if (*iter == PRUnichar('-')) { - relative = true; - negate = true; - ++iter; - } else if (*iter == PRUnichar('+')) { - relative = true; - ++iter; - } - - if (*iter < PRUnichar('0') || *iter > PRUnichar('9')) { - return 0; - } - - // We don't have to worry about overflow, since we can bail out as soon as - // we're bigger than 7. - PRInt32 value = 0; - while (iter != end && *iter >= PRUnichar('0') && *iter <= PRUnichar('9')) { - value = 10*value + (*iter - PRUnichar('0')); - if (value >= 7) { - break; - } - ++iter; - } - - if (relative) { - if (negate) { - value = 3 - value; - } else { - value = 3 + value; - } - } - - return clamped(value, 1, 7); -} - bool nsHTMLFontElement::ParseAttribute(PRInt32 aNamespaceID, nsIAtom* aAttribute, @@ -179,7 +126,7 @@ nsHTMLFontElement::ParseAttribute(PRInt32 aNamespaceID, { if (aNamespaceID == kNameSpaceID_None) { if (aAttribute == nsGkAtoms::size) { - PRInt32 size = ParseLegacyFontSize(aValue); + PRInt32 size = nsContentUtils::ParseLegacyFontSize(aValue); if (size) { aResult.SetTo(size, &aValue); return true; From e04f4100c1c144e0dae2604d8ae8bccdc12639f5 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Tue, 24 Apr 2012 13:57:23 +0300 Subject: [PATCH 157/182] Bug 480647 part 3 - Clean up nsHTMLCSSUtils::GenerateCSSDeclarationsFromHTMLStyle; r=ehsan --- editor/libeditor/html/nsHTMLCSSUtils.cpp | 113 ++++++++++------------- 1 file changed, 50 insertions(+), 63 deletions(-) diff --git a/editor/libeditor/html/nsHTMLCSSUtils.cpp b/editor/libeditor/html/nsHTMLCSSUtils.cpp index 98c9aefe97d..53fdd0b1011 100644 --- a/editor/libeditor/html/nsHTMLCSSUtils.cpp +++ b/editor/libeditor/html/nsHTMLCSSUtils.cpp @@ -853,77 +853,64 @@ nsHTMLCSSUtils::GenerateCSSDeclarationsFromHTMLStyle(dom::Element* aElement, { MOZ_ASSERT(aElement); nsIAtom* tagName = aElement->Tag(); + const nsHTMLCSSUtils::CSSEquivTable* equivTable = nsnull; if (nsEditProperty::b == aHTMLProperty) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, boldEquivTable, aValue, aGetOrRemoveRequest); - } - else if (nsEditProperty::i == aHTMLProperty) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, italicEquivTable, aValue, aGetOrRemoveRequest); - } - else if (nsEditProperty::u == aHTMLProperty) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, underlineEquivTable, aValue, aGetOrRemoveRequest); - } - else if (nsEditProperty::strike == aHTMLProperty) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, strikeEquivTable, aValue, aGetOrRemoveRequest); - } - else if (nsEditProperty::tt == aHTMLProperty) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, ttEquivTable, aValue, aGetOrRemoveRequest); - } - else if (aAttribute) { + equivTable = boldEquivTable; + } else if (nsEditProperty::i == aHTMLProperty) { + equivTable = italicEquivTable; + } else if (nsEditProperty::u == aHTMLProperty) { + equivTable = underlineEquivTable; + } else if (nsEditProperty::strike == aHTMLProperty) { + equivTable = strikeEquivTable; + } else if (nsEditProperty::tt == aHTMLProperty) { + equivTable = ttEquivTable; + } else if (aAttribute) { if (nsEditProperty::font == aHTMLProperty && aAttribute->EqualsLiteral("color")) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, fontColorEquivTable, aValue, aGetOrRemoveRequest); - } - else if (nsEditProperty::font == aHTMLProperty && - aAttribute->EqualsLiteral("face")) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, fontFaceEquivTable, aValue, aGetOrRemoveRequest); - } - else if (aAttribute->EqualsLiteral("bgcolor")) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, bgcolorEquivTable, aValue, aGetOrRemoveRequest); - } - else if (aAttribute->EqualsLiteral("background")) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, backgroundImageEquivTable, aValue, aGetOrRemoveRequest); - } - else if (aAttribute->EqualsLiteral("text")) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, textColorEquivTable, aValue, aGetOrRemoveRequest); - } - else if (aAttribute->EqualsLiteral("border")) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, borderEquivTable, aValue, aGetOrRemoveRequest); - } - else if (aAttribute->EqualsLiteral("align")) { + equivTable = fontColorEquivTable; + } else if (nsEditProperty::font == aHTMLProperty && + aAttribute->EqualsLiteral("face")) { + equivTable = fontFaceEquivTable; + } else if (aAttribute->EqualsLiteral("bgcolor")) { + equivTable = bgcolorEquivTable; + } else if (aAttribute->EqualsLiteral("background")) { + equivTable = backgroundImageEquivTable; + } else if (aAttribute->EqualsLiteral("text")) { + equivTable = textColorEquivTable; + } else if (aAttribute->EqualsLiteral("border")) { + equivTable = borderEquivTable; + } else if (aAttribute->EqualsLiteral("align")) { if (nsEditProperty::table == tagName) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, tableAlignEquivTable, aValue, aGetOrRemoveRequest); - } - else if (nsEditProperty::hr == tagName) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, hrAlignEquivTable, aValue, aGetOrRemoveRequest); - } - else if (nsEditProperty::legend == tagName || + equivTable = tableAlignEquivTable; + } else if (nsEditProperty::hr == tagName) { + equivTable = hrAlignEquivTable; + } else if (nsEditProperty::legend == tagName || nsEditProperty::caption == tagName) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, captionAlignEquivTable, aValue, aGetOrRemoveRequest); - } - else { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, textAlignEquivTable, aValue, aGetOrRemoveRequest); + equivTable = captionAlignEquivTable; + } else { + equivTable = textAlignEquivTable; } + } else if (aAttribute->EqualsLiteral("valign")) { + equivTable = verticalAlignEquivTable; + } else if (aAttribute->EqualsLiteral("nowrap")) { + equivTable = nowrapEquivTable; + } else if (aAttribute->EqualsLiteral("width")) { + equivTable = widthEquivTable; + } else if (aAttribute->EqualsLiteral("height") || + (nsEditProperty::hr == tagName && + aAttribute->EqualsLiteral("size"))) { + equivTable = heightEquivTable; + } else if (aAttribute->EqualsLiteral("type") && + (nsEditProperty::ol == tagName + || nsEditProperty::ul == tagName + || nsEditProperty::li == tagName)) { + equivTable = listStyleTypeEquivTable; } - else if (aAttribute->EqualsLiteral("valign")) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, verticalAlignEquivTable, aValue, aGetOrRemoveRequest); - } - else if (aAttribute->EqualsLiteral("nowrap")) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, nowrapEquivTable, aValue, aGetOrRemoveRequest); - } - else if (aAttribute->EqualsLiteral("width")) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, widthEquivTable, aValue, aGetOrRemoveRequest); - } - else if (aAttribute->EqualsLiteral("height") || - (nsEditProperty::hr == tagName && aAttribute->EqualsLiteral("size"))) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, heightEquivTable, aValue, aGetOrRemoveRequest); - } - else if (aAttribute->EqualsLiteral("type") && - (nsEditProperty::ol == tagName - || nsEditProperty::ul == tagName - || nsEditProperty::li == tagName)) { - BuildCSSDeclarations(cssPropertyArray, cssValueArray, listStyleTypeEquivTable, aValue, aGetOrRemoveRequest); - } + } + if (equivTable) { + BuildCSSDeclarations(cssPropertyArray, cssValueArray, equivTable, + aValue, aGetOrRemoveRequest); } } From 2743d1b320f64daca1c4cb81daa44f1915c0a106 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Tue, 24 Apr 2012 13:57:23 +0300 Subject: [PATCH 158/182] Bug 480647 part 4 - Clean up nsHTMLDocument::ConvertToMidasInternalCommandInner; r=ehsan --- content/html/document/src/nsHTMLDocument.cpp | 127 ++++++++++--------- 1 file changed, 65 insertions(+), 62 deletions(-) diff --git a/content/html/document/src/nsHTMLDocument.cpp b/content/html/document/src/nsHTMLDocument.cpp index 7ce72103195..0eb65066175 100644 --- a/content/html/document/src/nsHTMLDocument.cpp +++ b/content/html/document/src/nsHTMLDocument.cpp @@ -2877,8 +2877,8 @@ static const char* const gBlocks[] = { }; static bool -ConvertToMidasInternalCommandInner(const nsAString & inCommandID, - const nsAString & inParam, +ConvertToMidasInternalCommandInner(const nsAString& inCommandID, + const nsAString& inParam, nsACString& outCommandID, nsACString& outParam, bool& outIsBoolean, @@ -2892,8 +2892,7 @@ ConvertToMidasInternalCommandInner(const nsAString & inCommandID, if (convertedCommandID.LowerCaseEqualsLiteral("usecss")) { convertedCommandID.Assign("styleWithCSS"); invertBool = true; - } - else if (convertedCommandID.LowerCaseEqualsLiteral("readonly")) { + } else if (convertedCommandID.LowerCaseEqualsLiteral("readonly")) { convertedCommandID.Assign("contentReadOnly"); invertBool = true; } @@ -2908,70 +2907,74 @@ ConvertToMidasInternalCommandInner(const nsAString & inCommandID, } } - if (found) { - // set outCommandID (what we use internally) - outCommandID.Assign(gMidasCommandTable[i].internalCommandString); - - // set outParam & outIsBoolean based on flags from the table - outIsBoolean = gMidasCommandTable[i].convertToBoolean; - - if (!aIgnoreParams) { - if (gMidasCommandTable[i].useNewParam) { - outParam.Assign(gMidasCommandTable[i].internalParamString); - } - else { - // handle checking of param passed in - if (outIsBoolean) { - // if this is a boolean value and it's not explicitly false - // (e.g. no value) we default to "true". For old backwards commands - // we invert the check (see bug 301490). - if (invertBool) { - outBooleanValue = inParam.LowerCaseEqualsLiteral("false"); - } - else { - outBooleanValue = !inParam.LowerCaseEqualsLiteral("false"); - } - outParam.Truncate(); - } - else { - // check to see if we need to convert the parameter - if (outCommandID.EqualsLiteral("cmd_paragraphState")) { - const PRUnichar *start = inParam.BeginReading(); - const PRUnichar *end = inParam.EndReading(); - if (start != end && *start == '<' && *(end - 1) == '>') { - ++start; - --end; - } - - NS_ConvertUTF16toUTF8 convertedParam(Substring(start, end)); - PRUint32 j; - for (j = 0; j < ArrayLength(gBlocks); ++j) { - if (convertedParam.Equals(gBlocks[j], - nsCaseInsensitiveCStringComparator())) { - outParam.Assign(gBlocks[j]); - break; - } - } - - if (j == ArrayLength(gBlocks)) { - outParam.Truncate(); - } - } - else { - CopyUTF16toUTF8(inParam, outParam); - } - } - } - } - } // end else for useNewParam (do convert existing param) - else { + if (!found) { // reset results if the command is not found in our table outCommandID.SetLength(0); outParam.SetLength(0); outIsBoolean = false; + return false; } - return found; + // set outCommandID (what we use internally) + outCommandID.Assign(gMidasCommandTable[i].internalCommandString); + + // set outParam & outIsBoolean based on flags from the table + outIsBoolean = gMidasCommandTable[i].convertToBoolean; + + if (aIgnoreParams) { + // No further work to do + return true; + } + + if (gMidasCommandTable[i].useNewParam) { + // Just have to copy it, no checking + outParam.Assign(gMidasCommandTable[i].internalParamString); + return true; + } + + // handle checking of param passed in + if (outIsBoolean) { + // If this is a boolean value and it's not explicitly false (e.g. no value) + // we default to "true". For old backwards commands we invert the check (see + // bug 301490). + if (invertBool) { + outBooleanValue = inParam.LowerCaseEqualsLiteral("false"); + } else { + outBooleanValue = !inParam.LowerCaseEqualsLiteral("false"); + } + outParam.Truncate(); + + return true; + } + + // String parameter -- see if we need to convert it (necessary for + // cmd_paragraphState) + if (outCommandID.EqualsLiteral("cmd_paragraphState")) { + const PRUnichar* start = inParam.BeginReading(); + const PRUnichar* end = inParam.EndReading(); + if (start != end && *start == '<' && *(end - 1) == '>') { + ++start; + --end; + } + + NS_ConvertUTF16toUTF8 convertedParam(Substring(start, end)); + PRUint32 j; + for (j = 0; j < ArrayLength(gBlocks); ++j) { + if (convertedParam.Equals(gBlocks[j], + nsCaseInsensitiveCStringComparator())) { + outParam.Assign(gBlocks[j]); + break; + } + } + + if (j == ArrayLength(gBlocks)) { + outParam.Truncate(); + } + } else { + CopyUTF16toUTF8(inParam, outParam); + } + + return true; } static bool From 6a59021f8430eb2810512f37deb3c41b2bb47262 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Tue, 24 Apr 2012 13:57:46 +0300 Subject: [PATCH 159/182] Bug 480647 part 5 - Reject invalid values from execCommand("fontSize"); r=ehsan --- content/html/document/src/nsHTMLDocument.cpp | 15 ++- editor/libeditor/html/tests/Makefile.in | 1 + .../lib/richtext2/currentStatus.js | 18 ++- .../libeditor/html/tests/test_bug480647.html | 110 ++++++++++++++++++ 4 files changed, 136 insertions(+), 8 deletions(-) create mode 100644 editor/libeditor/html/tests/test_bug480647.html diff --git a/content/html/document/src/nsHTMLDocument.cpp b/content/html/document/src/nsHTMLDocument.cpp index 0eb65066175..15141dab570 100644 --- a/content/html/document/src/nsHTMLDocument.cpp +++ b/content/html/document/src/nsHTMLDocument.cpp @@ -2948,7 +2948,7 @@ ConvertToMidasInternalCommandInner(const nsAString& inCommandID, } // String parameter -- see if we need to convert it (necessary for - // cmd_paragraphState) + // cmd_paragraphState and cmd_fontSize) if (outCommandID.EqualsLiteral("cmd_paragraphState")) { const PRUnichar* start = inParam.BeginReading(); const PRUnichar* end = inParam.EndReading(); @@ -2970,6 +2970,16 @@ ConvertToMidasInternalCommandInner(const nsAString& inCommandID, if (j == ArrayLength(gBlocks)) { outParam.Truncate(); } + } else if (outCommandID.EqualsLiteral("cmd_fontSize")) { + // Per editing spec as of April 23, 2012, we need to reject the value if + // it's not a valid floating-point number surrounded by optional whitespace. + // Otherwise, we parse it as a legacy font size. For now, we just parse as + // a legacy font size regardless (matching WebKit) -- bug 747879. + outParam.Truncate(); + PRInt32 size = nsContentUtils::ParseLegacyFontSize(inParam); + if (size) { + outParam.AppendInt(size); + } } else { CopyUTF16toUTF8(inParam, outParam); } @@ -3106,7 +3116,8 @@ nsHTMLDocument::ExecCommand(const nsAString & commandID, cmdToDispatch, paramStr, isBool, boolVal)) return NS_OK; - if (cmdToDispatch.EqualsLiteral("cmd_paragraphState") && paramStr.IsEmpty()) { + if ((cmdToDispatch.EqualsLiteral("cmd_paragraphState") || + cmdToDispatch.EqualsLiteral("cmd_fontSize")) && paramStr.IsEmpty()) { // Invalid value return NS_OK; } diff --git a/editor/libeditor/html/tests/Makefile.in b/editor/libeditor/html/tests/Makefile.in index 39f25fb3433..5ba7c513ae8 100644 --- a/editor/libeditor/html/tests/Makefile.in +++ b/editor/libeditor/html/tests/Makefile.in @@ -63,6 +63,7 @@ _TEST_FILES = \ test_bug456244.html \ test_bug460740.html \ test_bug478725.html \ + test_bug480647.html \ test_bug480972.html \ test_bug484181.html \ test_bug487524.html \ diff --git a/editor/libeditor/html/tests/browserscope/lib/richtext2/currentStatus.js b/editor/libeditor/html/tests/browserscope/lib/richtext2/currentStatus.js index 1c6f5078326..7624d60e1f3 100644 --- a/editor/libeditor/html/tests/browserscope/lib/richtext2/currentStatus.js +++ b/editor/libeditor/html/tests/browserscope/lib/richtext2/currentStatus.js @@ -5,6 +5,12 @@ */ const knownFailures = { "value": { + "A-Proposed-FS:18px_TEXT-1_SI-dM": true, + "A-Proposed-FS:18px_TEXT-1_SI-body": true, + "A-Proposed-FS:18px_TEXT-1_SI-div": true, + "A-Proposed-FS:large_TEXT-1_SI-dM": true, + "A-Proposed-FS:large_TEXT-1_SI-body": true, + "A-Proposed-FS:large_TEXT-1_SI-div": true, "A-Proposed-CB:name_TEXT-1_SI-dM": true, "A-Proposed-CB:name_TEXT-1_SI-body": true, "A-Proposed-CB:name_TEXT-1_SI-div": true, @@ -41,6 +47,12 @@ const knownFailures = { "C-Proposed-FS:5_FONTsz:1.s:fs:xs-1_SW-dM": true, "C-Proposed-FS:5_FONTsz:1.s:fs:xs-1_SW-body": true, "C-Proposed-FS:5_FONTsz:1.s:fs:xs-1_SW-div": true, + "C-Proposed-FS:larger_FONTsz:4-dM": true, + "C-Proposed-FS:larger_FONTsz:4-body": true, + "C-Proposed-FS:larger_FONTsz:4-div": true, + "C-Proposed-FS:smaller_FONTsz:4-dM": true, + "C-Proposed-FS:smaller_FONTsz:4-body": true, + "C-Proposed-FS:smaller_FONTsz:4-div": true, "C-Proposed-FB:h1_ADDRESS-FONTsz:4-1_SO-dM": true, "C-Proposed-FB:h1_ADDRESS-FONTsz:4-1_SO-body": true, "C-Proposed-FB:h1_ADDRESS-FONTsz:4-1_SO-div": true, @@ -74,9 +86,6 @@ const knownFailures = { "CC-Proposed-FS:1_SPANs:fs:l-1_SW-dM": true, "CC-Proposed-FS:1_SPANs:fs:l-1_SW-body": true, "CC-Proposed-FS:1_SPANs:fs:l-1_SW-div": true, - "CC-Proposed-FS:large_SPANs:fs:l-1_SW-dM": true, - "CC-Proposed-FS:large_SPANs:fs:l-1_SW-body": true, - "CC-Proposed-FS:large_SPANs:fs:l-1_SW-div": true, "CC-Proposed-FS:18px_SPANs:fs:l-1_SW-dM": true, "CC-Proposed-FS:18px_SPANs:fs:l-1_SW-body": true, "CC-Proposed-FS:18px_SPANs:fs:l-1_SW-div": true, @@ -869,9 +878,6 @@ const knownFailures = { "CC-Proposed-FS:1_SPANs:fs:l-1_SW-dM": true, "CC-Proposed-FS:1_SPANs:fs:l-1_SW-body": true, "CC-Proposed-FS:1_SPANs:fs:l-1_SW-div": true, - "CC-Proposed-FS:large_SPANs:fs:l-1_SW-dM": true, - "CC-Proposed-FS:large_SPANs:fs:l-1_SW-body": true, - "CC-Proposed-FS:large_SPANs:fs:l-1_SW-div": true, "CC-Proposed-FS:18px_SPANs:fs:l-1_SW-dM": true, "CC-Proposed-FS:18px_SPANs:fs:l-1_SW-body": true, "CC-Proposed-FS:18px_SPANs:fs:l-1_SW-div": true, diff --git a/editor/libeditor/html/tests/test_bug480647.html b/editor/libeditor/html/tests/test_bug480647.html new file mode 100644 index 00000000000..33f088a1b1a --- /dev/null +++ b/editor/libeditor/html/tests/test_bug480647.html @@ -0,0 +1,110 @@ + + +Test for Bug 480647 + + +Mozilla Bug 480647 +
+ From 51d3c28a67c3bb28e7bd7a7cf1baf23b7ada881f Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Tue, 24 Apr 2012 13:57:49 +0300 Subject: [PATCH 160/182] Bug 480647 part 6 - Handle CSS in execCommand("fontSize"); r=ehsan --- editor/libeditor/html/nsHTMLCSSUtils.cpp | 89 +++++++++++++++++-- editor/libeditor/html/nsHTMLCSSUtils.h | 16 +++- editor/libeditor/html/nsHTMLEditorStyle.cpp | 22 +++-- .../lib/richtext/currentStatus.js | 5 -- .../lib/richtext2/currentStatus.js | 27 ------ .../libeditor/html/tests/test_bug480647.html | 35 +++++++- 6 files changed, 144 insertions(+), 50 deletions(-) diff --git a/editor/libeditor/html/nsHTMLCSSUtils.cpp b/editor/libeditor/html/nsHTMLCSSUtils.cpp index 53fdd0b1011..5d446a8ba40 100644 --- a/editor/libeditor/html/nsHTMLCSSUtils.cpp +++ b/editor/libeditor/html/nsHTMLCSSUtils.cpp @@ -55,6 +55,7 @@ #include "nsAttrName.h" #include "nsAutoPtr.h" #include "mozilla/Preferences.h" +#include "nsContentUtils.h" using namespace mozilla; @@ -194,6 +195,45 @@ void ProcessMarginRightValue(const nsAString * aInputString, nsAString & aOutput } } +static +void ProcessFontSizeValue(const nsAString* aInputString, nsAString& aOutputString, + const char* aDefaultValueString, + const char* aPrependString, const char* aAppendString) +{ + aOutputString.Truncate(); + if (aInputString) { + PRInt32 size = nsContentUtils::ParseLegacyFontSize(*aInputString); + switch (size) { + case 0: + // Didn't parse + return; + case 1: + aOutputString.AssignLiteral("x-small"); + return; + case 2: + aOutputString.AssignLiteral("small"); + return; + case 3: + aOutputString.AssignLiteral("medium"); + return; + case 4: + aOutputString.AssignLiteral("large"); + return; + case 5: + aOutputString.AssignLiteral("x-large"); + return; + case 6: + aOutputString.AssignLiteral("xx-large"); + return; + case 7: + // No corresponding CSS size + return; + default: + NS_NOTREACHED("Unexpected return value from ParseLegacyFontSize"); + } + } +} + const nsHTMLCSSUtils::CSSEquivTable boldEquivTable[] = { { nsHTMLCSSUtils::eCSSEditableProperty_font_weight, ProcessBValue, nsnull, nsnull, nsnull, true, false }, { nsHTMLCSSUtils::eCSSEditableProperty_NONE, 0 } @@ -229,6 +269,11 @@ const nsHTMLCSSUtils::CSSEquivTable fontFaceEquivTable[] = { { nsHTMLCSSUtils::eCSSEditableProperty_NONE, 0 } }; +const nsHTMLCSSUtils::CSSEquivTable fontSizeEquivTable[] = { + { nsHTMLCSSUtils::eCSSEditableProperty_font_size, ProcessFontSizeValue, nsnull, nsnull, nsnull, true, false }, + { nsHTMLCSSUtils::eCSSEditableProperty_NONE, 0 } +}; + const nsHTMLCSSUtils::CSSEquivTable bgcolorEquivTable[] = { { nsHTMLCSSUtils::eCSSEditableProperty_background_color, ProcessSameValue, nsnull, nsnull, nsnull, true, false }, { nsHTMLCSSUtils::eCSSEditableProperty_NONE, 0 } @@ -312,21 +357,23 @@ nsHTMLCSSUtils::~nsHTMLCSSUtils() // Answers true if we have some CSS equivalence for the HTML style defined // by aProperty and/or aAttribute for the node aNode bool -nsHTMLCSSUtils::IsCSSEditableProperty(nsIDOMNode * aNode, - nsIAtom * aProperty, - const nsAString * aAttribute) +nsHTMLCSSUtils::IsCSSEditableProperty(nsIDOMNode* aNode, + nsIAtom* aProperty, + const nsAString* aAttribute, + const nsAString* aValue) { NS_ASSERTION(aNode, "Shouldn't you pass aNode? - Bug 214025"); nsCOMPtr content = do_QueryInterface(aNode); NS_ENSURE_TRUE(content, false); - return IsCSSEditableProperty(content, aProperty, aAttribute); + return IsCSSEditableProperty(content, aProperty, aAttribute, aValue); } bool nsHTMLCSSUtils::IsCSSEditableProperty(nsIContent* aNode, nsIAtom* aProperty, - const nsAString* aAttribute) + const nsAString* aAttribute, + const nsAString* aValue) { MOZ_ASSERT(aNode); @@ -352,6 +399,16 @@ nsHTMLCSSUtils::IsCSSEditableProperty(nsIContent* aNode, return true; } + // FONT SIZE doesn't work if the value is 7 + if (nsEditProperty::font == aProperty && aAttribute && + aAttribute->EqualsLiteral("size")) { + if (!aValue || aValue->IsEmpty()) { + return true; + } + PRInt32 size = nsContentUtils::ParseLegacyFontSize(*aValue); + return size && size != 7; + } + // ALIGN attribute on elements supporting it if (aAttribute && (aAttribute->EqualsLiteral("align")) && (nsEditProperty::div == tagName @@ -872,6 +929,9 @@ nsHTMLCSSUtils::GenerateCSSDeclarationsFromHTMLStyle(dom::Element* aElement, } else if (nsEditProperty::font == aHTMLProperty && aAttribute->EqualsLiteral("face")) { equivTable = fontFaceEquivTable; + } else if (nsEditProperty::font == aHTMLProperty && + aAttribute->EqualsLiteral("size")) { + equivTable = fontSizeEquivTable; } else if (aAttribute->EqualsLiteral("bgcolor")) { equivTable = bgcolorEquivTable; } else if (aAttribute->EqualsLiteral("background")) { @@ -926,7 +986,8 @@ nsHTMLCSSUtils::SetCSSEquivalentToHTMLStyle(nsIDOMNode * aNode, { nsCOMPtr element = do_QueryInterface(aNode); *aCount = 0; - if (!element || !IsCSSEditableProperty(element, aHTMLProperty, aAttribute)) { + if (!element || !IsCSSEditableProperty(element, aHTMLProperty, + aAttribute, aValue)) { return NS_OK; } @@ -1002,7 +1063,8 @@ nsHTMLCSSUtils::GetCSSEquivalentToHTMLInlineStyleSet(nsINode* aNode, nsCOMPtr theElement = GetElementContainerOrSelf(aNode); NS_ENSURE_TRUE(theElement, NS_ERROR_NULL_POINTER); - if (!theElement || !IsCSSEditableProperty(theElement, aHTMLProperty, aAttribute)) { + if (!theElement || !IsCSSEditableProperty(theElement, aHTMLProperty, + aAttribute, &aValueString)) { return NS_OK; } @@ -1154,6 +1216,19 @@ nsHTMLCSSUtils::IsCSSEquivalentToHTMLInlineStyleSet(nsIDOMNode *aNode, !valueStringLower.EqualsLiteral("serif"); } return NS_OK; + } else if (nsEditProperty::font == aHTMLProperty && aHTMLAttribute && + aHTMLAttribute->EqualsLiteral("size")) { + if (htmlValueString.IsEmpty()) { + aIsSet = true; + } else { + PRInt32 size = nsContentUtils::ParseLegacyFontSize(htmlValueString); + aIsSet = (size == 1 && valueString.EqualsLiteral("x-small")) || + (size == 2 && valueString.EqualsLiteral("small")) || + (size == 3 && valueString.EqualsLiteral("medium")) || + (size == 4 && valueString.EqualsLiteral("large")) || + (size == 5 && valueString.EqualsLiteral("x-large")) || + (size == 6 && valueString.EqualsLiteral("xx-large")); + } } else if (aHTMLAttribute && aHTMLAttribute->EqualsLiteral("align")) { aIsSet = true; } else { diff --git a/editor/libeditor/html/nsHTMLCSSUtils.h b/editor/libeditor/html/nsHTMLCSSUtils.h index 74eccca21e3..2ccbfbb301d 100644 --- a/editor/libeditor/html/nsHTMLCSSUtils.h +++ b/editor/libeditor/html/nsHTMLCSSUtils.h @@ -106,10 +106,20 @@ public: * @return a boolean saying if the tag/attribute has a css equiv * @param aNode [IN] a DOM node * @param aProperty [IN] an atom containing a HTML tag name - * @param aAttribute [IN] a string containing the name of a HTML attribute carried by the element above + * @param aAttribute [IN] a string containing the name of a HTML + * attribute carried by the element above + * @param aValue [IN] an optional string containing the attribute's + * HTML value -- this matters for , + * since size=7 has no CSS equivalent. Make sure + * you pass the HTML value (e.g. "4"), not the + * CSS value (e.g. "large"). */ - bool IsCSSEditableProperty(nsIContent* aNode, nsIAtom* aProperty, const nsAString* aAttribute); - bool IsCSSEditableProperty(nsIDOMNode* aNode, nsIAtom* aProperty, const nsAString* aAttribute); + bool IsCSSEditableProperty(nsIContent* aNode, nsIAtom* aProperty, + const nsAString* aAttribute, + const nsAString* aValue = nsnull); + bool IsCSSEditableProperty(nsIDOMNode* aNode, nsIAtom* aProperty, + const nsAString* aAttribute, + const nsAString* aValue = nsnull); /** adds/remove a CSS declaration to the STYLE atrribute carried by a given element * diff --git a/editor/libeditor/html/nsHTMLEditorStyle.cpp b/editor/libeditor/html/nsHTMLEditorStyle.cpp index c996d740e1d..6eccc3f9154 100644 --- a/editor/libeditor/html/nsHTMLEditorStyle.cpp +++ b/editor/libeditor/html/nsHTMLEditorStyle.cpp @@ -290,7 +290,8 @@ nsHTMLEditor::SetInlinePropertyOnTextNode( nsIDOMCharacterData *aTextNode, // don't need to do anything if property already set on node bool bHasProp; if (IsCSSEnabled() && - mHTMLCSSUtils->IsCSSEditableProperty(node, aProperty, aAttribute)) { + mHTMLCSSUtils->IsCSSEditableProperty(node, aProperty, + aAttribute, aValue)) { // the HTML styles defined by aProperty/aAttribute has a CSS equivalence // in this implementation for node; let's check if it carries those css styles nsAutoString value; @@ -402,9 +403,10 @@ nsHTMLEditor::SetInlinePropertyOnNodeImpl(nsIDOMNode *aNode, } bool useCSS = (IsCSSEnabled() && - mHTMLCSSUtils->IsCSSEditableProperty(aNode, aProperty, aAttribute)) || - // bgcolor is always done using CSS - aAttribute->EqualsLiteral("bgcolor"); + mHTMLCSSUtils->IsCSSEditableProperty(aNode, aProperty, + aAttribute, aValue)) || + // bgcolor is always done using CSS + aAttribute->EqualsLiteral("bgcolor"); if (useCSS) { tmp = aNode; @@ -1111,7 +1113,11 @@ nsHTMLEditor::GetInlinePropertyBase(nsIAtom *aProperty, bool isSet = false; nsCOMPtr resultNode; if (first) { - if (mHTMLCSSUtils->IsCSSEditableProperty(node, aProperty, aAttribute)) { + if (mHTMLCSSUtils->IsCSSEditableProperty(node, aProperty, + aAttribute) && + // Bug 747889: we don't support CSS for fontSize values + (aProperty != nsEditProperty::font || + !aAttribute->EqualsLiteral("size"))) { // the HTML styles defined by aProperty/aAttribute has a CSS // equivalence in this implementation for node; let's check if it // carries those css styles @@ -1131,7 +1137,11 @@ nsHTMLEditor::GetInlinePropertyBase(nsIAtom *aProperty, *outValue = firstValue; } } else { - if (mHTMLCSSUtils->IsCSSEditableProperty(node, aProperty, aAttribute)) { + if (mHTMLCSSUtils->IsCSSEditableProperty(node, aProperty, + aAttribute) && + // Bug 747889: we don't support CSS for fontSize values + (aProperty != nsEditProperty::font || + !aAttribute->EqualsLiteral("size"))) { // the HTML styles defined by aProperty/aAttribute has a CSS equivalence // in this implementation for node; let's check if it carries those css styles if (aValue) { diff --git a/editor/libeditor/html/tests/browserscope/lib/richtext/currentStatus.js b/editor/libeditor/html/tests/browserscope/lib/richtext/currentStatus.js index b30775d043d..1db07455064 100644 --- a/editor/libeditor/html/tests/browserscope/lib/richtext/currentStatus.js +++ b/editor/libeditor/html/tests/browserscope/lib/richtext/currentStatus.js @@ -19,7 +19,6 @@ var knownFailures = { }, 'a' : { 'createbookmark-0' : true, - 'fontsize-1' : true, 'subscript-1' : true, 'superscript-1' : true, }, @@ -35,10 +34,6 @@ var knownFailures = { 'fontsize-1' : true, 'fontsize-2' : true, }, - 'c': { - 'fontsize-1' : true, - 'fontsize-2' : true, - }, }; function isKnownFailure(type, test, param) { diff --git a/editor/libeditor/html/tests/browserscope/lib/richtext2/currentStatus.js b/editor/libeditor/html/tests/browserscope/lib/richtext2/currentStatus.js index 7624d60e1f3..471820d0501 100644 --- a/editor/libeditor/html/tests/browserscope/lib/richtext2/currentStatus.js +++ b/editor/libeditor/html/tests/browserscope/lib/richtext2/currentStatus.js @@ -20,9 +20,6 @@ const knownFailures = { "AC-Proposed-SUP_TEXT-1_SI-dM": true, "AC-Proposed-SUP_TEXT-1_SI-body": true, "AC-Proposed-SUP_TEXT-1_SI-div": true, - "AC-Proposed-FS:2_TEXT-1_SI-dM": true, - "AC-Proposed-FS:2_TEXT-1_SI-body": true, - "AC-Proposed-FS:2_TEXT-1_SI-div": true, "AC-Proposed-FS:18px_TEXT-1_SI-dM": true, "AC-Proposed-FS:18px_TEXT-1_SI-body": true, "AC-Proposed-FS:18px_TEXT-1_SI-div": true, @@ -44,9 +41,6 @@ const knownFailures = { "C-Proposed-FS:1_SPAN.ass.s:fs:large-1_SW-dM": true, "C-Proposed-FS:1_SPAN.ass.s:fs:large-1_SW-body": true, "C-Proposed-FS:1_SPAN.ass.s:fs:large-1_SW-div": true, - "C-Proposed-FS:5_FONTsz:1.s:fs:xs-1_SW-dM": true, - "C-Proposed-FS:5_FONTsz:1.s:fs:xs-1_SW-body": true, - "C-Proposed-FS:5_FONTsz:1.s:fs:xs-1_SW-div": true, "C-Proposed-FS:larger_FONTsz:4-dM": true, "C-Proposed-FS:larger_FONTsz:4-body": true, "C-Proposed-FS:larger_FONTsz:4-div": true, @@ -83,18 +77,9 @@ const knownFailures = { "CC-Proposed-FN:c_FONTf:a-2_SL-dM": true, "CC-Proposed-FN:c_FONTf:a-2_SL-body": true, "CC-Proposed-FN:c_FONTf:a-2_SL-div": true, - "CC-Proposed-FS:1_SPANs:fs:l-1_SW-dM": true, - "CC-Proposed-FS:1_SPANs:fs:l-1_SW-body": true, - "CC-Proposed-FS:1_SPANs:fs:l-1_SW-div": true, "CC-Proposed-FS:18px_SPANs:fs:l-1_SW-dM": true, "CC-Proposed-FS:18px_SPANs:fs:l-1_SW-body": true, "CC-Proposed-FS:18px_SPANs:fs:l-1_SW-div": true, - "CC-Proposed-FS:4_SPANs:fs:l-1_SW-dM": true, - "CC-Proposed-FS:4_SPANs:fs:l-1_SW-body": true, - "CC-Proposed-FS:4_SPANs:fs:l-1_SW-div": true, - "CC-Proposed-FS:4_SPANs:fs:18px-1_SW-dM": true, - "CC-Proposed-FS:4_SPANs:fs:18px-1_SW-body": true, - "CC-Proposed-FS:4_SPANs:fs:18px-1_SW-div": true, "CC-Proposed-FS:larger_SPANs:fs:l-1_SI-dM": true, "CC-Proposed-FS:larger_SPANs:fs:l-1_SI-body": true, "CC-Proposed-FS:larger_SPANs:fs:l-1_SI-div": true, @@ -827,9 +812,6 @@ const knownFailures = { "C-Proposed-FS:1_SPAN.ass.s:fs:large-1_SW-dM": true, "C-Proposed-FS:1_SPAN.ass.s:fs:large-1_SW-body": true, "C-Proposed-FS:1_SPAN.ass.s:fs:large-1_SW-div": true, - "C-Proposed-FS:5_FONTsz:1.s:fs:xs-1_SW-dM": true, - "C-Proposed-FS:5_FONTsz:1.s:fs:xs-1_SW-body": true, - "C-Proposed-FS:5_FONTsz:1.s:fs:xs-1_SW-div": true, "C-Proposed-FS:2_FONTc:b.sz:6-1_SI-dM": true, "C-Proposed-FS:2_FONTc:b.sz:6-1_SI-body": true, "C-Proposed-FS:2_FONTc:b.sz:6-1_SI-div": true, @@ -875,18 +857,9 @@ const knownFailures = { "CC-Proposed-FN:c_FONTf:a-2_SL-dM": true, "CC-Proposed-FN:c_FONTf:a-2_SL-body": true, "CC-Proposed-FN:c_FONTf:a-2_SL-div": true, - "CC-Proposed-FS:1_SPANs:fs:l-1_SW-dM": true, - "CC-Proposed-FS:1_SPANs:fs:l-1_SW-body": true, - "CC-Proposed-FS:1_SPANs:fs:l-1_SW-div": true, "CC-Proposed-FS:18px_SPANs:fs:l-1_SW-dM": true, "CC-Proposed-FS:18px_SPANs:fs:l-1_SW-body": true, "CC-Proposed-FS:18px_SPANs:fs:l-1_SW-div": true, - "CC-Proposed-FS:4_SPANs:fs:l-1_SW-dM": true, - "CC-Proposed-FS:4_SPANs:fs:l-1_SW-body": true, - "CC-Proposed-FS:4_SPANs:fs:l-1_SW-div": true, - "CC-Proposed-FS:4_SPANs:fs:18px-1_SW-dM": true, - "CC-Proposed-FS:4_SPANs:fs:18px-1_SW-body": true, - "CC-Proposed-FS:4_SPANs:fs:18px-1_SW-div": true, "CC-Proposed-FS:larger_SPANs:fs:l-1_SI-dM": true, "CC-Proposed-FS:larger_SPANs:fs:l-1_SI-body": true, "CC-Proposed-FS:larger_SPANs:fs:l-1_SI-div": true, diff --git a/editor/libeditor/html/tests/test_bug480647.html b/editor/libeditor/html/tests/test_bug480647.html index 33f088a1b1a..b38dd54bfe4 100644 --- a/editor/libeditor/html/tests/test_bug480647.html +++ b/editor/libeditor/html/tests/test_bug480647.html @@ -21,16 +21,47 @@ function parseFontSizeTodo(input, expected) { } function parseFontSizeInner(input, expected, fn) { + // First test non-CSS + document.execCommand("styleWithCSS", false, false); div.innerHTML = "foo"; getSelection().selectAllChildren(div); document.execCommand("fontSize", false, input); if (expected === null) { fn(div.innerHTML, "foo", - 'execCommand("fontSize", false, "' + input + '") should be no-op'); + 'execCommand("fontSize", false, "' + input + '") should be no-op ' + + '(non-CSS)'); } else { fn(div.innerHTML, 'foo', 'execCommand("fontSize", false, "' + input + '") should parse to ' + - expected); + expected + ' (non-CSS)'); + } + + // Now test CSS + document.execCommand("styleWithCSS", false, true); + div.innerHTML = "foo"; + getSelection().selectAllChildren(div); + document.execCommand("fontSize", false, input); + if (expected === null) { + fn(div.innerHTML, "foo", + 'execCommand("fontSize", false, "' + input + '") should be no-op ' + + '(CSS)'); + } else if (expected === 7) { + // No CSS support for + fn(div.innerHTML, 'foo', + 'execCommand("fontSize", false, "' + input + '") should parse to ' + + expected + ' (CSS)'); + } else { + var cssVal = { + 1: "x-small", + 2: "small", + 3: "medium", + 4: "large", + 5: "x-large", + 6: "xx-large", + }[expected]; + fn(div.innerHTML, 'foo', + 'execCommand("fontSize", false, "' + input + '") should parse to ' + + expected + ' (CSS)'); } } From 52d3235b4683e7611b3ee7517855636880734bf6 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Tue, 24 Apr 2012 00:49:25 -0400 Subject: [PATCH 161/182] Bug 722942 - Obtain private browsing status from document of plugin owner, and watch private mode transitions on a per-instance basis. r=josh --- dom/plugins/base/nsNPAPIPlugin.cpp | 14 ++++++----- dom/plugins/base/nsNPAPIPluginInstance.cpp | 29 ++++++++-------------- dom/plugins/base/nsNPAPIPluginInstance.h | 2 +- dom/plugins/base/nsPluginHost.cpp | 8 ------ dom/plugins/base/nsPluginInstanceOwner.cpp | 23 +++++++++++++++-- dom/plugins/base/nsPluginInstanceOwner.h | 7 +++++- 6 files changed, 46 insertions(+), 37 deletions(-) diff --git a/dom/plugins/base/nsNPAPIPlugin.cpp b/dom/plugins/base/nsNPAPIPlugin.cpp index 8923e0b6dc9..bacd13e03e8 100644 --- a/dom/plugins/base/nsNPAPIPlugin.cpp +++ b/dom/plugins/base/nsNPAPIPlugin.cpp @@ -54,7 +54,6 @@ #include "nsNPAPIPluginStreamListener.h" #include "nsIServiceManager.h" #include "nsThreadUtils.h" -#include "nsIPrivateBrowsingService.h" #include "mozilla/Preferences.h" #include "nsIPluginStreamListener.h" @@ -105,6 +104,8 @@ #include "nsJSNPRuntime.h" #include "nsIHttpAuthManager.h" #include "nsICookieService.h" +#include "nsILoadContext.h" +#include "nsIDocShell.h" #include "nsNetUtil.h" @@ -2135,11 +2136,12 @@ _getvalue(NPP npp, NPNVariable variable, void *result) } case NPNVprivateModeBool: { - nsCOMPtr pbs = do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID); - if (pbs) { - bool enabled; - pbs->GetPrivateBrowsingEnabled(&enabled); - *(NPBool*)result = (NPBool)enabled; + nsCOMPtr doc = GetDocumentFromNPP(npp); + nsCOMPtr domwindow = do_QueryInterface(doc); + if (domwindow) { + nsCOMPtr docShell = domwindow->GetDocShell(); + nsCOMPtr loadContext = do_QueryInterface(docShell); + *(NPBool*)result = (NPBool)(loadContext && loadContext->UsePrivateBrowsing()); return NPERR_NO_ERROR; } return NPERR_GENERIC_ERROR; diff --git a/dom/plugins/base/nsNPAPIPluginInstance.cpp b/dom/plugins/base/nsNPAPIPluginInstance.cpp index 4d5f091284b..6400042c72d 100644 --- a/dom/plugins/base/nsNPAPIPluginInstance.cpp +++ b/dom/plugins/base/nsNPAPIPluginInstance.cpp @@ -48,7 +48,6 @@ #include "nsPluginHost.h" #include "nsPluginSafety.h" #include "nsPluginLogging.h" -#include "nsIPrivateBrowsingService.h" #include "nsContentUtils.h" #include "nsIDocument.h" @@ -152,7 +151,7 @@ nsresult nsNPAPIPluginInstance::Initialize(nsNPAPIPlugin *aPlugin, nsIPluginInst PL_strcpy(mMIMEType, aMIMEType); } } - + return Start(); } @@ -1143,7 +1142,7 @@ nsNPAPIPluginInstance::GetPluginAPIVersion(PRUint16* version) } nsresult -nsNPAPIPluginInstance::PrivateModeStateChanged() +nsNPAPIPluginInstance::PrivateModeStateChanged(bool enabled) { if (RUNNING != mRunning) return NS_OK; @@ -1155,23 +1154,15 @@ nsNPAPIPluginInstance::PrivateModeStateChanged() NPPluginFuncs* pluginFunctions = mPlugin->PluginFuncs(); - if (pluginFunctions->setvalue) { - PluginDestructionGuard guard(this); - - nsCOMPtr pbs = do_GetService(NS_PRIVATE_BROWSING_SERVICE_CONTRACTID); - if (pbs) { - bool pme = false; - nsresult rv = pbs->GetPrivateBrowsingEnabled(&pme); - if (NS_FAILED(rv)) - return rv; + if (!pluginFunctions->setvalue) + return NS_ERROR_FAILURE; - NPError error; - NPBool value = static_cast(pme); - NS_TRY_SAFE_CALL_RETURN(error, (*pluginFunctions->setvalue)(&mNPP, NPNVprivateModeBool, &value), this); - return (error == NPERR_NO_ERROR) ? NS_OK : NS_ERROR_FAILURE; - } - } - return NS_ERROR_FAILURE; + PluginDestructionGuard guard(this); + + NPError error; + NPBool value = static_cast(enabled); + NS_TRY_SAFE_CALL_RETURN(error, (*pluginFunctions->setvalue)(&mNPP, NPNVprivateModeBool, &value), this); + return (error == NPERR_NO_ERROR) ? NS_OK : NS_ERROR_FAILURE; } class DelayUnscheduleEvent : public nsRunnable { diff --git a/dom/plugins/base/nsNPAPIPluginInstance.h b/dom/plugins/base/nsNPAPIPluginInstance.h index d8b4a87e342..1bf381b0808 100644 --- a/dom/plugins/base/nsNPAPIPluginInstance.h +++ b/dom/plugins/base/nsNPAPIPluginInstance.h @@ -204,7 +204,7 @@ public: already_AddRefed GetDOMWindow(); - nsresult PrivateModeStateChanged(); + nsresult PrivateModeStateChanged(bool aEnabled); nsresult GetDOMElement(nsIDOMElement* *result); diff --git a/dom/plugins/base/nsPluginHost.cpp b/dom/plugins/base/nsPluginHost.cpp index 560e2192e33..8f74705b95c 100644 --- a/dom/plugins/base/nsPluginHost.cpp +++ b/dom/plugins/base/nsPluginHost.cpp @@ -86,7 +86,6 @@ #include "nsIScriptChannel.h" #include "nsIBlocklistService.h" #include "nsVersionComparator.h" -#include "nsIPrivateBrowsingService.h" #include "nsIObjectLoadingContent.h" #include "nsIWritablePropertyBag2.h" #include "nsPluginStreamListenerPeer.h" @@ -357,7 +356,6 @@ nsPluginHost::nsPluginHost() mozilla::services::GetObserverService(); if (obsService) { obsService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false); - obsService->AddObserver(this, NS_PRIVATE_BROWSING_SWITCH_TOPIC, false); #ifdef MOZ_WIDGET_ANDROID obsService->AddObserver(this, "application-foreground", false); obsService->AddObserver(this, "application-background", false); @@ -3330,12 +3328,6 @@ NS_IMETHODIMP nsPluginHost::Observe(nsISupports *aSubject, Destroy(); sInst->Release(); } - if (!nsCRT::strcmp(NS_PRIVATE_BROWSING_SWITCH_TOPIC, aTopic)) { - // inform all active plugins of changed private mode state - for (PRUint32 i = 0; i < mInstances.Length(); i++) { - mInstances[i]->PrivateModeStateChanged(); - } - } #ifdef MOZ_WIDGET_ANDROID if (!nsCRT::strcmp("application-background", aTopic)) { for(PRUint32 i = 0; i < mInstances.Length(); i++) { diff --git a/dom/plugins/base/nsPluginInstanceOwner.cpp b/dom/plugins/base/nsPluginInstanceOwner.cpp index bdf34a35cb3..b37e6af80d0 100644 --- a/dom/plugins/base/nsPluginInstanceOwner.cpp +++ b/dom/plugins/base/nsPluginInstanceOwner.cpp @@ -100,6 +100,7 @@ using mozilla::DefaultXDisplay; #include "nsIScrollableFrame.h" #include "nsIImageLoadingContent.h" #include "nsIObjectLoadingContent.h" +#include "nsIDocShell.h" #include "nsContentCID.h" #include "nsWidgetsCID.h" @@ -404,10 +405,12 @@ nsPluginInstanceOwner::~nsPluginInstanceOwner() } } -NS_IMPL_ISUPPORTS3(nsPluginInstanceOwner, +NS_IMPL_ISUPPORTS5(nsPluginInstanceOwner, nsIPluginInstanceOwner, nsIPluginTagInfo, - nsIDOMEventListener) + nsIDOMEventListener, + nsIPrivacyTransitionObserver, + nsISupportsWeakReference) nsresult nsPluginInstanceOwner::SetInstance(nsNPAPIPluginInstance *aInstance) @@ -427,6 +430,17 @@ nsPluginInstanceOwner::SetInstance(nsNPAPIPluginInstance *aInstance) mInstance = aInstance; + nsCOMPtr doc; + GetDocument(getter_AddRefs(doc)); + if (doc) { + nsCOMPtr domWindow = doc->GetWindow(); + if (domWindow) { + nsCOMPtr docShell = domWindow->GetDocShell(); + if (docShell) + docShell->AddWeakPrivacyTransitionObserver(this); + } + } + return NS_OK; } @@ -3798,6 +3812,11 @@ void nsPluginInstanceOwner::FixUpURLS(const nsString &name, nsAString &value) } } +NS_IMETHODIMP nsPluginInstanceOwner::PrivateModeChanged(bool aEnabled) +{ + return mInstance ? mInstance->PrivateModeStateChanged(aEnabled) : NS_OK; +} + // nsPluginDOMContextMenuListener class implementation nsPluginDOMContextMenuListener::nsPluginDOMContextMenuListener() diff --git a/dom/plugins/base/nsPluginInstanceOwner.h b/dom/plugins/base/nsPluginInstanceOwner.h index d2c77986158..f6c764c2366 100644 --- a/dom/plugins/base/nsPluginInstanceOwner.h +++ b/dom/plugins/base/nsPluginInstanceOwner.h @@ -52,10 +52,12 @@ #include "nsCOMPtr.h" #include "nsIPluginInstanceOwner.h" #include "nsIPluginTagInfo.h" +#include "nsIPrivacyTransitionObserver.h" #include "nsIDOMEventListener.h" #include "nsIScrollPositionListener.h" #include "nsPluginHost.h" #include "nsPluginNativeWindow.h" +#include "nsWeakReference.h" #include "gfxRect.h" // X.h defines KeyPress @@ -103,7 +105,9 @@ namespace mozilla { class nsPluginInstanceOwner : public nsIPluginInstanceOwner, public nsIPluginTagInfo, public nsIDOMEventListener, - public nsIScrollPositionListener + public nsIScrollPositionListener, + public nsIPrivacyTransitionObserver, + public nsSupportsWeakReference { public: nsPluginInstanceOwner(); @@ -111,6 +115,7 @@ public: NS_DECL_ISUPPORTS NS_DECL_NSIPLUGININSTANCEOWNER + NS_DECL_NSIPRIVACYTRANSITIONOBSERVER NS_IMETHOD GetURL(const char *aURL, const char *aTarget, nsIInputStream *aPostStream, From 44970911b77f99b749b7c74650f2110ebcfe194f Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Tue, 24 Apr 2012 00:54:11 -0400 Subject: [PATCH 162/182] Bug 748223 - Pack nsEditor better; r=roc --- editor/libeditor/base/nsEditor.cpp | 22 ++++----- editor/libeditor/base/nsEditor.h | 75 +++++++++++++++--------------- 2 files changed, 45 insertions(+), 52 deletions(-) diff --git a/editor/libeditor/base/nsEditor.cpp b/editor/libeditor/base/nsEditor.cpp index 0d220148e52..74e15405d5d 100644 --- a/editor/libeditor/base/nsEditor.cpp +++ b/editor/libeditor/base/nsEditor.cpp @@ -147,34 +147,28 @@ extern nsIParserService *sParserService; //--------------------------------------------------------------------------- nsEditor::nsEditor() -: mModCount(0) +: mPlaceHolderName(nsnull) +, mSelState(nsnull) +, mPhonetic(nsnull) +, mModCount(0) , mFlags(0) , mUpdateCount(0) -, mSpellcheckCheckboxState(eTriUnset) -, mPlaceHolderTxn(nsnull) -, mPlaceHolderName(nsnull) , mPlaceHolderBatch(0) -, mSelState(nsnull) -, mSavedSel() -, mRangeUpdater() , mAction(nsnull) -, mDirection(eNone) -, mIMETextNode(nsnull) +, mHandlingActionCount(0) , mIMETextOffset(0) , mIMEBufferLength(0) +, mDocDirtyState(-1) +, mDirection(eNone) +, mSpellcheckCheckboxState(eTriUnset) , mInIMEMode(false) , mIsIMEComposing(false) , mShouldTxnSetSelection(true) , mDidPreDestroy(false) , mDidPostCreate(false) -, mDocDirtyState(-1) -, mDocWeak(nsnull) -, mPhonetic(nsnull) -, mHandlingActionCount(0) , mHandlingTrustedAction(false) , mDispatchInputEvent(true) { - //initialize member variables here } nsEditor::~nsEditor() diff --git a/editor/libeditor/base/nsEditor.h b/editor/libeditor/base/nsEditor.h index f773f4686fc..e6448c18e20 100644 --- a/editor/libeditor/base/nsEditor.h +++ b/editor/libeditor/base/nsEditor.h @@ -218,8 +218,6 @@ public: void SwitchTextDirectionTo(PRUint32 aDirection); protected: - nsCString mContentMIMEType; // MIME type of the doc we are editing. - nsresult DetermineCurrentDirection(); /** create a transaction for setting aAttribute to aValue on aElement @@ -793,59 +791,60 @@ public: }; protected: - - PRUint32 mModCount; // number of modifications (for undo/redo stack) - PRUint32 mFlags; // behavior flags. See nsIPlaintextEditor.idl for the flags we use. - - nsWeakPtr mSelConWeak; // weak reference to the nsISelectionController - PRInt32 mUpdateCount; - - // Spellchecking enum Tristate { eTriUnset, eTriFalse, eTriTrue - } mSpellcheckCheckboxState; + }; + // Spellchecking + nsCString mContentMIMEType; // MIME type of the doc we are editing. + nsCOMPtr mInlineSpellChecker; nsCOMPtr mTxnMgr; - nsWeakPtr mPlaceHolderTxn; // weak reference to placeholder for begin/end batch purposes - nsIAtom *mPlaceHolderName; // name of placeholder transaction - PRInt32 mPlaceHolderBatch; // nesting count for batching - nsSelectionState *mSelState; // saved selection state for placeholder txn batching - nsSelectionState mSavedSel; // cached selection for nsAutoSelectionReset - nsRangeUpdater mRangeUpdater; // utility class object for maintaining preserved ranges - nsCOMPtr mRootElement; // cached root node - PRInt32 mAction; // the current editor action - EDirection mDirection; // the current direction of editor action - - // data necessary to build IME transactions + nsCOMPtr mRootElement; // cached root node nsCOMPtr mIMETextRangeList; // IME special selection ranges nsCOMPtr mIMETextNode; // current IME text node - PRUint32 mIMETextOffset; // offset in text node where IME comp string begins - PRUint32 mIMEBufferLength; // current length of IME comp string - bool mInIMEMode; // are we inside an IME composition? - bool mIsIMEComposing; // is IME in composition state? - // This is different from mInIMEMode. see Bug 98434. + nsCOMPtr mEventTarget; // The form field as an event receiver + nsCOMPtr mEventListener; + nsWeakPtr mSelConWeak; // weak reference to the nsISelectionController + nsWeakPtr mPlaceHolderTxn; // weak reference to placeholder for begin/end batch purposes + nsWeakPtr mDocWeak; // weak reference to the nsIDOMDocument + nsIAtom *mPlaceHolderName; // name of placeholder transaction + nsSelectionState *mSelState; // saved selection state for placeholder txn batching + nsString *mPhonetic; - bool mShouldTxnSetSelection; // turn off for conservative selection adjustment by txns - bool mDidPreDestroy; // whether PreDestroy has been called - bool mDidPostCreate; // whether PostCreate has been called - // various listeners + // various listeners nsCOMArray mActionListeners; // listens to all low level actions on the doc nsCOMArray mEditorObservers; // just notify once per high level change nsCOMArray mDocStateListeners;// listen to overall doc state (dirty or not, just created, etc) - PRInt8 mDocDirtyState; // -1 = not initialized - nsWeakPtr mDocWeak; // weak reference to the nsIDOMDocument - // The form field as an event receiver - nsCOMPtr mEventTarget; + nsSelectionState mSavedSel; // cached selection for nsAutoSelectionReset + nsRangeUpdater mRangeUpdater; // utility class object for maintaining preserved ranges - nsString* mPhonetic; + PRUint32 mModCount; // number of modifications (for undo/redo stack) + PRUint32 mFlags; // behavior flags. See nsIPlaintextEditor.idl for the flags we use. - nsCOMPtr mEventListener; + PRInt32 mUpdateCount; - PRUint32 mHandlingActionCount; + PRInt32 mPlaceHolderBatch; // nesting count for batching + PRInt32 mAction; // the current editor action + PRUint32 mHandlingActionCount; + + PRUint32 mIMETextOffset; // offset in text node where IME comp string begins + PRUint32 mIMEBufferLength; // current length of IME comp string + + EDirection mDirection; // the current direction of editor action + PRInt8 mDocDirtyState; // -1 = not initialized + PRUint8 mSpellcheckCheckboxState; // a Tristate value + + bool mInIMEMode; // are we inside an IME composition? + bool mIsIMEComposing; // is IME in composition state? + // This is different from mInIMEMode. see Bug 98434. + + bool mShouldTxnSetSelection; // turn off for conservative selection adjustment by txns + bool mDidPreDestroy; // whether PreDestroy has been called + bool mDidPostCreate; // whether PostCreate has been called bool mHandlingTrustedAction; bool mDispatchInputEvent; From fff9b721e00163bdabb72b10752abecdda00964e Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Tue, 24 Apr 2012 12:16:34 -0400 Subject: [PATCH 163/182] Backed out changeset 3e6ca2158274 because of build bustage --- editor/libeditor/base/nsEditor.cpp | 22 +++++---- editor/libeditor/base/nsEditor.h | 75 +++++++++++++++--------------- 2 files changed, 52 insertions(+), 45 deletions(-) diff --git a/editor/libeditor/base/nsEditor.cpp b/editor/libeditor/base/nsEditor.cpp index 74e15405d5d..0d220148e52 100644 --- a/editor/libeditor/base/nsEditor.cpp +++ b/editor/libeditor/base/nsEditor.cpp @@ -147,28 +147,34 @@ extern nsIParserService *sParserService; //--------------------------------------------------------------------------- nsEditor::nsEditor() -: mPlaceHolderName(nsnull) -, mSelState(nsnull) -, mPhonetic(nsnull) -, mModCount(0) +: mModCount(0) , mFlags(0) , mUpdateCount(0) +, mSpellcheckCheckboxState(eTriUnset) +, mPlaceHolderTxn(nsnull) +, mPlaceHolderName(nsnull) , mPlaceHolderBatch(0) +, mSelState(nsnull) +, mSavedSel() +, mRangeUpdater() , mAction(nsnull) -, mHandlingActionCount(0) +, mDirection(eNone) +, mIMETextNode(nsnull) , mIMETextOffset(0) , mIMEBufferLength(0) -, mDocDirtyState(-1) -, mDirection(eNone) -, mSpellcheckCheckboxState(eTriUnset) , mInIMEMode(false) , mIsIMEComposing(false) , mShouldTxnSetSelection(true) , mDidPreDestroy(false) , mDidPostCreate(false) +, mDocDirtyState(-1) +, mDocWeak(nsnull) +, mPhonetic(nsnull) +, mHandlingActionCount(0) , mHandlingTrustedAction(false) , mDispatchInputEvent(true) { + //initialize member variables here } nsEditor::~nsEditor() diff --git a/editor/libeditor/base/nsEditor.h b/editor/libeditor/base/nsEditor.h index e6448c18e20..f773f4686fc 100644 --- a/editor/libeditor/base/nsEditor.h +++ b/editor/libeditor/base/nsEditor.h @@ -218,6 +218,8 @@ public: void SwitchTextDirectionTo(PRUint32 aDirection); protected: + nsCString mContentMIMEType; // MIME type of the doc we are editing. + nsresult DetermineCurrentDirection(); /** create a transaction for setting aAttribute to aValue on aElement @@ -791,60 +793,59 @@ public: }; protected: + + PRUint32 mModCount; // number of modifications (for undo/redo stack) + PRUint32 mFlags; // behavior flags. See nsIPlaintextEditor.idl for the flags we use. + + nsWeakPtr mSelConWeak; // weak reference to the nsISelectionController + PRInt32 mUpdateCount; + + // Spellchecking enum Tristate { eTriUnset, eTriFalse, eTriTrue - }; - // Spellchecking - nsCString mContentMIMEType; // MIME type of the doc we are editing. - + } mSpellcheckCheckboxState; nsCOMPtr mInlineSpellChecker; nsCOMPtr mTxnMgr; - nsCOMPtr mRootElement; // cached root node + nsWeakPtr mPlaceHolderTxn; // weak reference to placeholder for begin/end batch purposes + nsIAtom *mPlaceHolderName; // name of placeholder transaction + PRInt32 mPlaceHolderBatch; // nesting count for batching + nsSelectionState *mSelState; // saved selection state for placeholder txn batching + nsSelectionState mSavedSel; // cached selection for nsAutoSelectionReset + nsRangeUpdater mRangeUpdater; // utility class object for maintaining preserved ranges + nsCOMPtr mRootElement; // cached root node + PRInt32 mAction; // the current editor action + EDirection mDirection; // the current direction of editor action + + // data necessary to build IME transactions nsCOMPtr mIMETextRangeList; // IME special selection ranges nsCOMPtr mIMETextNode; // current IME text node - nsCOMPtr mEventTarget; // The form field as an event receiver - nsCOMPtr mEventListener; - nsWeakPtr mSelConWeak; // weak reference to the nsISelectionController - nsWeakPtr mPlaceHolderTxn; // weak reference to placeholder for begin/end batch purposes - nsWeakPtr mDocWeak; // weak reference to the nsIDOMDocument - nsIAtom *mPlaceHolderName; // name of placeholder transaction - nsSelectionState *mSelState; // saved selection state for placeholder txn batching - nsString *mPhonetic; + PRUint32 mIMETextOffset; // offset in text node where IME comp string begins + PRUint32 mIMEBufferLength; // current length of IME comp string + bool mInIMEMode; // are we inside an IME composition? + bool mIsIMEComposing; // is IME in composition state? + // This is different from mInIMEMode. see Bug 98434. - // various listeners + bool mShouldTxnSetSelection; // turn off for conservative selection adjustment by txns + bool mDidPreDestroy; // whether PreDestroy has been called + bool mDidPostCreate; // whether PostCreate has been called + // various listeners nsCOMArray mActionListeners; // listens to all low level actions on the doc nsCOMArray mEditorObservers; // just notify once per high level change nsCOMArray mDocStateListeners;// listen to overall doc state (dirty or not, just created, etc) - nsSelectionState mSavedSel; // cached selection for nsAutoSelectionReset - nsRangeUpdater mRangeUpdater; // utility class object for maintaining preserved ranges + PRInt8 mDocDirtyState; // -1 = not initialized + nsWeakPtr mDocWeak; // weak reference to the nsIDOMDocument + // The form field as an event receiver + nsCOMPtr mEventTarget; - PRUint32 mModCount; // number of modifications (for undo/redo stack) - PRUint32 mFlags; // behavior flags. See nsIPlaintextEditor.idl for the flags we use. + nsString* mPhonetic; - PRInt32 mUpdateCount; + nsCOMPtr mEventListener; - PRInt32 mPlaceHolderBatch; // nesting count for batching - PRInt32 mAction; // the current editor action - PRUint32 mHandlingActionCount; - - PRUint32 mIMETextOffset; // offset in text node where IME comp string begins - PRUint32 mIMEBufferLength; // current length of IME comp string - - EDirection mDirection; // the current direction of editor action - PRInt8 mDocDirtyState; // -1 = not initialized - PRUint8 mSpellcheckCheckboxState; // a Tristate value - - bool mInIMEMode; // are we inside an IME composition? - bool mIsIMEComposing; // is IME in composition state? - // This is different from mInIMEMode. see Bug 98434. - - bool mShouldTxnSetSelection; // turn off for conservative selection adjustment by txns - bool mDidPreDestroy; // whether PreDestroy has been called - bool mDidPostCreate; // whether PostCreate has been called + PRUint32 mHandlingActionCount; bool mHandlingTrustedAction; bool mDispatchInputEvent; From d406da07d1e79245ab09fef3fffb6c08d71e5774 Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Tue, 24 Apr 2012 00:54:11 -0400 Subject: [PATCH 164/182] Bug 748223 - Pack nsEditor better; r=roc --- editor/libeditor/base/nsEditor.cpp | 22 ++++----- editor/libeditor/base/nsEditor.h | 75 +++++++++++++++--------------- 2 files changed, 45 insertions(+), 52 deletions(-) diff --git a/editor/libeditor/base/nsEditor.cpp b/editor/libeditor/base/nsEditor.cpp index 0d220148e52..529c9ceef77 100644 --- a/editor/libeditor/base/nsEditor.cpp +++ b/editor/libeditor/base/nsEditor.cpp @@ -147,34 +147,28 @@ extern nsIParserService *sParserService; //--------------------------------------------------------------------------- nsEditor::nsEditor() -: mModCount(0) +: mPlaceHolderName(nsnull) +, mSelState(nsnull) +, mPhonetic(nsnull) +, mModCount(0) , mFlags(0) , mUpdateCount(0) -, mSpellcheckCheckboxState(eTriUnset) -, mPlaceHolderTxn(nsnull) -, mPlaceHolderName(nsnull) , mPlaceHolderBatch(0) -, mSelState(nsnull) -, mSavedSel() -, mRangeUpdater() , mAction(nsnull) -, mDirection(eNone) -, mIMETextNode(nsnull) +, mHandlingActionCount(0) , mIMETextOffset(0) , mIMEBufferLength(0) +, mDirection(eNone) +, mDocDirtyState(-1) +, mSpellcheckCheckboxState(eTriUnset) , mInIMEMode(false) , mIsIMEComposing(false) , mShouldTxnSetSelection(true) , mDidPreDestroy(false) , mDidPostCreate(false) -, mDocDirtyState(-1) -, mDocWeak(nsnull) -, mPhonetic(nsnull) -, mHandlingActionCount(0) , mHandlingTrustedAction(false) , mDispatchInputEvent(true) { - //initialize member variables here } nsEditor::~nsEditor() diff --git a/editor/libeditor/base/nsEditor.h b/editor/libeditor/base/nsEditor.h index f773f4686fc..e6448c18e20 100644 --- a/editor/libeditor/base/nsEditor.h +++ b/editor/libeditor/base/nsEditor.h @@ -218,8 +218,6 @@ public: void SwitchTextDirectionTo(PRUint32 aDirection); protected: - nsCString mContentMIMEType; // MIME type of the doc we are editing. - nsresult DetermineCurrentDirection(); /** create a transaction for setting aAttribute to aValue on aElement @@ -793,59 +791,60 @@ public: }; protected: - - PRUint32 mModCount; // number of modifications (for undo/redo stack) - PRUint32 mFlags; // behavior flags. See nsIPlaintextEditor.idl for the flags we use. - - nsWeakPtr mSelConWeak; // weak reference to the nsISelectionController - PRInt32 mUpdateCount; - - // Spellchecking enum Tristate { eTriUnset, eTriFalse, eTriTrue - } mSpellcheckCheckboxState; + }; + // Spellchecking + nsCString mContentMIMEType; // MIME type of the doc we are editing. + nsCOMPtr mInlineSpellChecker; nsCOMPtr mTxnMgr; - nsWeakPtr mPlaceHolderTxn; // weak reference to placeholder for begin/end batch purposes - nsIAtom *mPlaceHolderName; // name of placeholder transaction - PRInt32 mPlaceHolderBatch; // nesting count for batching - nsSelectionState *mSelState; // saved selection state for placeholder txn batching - nsSelectionState mSavedSel; // cached selection for nsAutoSelectionReset - nsRangeUpdater mRangeUpdater; // utility class object for maintaining preserved ranges - nsCOMPtr mRootElement; // cached root node - PRInt32 mAction; // the current editor action - EDirection mDirection; // the current direction of editor action - - // data necessary to build IME transactions + nsCOMPtr mRootElement; // cached root node nsCOMPtr mIMETextRangeList; // IME special selection ranges nsCOMPtr mIMETextNode; // current IME text node - PRUint32 mIMETextOffset; // offset in text node where IME comp string begins - PRUint32 mIMEBufferLength; // current length of IME comp string - bool mInIMEMode; // are we inside an IME composition? - bool mIsIMEComposing; // is IME in composition state? - // This is different from mInIMEMode. see Bug 98434. + nsCOMPtr mEventTarget; // The form field as an event receiver + nsCOMPtr mEventListener; + nsWeakPtr mSelConWeak; // weak reference to the nsISelectionController + nsWeakPtr mPlaceHolderTxn; // weak reference to placeholder for begin/end batch purposes + nsWeakPtr mDocWeak; // weak reference to the nsIDOMDocument + nsIAtom *mPlaceHolderName; // name of placeholder transaction + nsSelectionState *mSelState; // saved selection state for placeholder txn batching + nsString *mPhonetic; - bool mShouldTxnSetSelection; // turn off for conservative selection adjustment by txns - bool mDidPreDestroy; // whether PreDestroy has been called - bool mDidPostCreate; // whether PostCreate has been called - // various listeners + // various listeners nsCOMArray mActionListeners; // listens to all low level actions on the doc nsCOMArray mEditorObservers; // just notify once per high level change nsCOMArray mDocStateListeners;// listen to overall doc state (dirty or not, just created, etc) - PRInt8 mDocDirtyState; // -1 = not initialized - nsWeakPtr mDocWeak; // weak reference to the nsIDOMDocument - // The form field as an event receiver - nsCOMPtr mEventTarget; + nsSelectionState mSavedSel; // cached selection for nsAutoSelectionReset + nsRangeUpdater mRangeUpdater; // utility class object for maintaining preserved ranges - nsString* mPhonetic; + PRUint32 mModCount; // number of modifications (for undo/redo stack) + PRUint32 mFlags; // behavior flags. See nsIPlaintextEditor.idl for the flags we use. - nsCOMPtr mEventListener; + PRInt32 mUpdateCount; - PRUint32 mHandlingActionCount; + PRInt32 mPlaceHolderBatch; // nesting count for batching + PRInt32 mAction; // the current editor action + PRUint32 mHandlingActionCount; + + PRUint32 mIMETextOffset; // offset in text node where IME comp string begins + PRUint32 mIMEBufferLength; // current length of IME comp string + + EDirection mDirection; // the current direction of editor action + PRInt8 mDocDirtyState; // -1 = not initialized + PRUint8 mSpellcheckCheckboxState; // a Tristate value + + bool mInIMEMode; // are we inside an IME composition? + bool mIsIMEComposing; // is IME in composition state? + // This is different from mInIMEMode. see Bug 98434. + + bool mShouldTxnSetSelection; // turn off for conservative selection adjustment by txns + bool mDidPreDestroy; // whether PreDestroy has been called + bool mDidPostCreate; // whether PostCreate has been called bool mHandlingTrustedAction; bool mDispatchInputEvent; From af9b9b29cb64961ba7e57d772d4b15101e95e768 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 24 Apr 2012 21:04:37 +0200 Subject: [PATCH 165/182] Bug 731832 - Backout bug 587021 for breaking a specific web page; r=bz --- .../html/content/src/nsHTMLImageElement.cpp | 37 +++++++++++++++++++ .../html/nsIDOMHTMLImageElement.idl | 7 +++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/content/html/content/src/nsHTMLImageElement.cpp b/content/html/content/src/nsHTMLImageElement.cpp index 50c7edca890..4b44a845adb 100644 --- a/content/html/content/src/nsHTMLImageElement.cpp +++ b/content/html/content/src/nsHTMLImageElement.cpp @@ -171,6 +171,7 @@ public: void MaybeLoadImage(); virtual nsXPCClassInfo* GetClassInfo(); protected: + nsIntPoint GetXY(); nsSize GetWidthHeight(); }; @@ -277,6 +278,42 @@ nsHTMLImageElement::GetComplete(bool* aComplete) return NS_OK; } +nsIntPoint +nsHTMLImageElement::GetXY() +{ + nsIntPoint point(0, 0); + + nsIFrame* frame = GetPrimaryFrame(Flush_Layout); + + if (!frame) { + return point; + } + + nsIFrame* layer = nsLayoutUtils::GetClosestLayer(frame->GetParent()); + nsPoint origin(frame->GetOffsetTo(layer)); + // Convert to pixels using that scale + point.x = nsPresContext::AppUnitsToIntCSSPixels(origin.x); + point.y = nsPresContext::AppUnitsToIntCSSPixels(origin.y); + + return point; +} + +NS_IMETHODIMP +nsHTMLImageElement::GetX(PRInt32* aX) +{ + *aX = GetXY().x; + + return NS_OK; +} + +NS_IMETHODIMP +nsHTMLImageElement::GetY(PRInt32* aY) +{ + *aY = GetXY().y; + + return NS_OK; +} + nsSize nsHTMLImageElement::GetWidthHeight() { diff --git a/dom/interfaces/html/nsIDOMHTMLImageElement.idl b/dom/interfaces/html/nsIDOMHTMLImageElement.idl index 1af20b15b84..d350c1b1253 100644 --- a/dom/interfaces/html/nsIDOMHTMLImageElement.idl +++ b/dom/interfaces/html/nsIDOMHTMLImageElement.idl @@ -50,7 +50,7 @@ * http://www.whatwg.org/specs/web-apps/current-work/ */ -[scriptable, uuid(AACA79C6-FC1D-4AC6-B358-C5CF9595A797)] +[scriptable, uuid(76cf0381-19fd-442d-bb18-c794fd8b5c25)] interface nsIDOMHTMLImageElement : nsIDOMHTMLElement { attribute DOMString alt; @@ -72,4 +72,9 @@ interface nsIDOMHTMLImageElement : nsIDOMHTMLElement attribute DOMString longDesc; attribute long vspace; attribute DOMString lowsrc; + + // These attributes are offsets from the closest view (to mimic + // NS4's "offset-from-layer" behavior). + readonly attribute long x; + readonly attribute long y; }; From cd95a32e35d5dc1414f278c0d81d90a7df716518 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Tue, 24 Apr 2012 20:18:50 -0700 Subject: [PATCH 166/182] Back out 4114c654f5d0 (bug 745177) because of Mac build errors --- gfx/layers/Layers.h | 5 - gfx/layers/Makefile.in | 1 - gfx/layers/TiledLayerBuffer.h | 52 +----- gfx/layers/ipc/ShadowLayerUtils.h | 4 +- gfx/layers/opengl/ReusableTileStoreOGL.cpp | 188 --------------------- gfx/layers/opengl/ReusableTileStoreOGL.h | 96 ----------- gfx/layers/opengl/TiledThebesLayerOGL.cpp | 92 ++-------- gfx/layers/opengl/TiledThebesLayerOGL.h | 25 +-- ipc/glue/IPCMessageUtils.h | 22 --- layout/base/nsDisplayList.cpp | 4 - 10 files changed, 31 insertions(+), 458 deletions(-) delete mode 100644 gfx/layers/opengl/ReusableTileStoreOGL.cpp delete mode 100644 gfx/layers/opengl/ReusableTileStoreOGL.h diff --git a/gfx/layers/Layers.h b/gfx/layers/Layers.h index 25bad3a7215..8f5558c5dfb 100644 --- a/gfx/layers/Layers.h +++ b/gfx/layers/Layers.h @@ -110,7 +110,6 @@ public: , mViewportScrollOffset(0, 0) , mScrollId(NULL_SCROLL_ID) , mCSSContentSize(0, 0) - , mResolution(1, 1) {} // Default copy ctor and operator= are fine @@ -152,10 +151,6 @@ public: // Consumers often want to know the size before scaling to pixels // so we record this size as well. gfx::Size mCSSContentSize; - - // This represents the resolution at which the associated layer - // will been rendered. - gfxSize mResolution; }; #define MOZ_LAYER_DECL_NAME(n, e) \ diff --git a/gfx/layers/Makefile.in b/gfx/layers/Makefile.in index 9cafe5b56e3..a2a8331f910 100644 --- a/gfx/layers/Makefile.in +++ b/gfx/layers/Makefile.in @@ -86,7 +86,6 @@ CPPSRCS = \ LayerManagerOGL.cpp \ ThebesLayerOGL.cpp \ TiledThebesLayerOGL.cpp \ - ReusableTileStoreOGL.cpp \ LayerSorter.cpp \ ImageLayers.cpp \ $(NULL) diff --git a/gfx/layers/TiledLayerBuffer.h b/gfx/layers/TiledLayerBuffer.h index c65955f17df..8a5351d2538 100644 --- a/gfx/layers/TiledLayerBuffer.h +++ b/gfx/layers/TiledLayerBuffer.h @@ -87,20 +87,8 @@ public: // (x*GetTileLength(), y*GetTileLength(), GetTileLength(), GetTileLength()) Tile GetTile(int x, int y) const; - // This operates the same as GetTile(aTileOrigin), but will also replace the - // specified tile with the placeholder tile. This does not call ReleaseTile - // on the removed tile. - bool RemoveTile(const nsIntPoint& aTileOrigin, Tile& aRemovedTile); - - // This operates the same as GetTile(x, y), but will also replace the - // specified tile with the placeholder tile. This does not call ReleaseTile - // on the removed tile. - bool RemoveTile(int x, int y, Tile& aRemovedTile); - uint16_t GetTileLength() const { return TILEDLAYERBUFFER_TILE_SIZE; } - unsigned int GetTileCount() const { return mRetainedTiles.Length(); } - const nsIntRegion& GetValidRegion() const { return mValidRegion; } const nsIntRegion& GetLastPaintRegion() const { return mLastPaintRegion; } void SetLastPaintRegion(const nsIntRegion& aLastPaintRegion) { @@ -173,30 +161,6 @@ TiledLayerBuffer::GetTile(int x, int y) const return mRetainedTiles.SafeElementAt(index, AsDerived().GetPlaceholderTile()); } -template bool -TiledLayerBuffer::RemoveTile(const nsIntPoint& aTileOrigin, - Tile& aRemovedTile) -{ - int firstTileX = mValidRegion.GetBounds().x / GetTileLength(); - int firstTileY = mValidRegion.GetBounds().y / GetTileLength(); - return RemoveTile(aTileOrigin.x / GetTileLength() - firstTileX, - aTileOrigin.y / GetTileLength() - firstTileY, - aRemovedTile); -} - -template bool -TiledLayerBuffer::RemoveTile(int x, int y, Tile& aRemovedTile) -{ - int index = x * mRetainedHeight + y; - const Tile& tileToRemove = mRetainedTiles.SafeElementAt(index, AsDerived().GetPlaceholderTile()); - if (!IsPlaceholder(tileToRemove)) { - aRemovedTile = tileToRemove; - mRetainedTiles[index] = AsDerived().GetPlaceholderTile(); - return true; - } - return false; -} - template void TiledLayerBuffer::Update(const nsIntRegion& aNewValidRegion, const nsIntRegion& aPaintRegion) @@ -245,16 +209,14 @@ TiledLayerBuffer::Update(const nsIntRegion& aNewValidRegion, int tileY = (y - oldBufferOrigin.y) / GetTileLength(); int index = tileX * oldRetainedHeight + tileY; - // The tile may have been removed, skip over it in this case. - if (IsPlaceholder(oldRetainedTiles. - SafeElementAt(index, AsDerived().GetPlaceholderTile()))) { - newRetainedTiles.AppendElement(AsDerived().GetPlaceholderTile()); - } else { - Tile tileWithPartialValidContent = oldRetainedTiles[index]; - newRetainedTiles.AppendElement(tileWithPartialValidContent); - oldRetainedTiles[index] = AsDerived().GetPlaceholderTile(); - } + NS_ABORT_IF_FALSE(!IsPlaceholder(oldRetainedTiles. + SafeElementAt(index, AsDerived().GetPlaceholderTile())), + "Expected tile"); + Tile tileWithPartialValidContent = oldRetainedTiles[index]; + newRetainedTiles.AppendElement(tileWithPartialValidContent); + + oldRetainedTiles[index] = AsDerived().GetPlaceholderTile(); } else { // This tile is either: // 1) Outside the new valid region and will simply be an empty diff --git a/gfx/layers/ipc/ShadowLayerUtils.h b/gfx/layers/ipc/ShadowLayerUtils.h index d329a78f3b2..f6570453565 100644 --- a/gfx/layers/ipc/ShadowLayerUtils.h +++ b/gfx/layers/ipc/ShadowLayerUtils.h @@ -73,7 +73,6 @@ struct ParamTraits WriteParam(aMsg, aParam.mViewportScrollOffset); WriteParam(aMsg, aParam.mDisplayPort); WriteParam(aMsg, aParam.mScrollId); - WriteParam(aMsg, aParam.mResolution); } static bool Read(const Message* aMsg, void** aIter, paramType* aResult) @@ -83,8 +82,7 @@ struct ParamTraits ReadParam(aMsg, aIter, &aResult->mContentSize) && ReadParam(aMsg, aIter, &aResult->mViewportScrollOffset) && ReadParam(aMsg, aIter, &aResult->mDisplayPort) && - ReadParam(aMsg, aIter, &aResult->mScrollId) && - ReadParam(aMsg, aIter, &aResult->mResolution)); + ReadParam(aMsg, aIter, &aResult->mScrollId)); } }; diff --git a/gfx/layers/opengl/ReusableTileStoreOGL.cpp b/gfx/layers/opengl/ReusableTileStoreOGL.cpp deleted file mode 100644 index 0b928d15d57..00000000000 --- a/gfx/layers/opengl/ReusableTileStoreOGL.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "ReusableTileStoreOGL.h" - -namespace mozilla { -namespace layers { - -ReusableTileStoreOGL::~ReusableTileStoreOGL() -{ - if (mTiles.Length() == 0) - return; - - mContext->MakeCurrent(); - for (int i = 0; i < mTiles.Length(); i++) - mContext->fDeleteTextures(1, &mTiles[i]->mTexture.mTextureHandle); - mTiles.Clear(); -} - -void -ReusableTileStoreOGL::HarvestTiles(TiledLayerBufferOGL* aVideoMemoryTiledBuffer, - const nsIntRegion& aOldValidRegion, - const nsIntRegion& aNewValidRegion, - const gfxSize& aOldResolution, - const gfxSize& aNewResolution) -{ - gfxSize scaleFactor = gfxSize(aNewResolution.width / aOldResolution.width, - aNewResolution.height / aOldResolution.height); - -#ifdef GFX_TILEDLAYER_PREF_WARNINGS - printf_stderr("Seeing if there are any tiles we can reuse\n"); -#endif - - // Iterate over existing harvested tiles and release any that are contained - // within the new valid region. - mContext->MakeCurrent(); - for (int i = 0; i < mTiles.Length();) { - ReusableTiledTextureOGL* tile = mTiles[i]; - - bool release = false; - if (tile->mResolution == aNewResolution) { - if (aNewValidRegion.Contains(tile->mTileRegion)) - release = true; - } else { - nsIntRegion transformedTileRegion(tile->mTileRegion); - transformedTileRegion.ScaleRoundOut(tile->mResolution.width / aNewResolution.width, - tile->mResolution.height / aNewResolution.height); - if (aNewValidRegion.Contains(transformedTileRegion)) - release = true; - } - - if (release) { -#ifdef GFX_TILEDLAYER_PREF_WARNINGS - nsIntRect tileBounds = tile->mTileRegion.GetBounds(); - printf_stderr("Releasing obsolete reused tile at %d,%d, x%f\n", - tileBounds.x, tileBounds.y, tile->mResolution.width); -#endif - mContext->fDeleteTextures(1, &tile->mTexture.mTextureHandle); - mTiles.RemoveElementAt(i); - continue; - } - - i++; - } - - // Iterate over the tiles and decide which ones we're going to harvest. - // We harvest any tile that is entirely outside of the new valid region, or - // any tile that is partially outside of the valid region and whose - // resolution has changed. - // XXX Tile iteration needs to be abstracted, or have some utility functions - // to make it simpler. - uint16_t tileSize = aVideoMemoryTiledBuffer->GetTileLength(); - nsIntRect validBounds = aOldValidRegion.GetBounds(); - for (int x = validBounds.x; x < validBounds.XMost();) { - int w = tileSize - x % tileSize; - if (x + w > validBounds.x + validBounds.width) - w = validBounds.x + validBounds.width - x; - - for (int y = validBounds.y; y < validBounds.YMost();) { - int h = tileSize - y % tileSize; - if (y + h > validBounds.y + validBounds.height) - h = validBounds.y + validBounds.height - y; - - // If the new valid region doesn't contain this tile region, - // harvest the tile. - nsIntRegion tileRegion; - tileRegion.And(aOldValidRegion, nsIntRect(x, y, w, h)); - - nsIntRegion intersectingRegion; - bool retainTile = false; - if (aNewResolution != aOldResolution) { - // Reconcile resolution changes. - // If the resolution changes, we know the backing layer will have been - // invalidated, so retain tiles that are partially encompassed by the - // new valid area, instead of just tiles that don't intersect at all. - nsIntRegion transformedTileRegion(tileRegion); - transformedTileRegion.ScaleRoundOut(scaleFactor.width, scaleFactor.height); - if (!aNewValidRegion.Contains(transformedTileRegion)) - retainTile = true; - } else if (intersectingRegion.And(tileRegion, aNewValidRegion).IsEmpty()) { - retainTile = true; - } - - if (retainTile) { -#ifdef GFX_TILEDLAYER_PREF_WARNINGS - printf_stderr("Retaining tile at %d,%d, x%f for reuse\n", x, y, aOldResolution.width); -#endif - TiledTexture removedTile; - if (aVideoMemoryTiledBuffer->RemoveTile(nsIntPoint(x, y), removedTile)) { - ReusableTiledTextureOGL* reusedTile = - new ReusableTiledTextureOGL(removedTile, tileRegion, tileSize, - aOldResolution); - mTiles.AppendElement(reusedTile); - } -#ifdef GFX_TILEDLAYER_PREF_WARNINGS - else - printf_stderr("Failed to retain tile for reuse\n"); -#endif - } - - y += h; - } - - x += w; - } - - // Now prune our reused tile store of its oldest tiles if it gets too large. - while (mTiles.Length() > aVideoMemoryTiledBuffer->GetTileCount() * mSizeLimit) { -#ifdef GFX_TILEDLAYER_PREF_WARNINGS - nsIntRect tileBounds = mTiles[0]->mTileRegion.GetBounds(); - printf_stderr("Releasing old reused tile at %d,%d, x%f\n", - tileBounds.x, tileBounds.y, mTiles[0]->mResolution.width); -#endif - mContext->fDeleteTextures(1, &mTiles[0]->mTexture.mTextureHandle); - mTiles.RemoveElementAt(0); - } - -#ifdef GFX_TILEDLAYER_PREF_WARNINGS - printf_stderr("Retained %d tiles\n", mTiles.Length()); -#endif -} - -void -ReusableTileStoreOGL::DrawTiles(TiledThebesLayerOGL* aLayer, - const nsIntRegion& aValidRegion, - const gfxSize& aResolution, - const gfx3DMatrix& aTransform, - const nsIntPoint& aRenderOffset) -{ - // Render old tiles to fill in gaps we haven't had the time to render yet. - for (size_t i = 0; i < mTiles.Length(); i++) { - ReusableTiledTextureOGL* tile = mTiles[i]; - - // Work out the scaling factor in case of resolution differences. - gfxSize scaleFactor = gfxSize(aResolution.width / tile->mResolution.width, - aResolution.height / tile->mResolution.height); - - // Get the valid tile region, in the given coordinate space. - nsIntRegion transformedTileRegion(tile->mTileRegion); - if (aResolution != tile->mResolution) - transformedTileRegion.ScaleRoundOut(scaleFactor.width, scaleFactor.height); - - // Skip drawing tiles that will be completely drawn over. - if (aValidRegion.Contains(transformedTileRegion)) - continue; - - // Reconcile the resolution difference by adjusting the transform. - gfx3DMatrix transform = aTransform; - if (aResolution != tile->mResolution) - transform.Scale(scaleFactor.width, scaleFactor.height, 1); - - // XXX We should clip here to make sure we don't overlap with the valid - // region, otherwise we may end up with rendering artifacts on - // semi-transparent layers. - // Similarly, if we have multiple tiles covering the same area, we will - // end up with rendering artifacts if the aLayer isn't opaque. - nsIntRect tileRect = tile->mTileRegion.GetBounds(); - uint16_t tileStartX = tileRect.x % tile->mTileSize; - uint16_t tileStartY = tileRect.y % tile->mTileSize; - nsIntRect textureRect(tileStartX, tileStartY, tileRect.width, tileRect.height); - nsIntSize textureSize(tile->mTileSize, tile->mTileSize); - aLayer->RenderTile(tile->mTexture, transform, aRenderOffset, tileRect, textureRect, textureSize); - } -} - -} // mozilla -} // layers diff --git a/gfx/layers/opengl/ReusableTileStoreOGL.h b/gfx/layers/opengl/ReusableTileStoreOGL.h deleted file mode 100644 index 29d3c48b85e..00000000000 --- a/gfx/layers/opengl/ReusableTileStoreOGL.h +++ /dev/null @@ -1,96 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef GFX_REUSABLETILESTOREOGL_H -#define GFX_REUSABLETILESTOREOGL_H - -#include "TiledThebesLayerOGL.h" -#include "nsTArray.h" -#include "nsAutoPtr.h" - -namespace mozilla { - -namespace gl { -class GLContext; -} - -namespace layers { - -// A storage class for the information required to render a single tile from -// a TiledLayerBufferOGL. -class ReusableTiledTextureOGL -{ -public: - ReusableTiledTextureOGL(TiledTexture aTexture, - const nsIntRegion& aTileRegion, - uint16_t aTileSize, - gfxSize aResolution) - : mTexture(aTexture) - , mTileRegion(aTileRegion) - , mTileSize(aTileSize) - , mResolution(aResolution) - {} - - ~ReusableTiledTextureOGL() {} - - TiledTexture mTexture; - const nsIntRegion mTileRegion; - uint16_t mTileSize; - gfxSize mResolution; -}; - -// This class will operate on a TiledLayerBufferOGL to harvest tiles that have -// rendered content that is about to become invalid. We do this so that in the -// situation that we need to render an area of a TiledThebesLayerOGL that hasn't -// been updated quickly enough, we can still display something (and hopefully -// it'll be the same as the valid rendered content). While this may end up -// showing invalid data, it should only be momentarily. -class ReusableTileStoreOGL -{ -public: - ReusableTileStoreOGL(gl::GLContext* aContext, float aSizeLimit) - : mContext(aContext) - , mSizeLimit(aSizeLimit) - {} - - ~ReusableTileStoreOGL(); - - // Harvests tiles from a TiledLayerBufferOGL that are about to become - // invalid. aOldValidRegion and aOldResolution should be the valid region - // and resolution of the data currently in aVideoMemoryTiledBuffer, and - // aNewValidRegion and aNewResolution should be the valid region and - // resolution of the data that is about to update aVideoMemoryTiledBuffer. - void HarvestTiles(TiledLayerBufferOGL* aVideoMemoryTiledBuffer, - const nsIntRegion& aOldValidRegion, - const nsIntRegion& aNewValidRegion, - const gfxSize& aOldResolution, - const gfxSize& aNewResolution); - - // Draws all harvested tiles that don't intersect with the given valid region. - // Differences in resolution will be reconciled via altering the given - // transformation. - void DrawTiles(TiledThebesLayerOGL* aLayer, - const nsIntRegion& aValidRegion, - const gfxSize& aResolution, - const gfx3DMatrix& aTransform, - const nsIntPoint& aRenderOffset); - -private: - // This GLContext should correspond to the one used in any TiledLayerBufferOGL - // that is passed into HarvestTiles and DrawTiles. - nsRefPtr mContext; - - // This determines the maximum number of tiles stored in this tile store, - // as a fraction of the amount of tiles stored in the TiledLayerBufferOGL - // given to HarvestTiles. - float mSizeLimit; - - // This stores harvested tiles, in the order in which they were harvested. - nsTArray> mTiles; -}; - -} // layers -} // mozilla - -#endif // GFX_REUSABLETILESTOREOGL_H diff --git a/gfx/layers/opengl/TiledThebesLayerOGL.cpp b/gfx/layers/opengl/TiledThebesLayerOGL.cpp index 1cd93e3c611..888a818f096 100644 --- a/gfx/layers/opengl/TiledThebesLayerOGL.cpp +++ b/gfx/layers/opengl/TiledThebesLayerOGL.cpp @@ -4,7 +4,6 @@ #include "mozilla/layers/PLayersChild.h" #include "TiledThebesLayerOGL.h" -#include "ReusableTileStoreOGL.h" #include "BasicTiledThebesLayer.h" #include "gfxImageSurface.h" @@ -38,15 +37,12 @@ TiledLayerBufferOGL::ReleaseTile(TiledTexture aTile) void TiledLayerBufferOGL::Upload(const BasicTiledLayerBuffer* aMainMemoryTiledBuffer, const nsIntRegion& aNewValidRegion, - const nsIntRegion& aInvalidateRegion, - const gfxSize& aResolution) + const nsIntRegion& aInvalidateRegion) { #ifdef GFX_TILEDLAYER_PREF_WARNINGS printf_stderr("Upload %i, %i, %i, %i\n", aInvalidateRegion.GetBounds().x, aInvalidateRegion.GetBounds().y, aInvalidateRegion.GetBounds().width, aInvalidateRegion.GetBounds().height); long start = PR_IntervalNow(); #endif - - mResolution = aResolution; mMainMemoryTiledBuffer = aMainMemoryTiledBuffer; mContext->MakeCurrent(); Update(aNewValidRegion, aInvalidateRegion); @@ -117,15 +113,6 @@ TiledThebesLayerOGL::TiledThebesLayerOGL(LayerManagerOGL *aManager) , mVideoMemoryTiledBuffer(aManager->gl()) { mImplData = static_cast(this); - // XXX Add a pref for reusable tile store size - mReusableTileStore = new ReusableTileStoreOGL(aManager->gl(), 1); -} - -TiledThebesLayerOGL::~TiledThebesLayerOGL() -{ - mMainMemoryTiledBuffer.ReadUnlock(); - if (mReusableTileStore) - delete mReusableTileStore; } void @@ -145,29 +132,7 @@ TiledThebesLayerOGL::ProcessUploadQueue() if (mRegionToUpload.IsEmpty()) return; - gfxSize resolution(1, 1); - if (mReusableTileStore) { - // Work out render resolution by multiplying the resolution of our ancestors. - // Only container layers can have frame metrics, so we start off with a - // resolution of 1, 1. - // XXX For large layer trees, it would be faster to do this once from the - // root node upwards and store the value on each layer. - for (ContainerLayer* parent = GetParent(); parent; parent = parent->GetParent()) { - const FrameMetrics& metrics = parent->GetFrameMetrics(); - resolution.width *= metrics.mResolution.width; - resolution.height *= metrics.mResolution.height; - } - - mReusableTileStore->HarvestTiles(&mVideoMemoryTiledBuffer, - mVideoMemoryTiledBuffer.GetValidRegion(), - mMainMemoryTiledBuffer.GetValidRegion(), - mVideoMemoryTiledBuffer.GetResolution(), - resolution); - } - - mVideoMemoryTiledBuffer.Upload(&mMainMemoryTiledBuffer, - mMainMemoryTiledBuffer.GetValidRegion(), - mRegionToUpload, resolution); + mVideoMemoryTiledBuffer.Upload(&mMainMemoryTiledBuffer, mMainMemoryTiledBuffer.GetValidRegion(), mRegionToUpload); mValidRegion = mVideoMemoryTiledBuffer.GetValidRegion(); mMainMemoryTiledBuffer.ReadUnlock(); @@ -181,46 +146,12 @@ TiledThebesLayerOGL::ProcessUploadQueue() } -void -TiledThebesLayerOGL::RenderTile(TiledTexture aTile, - const gfx3DMatrix& aTransform, - const nsIntPoint& aOffset, - nsIntRect aScreenRect, - nsIntRect aTextureRect, - nsIntSize aTextureBounds) -{ - gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, aTile.mTextureHandle); - ColorTextureLayerProgram *program; - if (aTile.mFormat == LOCAL_GL_RGB) { - program = mOGLManager->GetRGBXLayerProgram(); - } else { - program = mOGLManager->GetBGRALayerProgram(); - } - program->Activate(); - program->SetTextureUnit(0); - program->SetLayerOpacity(GetEffectiveOpacity()); - program->SetLayerTransform(aTransform); - program->SetRenderOffset(aOffset); - program->SetLayerQuadRect(aScreenRect); - - mOGLManager->BindAndDrawQuadWithTextureRect(program, - aTextureRect, - aTextureBounds); -} - void TiledThebesLayerOGL::RenderLayer(int aPreviousFrameBuffer, const nsIntPoint& aOffset) { gl()->MakeCurrent(); ProcessUploadQueue(); - // Render old tiles to fill in gaps we haven't had the time to render yet. - if (mReusableTileStore) - mReusableTileStore->DrawTiles(this, mVideoMemoryTiledBuffer.GetValidRegion(), - mVideoMemoryTiledBuffer.GetResolution(), - GetEffectiveTransform(), aOffset); - - // Render valid tiles. const nsIntRegion& visibleRegion = GetEffectiveVisibleRegion(); const nsIntRect visibleRect = visibleRegion.GetBounds(); unsigned int rowCount = 0; @@ -242,9 +173,22 @@ TiledThebesLayerOGL::RenderLayer(int aPreviousFrameBuffer, const nsIntPoint& aOf GetTile(nsIntPoint(mVideoMemoryTiledBuffer.RoundDownToTileEdge(x), mVideoMemoryTiledBuffer.RoundDownToTileEdge(y))); if (tileTexture != mVideoMemoryTiledBuffer.GetPlaceholderTile()) { - uint16_t tileSize = mVideoMemoryTiledBuffer.GetTileLength(); - RenderTile(tileTexture, GetEffectiveTransform(), aOffset, nsIntRect(x,y,w,h), - nsIntRect(tileStartX, tileStartY, w, h), nsIntSize(tileSize, tileSize)); + + gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, tileTexture.mTextureHandle); + ColorTextureLayerProgram *program; + if (tileTexture.mFormat == LOCAL_GL_RGB) { + program = mOGLManager->GetRGBXLayerProgram(); + } else { + program = mOGLManager->GetBGRALayerProgram(); + } + program->Activate(); + program->SetTextureUnit(0); + program->SetLayerOpacity(GetEffectiveOpacity()); + program->SetLayerTransform(GetEffectiveTransform()); + program->SetRenderOffset(aOffset); + program->SetLayerQuadRect(nsIntRect(x,y,w,h)); // screen + mOGLManager->BindAndDrawQuadWithTextureRect(program, nsIntRect(tileStartX, tileStartY, w, h), nsIntSize(mVideoMemoryTiledBuffer.GetTileLength(), mVideoMemoryTiledBuffer.GetTileLength())); // texture bounds + } tileY++; y += h; diff --git a/gfx/layers/opengl/TiledThebesLayerOGL.h b/gfx/layers/opengl/TiledThebesLayerOGL.h index 5511684a909..9e5ba064a90 100644 --- a/gfx/layers/opengl/TiledThebesLayerOGL.h +++ b/gfx/layers/opengl/TiledThebesLayerOGL.h @@ -20,8 +20,6 @@ class GLContext; namespace layers { -class ReusableTileStoreOGL; - class TiledTexture { public: // Constructs a placeholder TiledTexture. See the comments above @@ -75,13 +73,10 @@ public: void Upload(const BasicTiledLayerBuffer* aMainMemoryTiledBuffer, const nsIntRegion& aNewValidRegion, - const nsIntRegion& aInvalidateRegion, - const gfxSize& aResolution); + const nsIntRegion& aInvalidateRegion); TiledTexture GetPlaceholderTile() const { return TiledTexture(); } - const gfxSize& GetResolution() { return mResolution; } - protected: TiledTexture ValidateTile(TiledTexture aTile, const nsIntPoint& aTileRect, @@ -96,7 +91,6 @@ protected: private: nsRefPtr mContext; const BasicTiledLayerBuffer* mMainMemoryTiledBuffer; - gfxSize mResolution; void GetFormatAndTileForImageFormat(gfxASurface::gfxImageFormat aFormat, GLenum& aOutFormat, @@ -109,7 +103,10 @@ class TiledThebesLayerOGL : public ShadowThebesLayer, { public: TiledThebesLayerOGL(LayerManagerOGL *aManager); - virtual ~TiledThebesLayerOGL(); + virtual ~TiledThebesLayerOGL() + { + mMainMemoryTiledBuffer.ReadUnlock(); + } // LayerOGL impl void Destroy() {} @@ -129,22 +126,10 @@ public: } void PaintedTiledLayerBuffer(const BasicTiledLayerBuffer* mTiledBuffer); void ProcessUploadQueue(); - - // Renders a single given tile. - // XXX This currently takes an nsIntRect, but should actually take an - // nsIntRegion and iterate over each rectangle in the region. - void RenderTile(TiledTexture aTile, - const gfx3DMatrix& aTransform, - const nsIntPoint& aOffset, - nsIntRect aScreenRect, - nsIntRect aTextureRect, - nsIntSize aTextureBounds); - private: nsIntRegion mRegionToUpload; BasicTiledLayerBuffer mMainMemoryTiledBuffer; TiledLayerBufferOGL mVideoMemoryTiledBuffer; - ReusableTileStoreOGL* mReusableTileStore; }; } // layers diff --git a/ipc/glue/IPCMessageUtils.h b/ipc/glue/IPCMessageUtils.h index c0cfb7104e3..04c805c664b 100644 --- a/ipc/glue/IPCMessageUtils.h +++ b/ipc/glue/IPCMessageUtils.h @@ -53,7 +53,6 @@ #include "gfxColor.h" #include "gfxMatrix.h" #include "gfxPattern.h" -#include "gfxPoint.h" #include "nsRect.h" #include "nsRegion.h" #include "gfxASurface.h" @@ -459,27 +458,6 @@ struct ParamTraits } }; -template<> -struct ParamTraits -{ - typedef gfxSize paramType; - - static void Write(Message* aMsg, const paramType& aParam) - { - WriteParam(aMsg, aParam.width); - WriteParam(aMsg, aParam.height); - } - - static bool Read(const Message* aMsg, void** aIter, paramType* aResult) - { - if (ReadParam(aMsg, aIter, &aResult->width) && - ReadParam(aMsg, aIter, &aResult->height)) - return true; - - return false; - } -}; - template<> struct ParamTraits { diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index 4ca121dea63..d7084dac5ce 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -250,10 +250,6 @@ static void RecordFrameMetrics(nsIFrame* aForFrame, } metrics.mScrollId = aScrollId; - - nsIPresShell* presShell = presContext->GetPresShell(); - metrics.mResolution = gfxSize(presShell->GetXResolution(), presShell->GetYResolution()); - aRoot->SetFrameMetrics(metrics); } From c9d5f183762164dbd0829582d94b67f567737602 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Tue, 24 Apr 2012 20:47:13 -0700 Subject: [PATCH 167/182] Back out a0bc511b1d75 (bug 744910) and c85d6a254baa (bug 673752) on suspicion of causing Win debug "make check" hangs --- docshell/base/nsDocShell.cpp | 35 ++-- docshell/test/chrome/bug311007_window.xul | 8 + dom/base/nsDOMException.cpp | 5 +- dom/base/nsDOMException.h | 3 +- dom/bindings/Utils.h | 5 +- dom/workers/Exceptions.cpp | 231 +++++++++++++++++----- dom/workers/Exceptions.h | 16 ++ dom/workers/File.cpp | 18 +- dom/workers/FileReaderSync.cpp | 11 +- dom/workers/WorkerPrivate.cpp | 4 +- dom/workers/Workers.h | 8 - dom/workers/XMLHttpRequest.cpp | 119 ++++++----- dom/workers/test/xhr2_worker.js | 30 --- 13 files changed, 314 insertions(+), 179 deletions(-) diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index 0a7fde23e54..a28d6c58e12 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -7505,34 +7505,18 @@ nsDocShell::CreateContentViewer(const char *aContentType, mLoadType = mFailedLoadType; nsCOMPtr failedChannel = mFailedChannel; - - // Make sure we have a URI to set currentURI. - nsCOMPtr failedURI; - if (failedChannel) { - NS_GetFinalChannelURI(failedChannel, getter_AddRefs(failedURI)); - } - - if (!failedURI) { - failedURI = mFailedURI; - } - - // When we don't have failedURI, something wrong will happen. See - // bug 291876. - MOZ_ASSERT(failedURI, "We don't have a URI for history APIs."); - + nsCOMPtr failedURI = mFailedURI; mFailedChannel = nsnull; mFailedURI = nsnull; - // Create an shistory entry for the old load. - if (failedURI) { -#ifdef DEBUG - bool errorOnLocationChangeNeeded = -#endif - OnNewURI(failedURI, failedChannel, nsnull, mLoadType, true, false, + // Create an shistory entry for the old load, if we have a channel + if (failedChannel) { + mURIResultedInDocument = true; + OnLoadingSite(failedChannel, true, false); + } else if (failedURI) { + mURIResultedInDocument = true; + OnNewURI(failedURI, nsnull, nsnull, mLoadType, true, false, false); - - MOZ_ASSERT(!errorOnLocationChangeNeeded, - "We have to fire onLocationChange again."); } // Be sure to have a correct mLSHE, it may have been cleared by @@ -7549,6 +7533,9 @@ nsDocShell::CreateContentViewer(const char *aContentType, mLSHE = do_QueryInterface(entry); } + // Set our current URI + SetCurrentURI(failedURI); + mLoadType = LOAD_ERROR_PAGE; } diff --git a/docshell/test/chrome/bug311007_window.xul b/docshell/test/chrome/bug311007_window.xul index fd2cb7af5f3..2db7a4bbc9e 100644 --- a/docshell/test/chrome/bug311007_window.xul +++ b/docshell/test/chrome/bug311007_window.xul @@ -79,6 +79,11 @@ function step1A() { } function step1B(aWebProgress, aRequest, aLocation, aFlags) { + /* XXX Here we receive 2 notifications, due to bug 673752. */ + if (!aRequest) { + return; + } + is(aLocation.spec, kDNSErrorURI, "Error page's URI (1)"); ok(!(aFlags & Components.interfaces.nsIWebProgressListener @@ -156,6 +161,9 @@ function step4A() { } function step4B(aWebProgress, aRequest, aLocation, aFlags) { + if (!aRequest) // See step1B(...) and bug 673752. + return; + is(aLocation.spec, kDNSErrorURI, "Go back to the error URI (4)"); ok(!(aFlags & Components.interfaces.nsIWebProgressListener diff --git a/dom/base/nsDOMException.cpp b/dom/base/nsDOMException.cpp index 4a70382b42d..8782eab0dcf 100644 --- a/dom/base/nsDOMException.cpp +++ b/dom/base/nsDOMException.cpp @@ -177,7 +177,7 @@ NSResultToNameAndMessage(nsresult aNSResult, nsresult NS_GetNameAndMessageForDOMNSResult(nsresult aNSResult, const char** aName, - const char** aMessage, PRUint16* aCode) + const char** aMessage) { const char* name = nsnull; const char* message = nsnull; @@ -187,9 +187,6 @@ NS_GetNameAndMessageForDOMNSResult(nsresult aNSResult, const char** aName, if (name && message) { *aName = name; *aMessage = message; - if (aCode) { - *aCode = code; - } return NS_OK; } diff --git a/dom/base/nsDOMException.h b/dom/base/nsDOMException.h index 57a0c6f8d20..677925d254e 100644 --- a/dom/base/nsDOMException.h +++ b/dom/base/nsDOMException.h @@ -64,8 +64,7 @@ protected: nsresult NS_GetNameAndMessageForDOMNSResult(nsresult aNSResult, const char** aName, - const char** aMessage, - PRUint16* aCode = nsnull); + const char** aMessage); #define DECL_INTERNAL_DOM_EXCEPTION(domname) \ nsresult \ diff --git a/dom/bindings/Utils.h b/dom/bindings/Utils.h index cd9489deadc..e59d39c00ec 100644 --- a/dom/bindings/Utils.h +++ b/dom/bindings/Utils.h @@ -8,7 +8,6 @@ #define mozilla_dom_bindings_Utils_h__ #include "mozilla/dom/bindings/DOMJSClass.h" -#include "mozilla/dom/workers/Workers.h" #include "jsapi.h" #include "jsfriendapi.h" @@ -26,14 +25,12 @@ template inline bool Throw(JSContext* cx, nsresult rv) { - using mozilla::dom::workers::exceptions::ThrowDOMExceptionForNSResult; - // XXX Introduce exception machinery. if (mainThread) { XPCThrower::Throw(rv, cx); } else { if (!JS_IsExceptionPending(cx)) { - ThrowDOMExceptionForNSResult(cx, rv); + JS_ReportError(cx, "Exception thrown (nsresult = %x).", rv); } } return false; diff --git a/dom/workers/Exceptions.cpp b/dom/workers/Exceptions.cpp index f7103e70943..70d78b4e0de 100644 --- a/dom/workers/Exceptions.cpp +++ b/dom/workers/Exceptions.cpp @@ -43,7 +43,6 @@ #include "jsfriendapi.h" #include "jsprf.h" #include "mozilla/Util.h" -#include "nsDOMException.h" #include "nsTraceRefcnt.h" #include "WorkerInlines.h" @@ -69,7 +68,6 @@ class DOMException : public PrivatizableBase enum SLOT { SLOT_code = 0, SLOT_name, - SLOT_message, SLOT_COUNT }; @@ -89,7 +87,7 @@ public: } static JSObject* - Create(JSContext* aCx, nsresult aNSResult); + Create(JSContext* aCx, int aCode); private: DOMException() @@ -133,23 +131,18 @@ private: return false; } + char buf[100]; + JS_snprintf(buf, sizeof(buf), "%s: ", sClass.name); + + JSString* classString = JS_NewStringCopyZ(aCx, buf); + if (!classString) { + return false; + } + jsval name = JS_GetReservedSlot(obj, SLOT_name); - JS_ASSERT(name.isString()); + JS_ASSERT(JSVAL_IS_STRING(name)); - JSString *colon = JS_NewStringCopyN(aCx, ": ", 2); - if (!colon){ - return false; - } - - JSString* out = JS_ConcatStrings(aCx, name.toString(), colon); - if (!out) { - return false; - } - - jsval message = JS_GetReservedSlot(obj, SLOT_message); - JS_ASSERT(message.isString()); - - out = JS_ConcatStrings(aCx, out, message.toString()); + JSString* out = JS_ConcatStrings(aCx, classString, JSVAL_TO_STRING(name)); if (!out) { return false; } @@ -197,7 +190,6 @@ JSClass DOMException::sClass = { JSPropertySpec DOMException::sProperties[] = { { "code", SLOT_code, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub }, { "name", SLOT_name, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub }, - { "message", SLOT_message, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub }, { 0, 0, 0, NULL, NULL } }; @@ -211,6 +203,9 @@ JSPropertySpec DOMException::sStaticProperties[] = { #define EXCEPTION_ENTRY(_name) \ { #_name, _name, CONSTANT_FLAGS, GetConstant, NULL }, + // Make sure this one is always first. + EXCEPTION_ENTRY(UNKNOWN_ERR) + EXCEPTION_ENTRY(INDEX_SIZE_ERR) EXCEPTION_ENTRY(DOMSTRING_SIZE_ERR) EXCEPTION_ENTRY(HIERARCHY_REQUEST_ERR) @@ -244,35 +239,32 @@ JSPropertySpec DOMException::sStaticProperties[] = { // static JSObject* -DOMException::Create(JSContext* aCx, nsresult aNSResult) +DOMException::Create(JSContext* aCx, int aCode) { JSObject* obj = JS_NewObject(aCx, &sClass, NULL, NULL); if (!obj) { return NULL; } - const char* name; - const char* message; - uint16_t code; - if (NS_FAILED(NS_GetNameAndMessageForDOMNSResult(aNSResult, &name, &message, - &code))) { - JS_ReportError(aCx, "Exception thrown (nsresult = 0x%x).", aNSResult); + size_t foundIndex = size_t(-1); + for (size_t index = 0; index < ArrayLength(sStaticProperties) - 1; index++) { + if (sStaticProperties[index].tinyid == aCode) { + foundIndex = index; + break; + } + } + + if (foundIndex == size_t(-1)) { + foundIndex = 0; + } + + JSString* name = JS_NewStringCopyZ(aCx, sStaticProperties[foundIndex].name); + if (!name) { return NULL; } - JSString* jsname = JS_NewStringCopyZ(aCx, name); - if (!jsname) { - return NULL; - } - - JSString* jsmessage = JS_NewStringCopyZ(aCx, message); - if (!jsmessage) { - return NULL; - } - - JS_SetReservedSlot(obj, SLOT_code, INT_TO_JSVAL(code)); - JS_SetReservedSlot(obj, SLOT_name, STRING_TO_JSVAL(jsname)); - JS_SetReservedSlot(obj, SLOT_message, STRING_TO_JSVAL(jsmessage)); + JS_SetReservedSlot(obj, SLOT_code, INT_TO_JSVAL(aCode)); + JS_SetReservedSlot(obj, SLOT_name, STRING_TO_JSVAL(name)); DOMException* priv = new DOMException(); SetJSPrivateSafeish(obj, priv); @@ -280,6 +272,147 @@ DOMException::Create(JSContext* aCx, nsresult aNSResult) return obj; } +class FileException : public PrivatizableBase +{ + static JSClass sClass; + static JSPropertySpec sProperties[]; + static JSPropertySpec sStaticProperties[]; + + enum SLOT { + SLOT_code = 0, + SLOT_name, + + SLOT_COUNT + }; + +public: + static JSObject* + InitClass(JSContext* aCx, JSObject* aObj) + { + return JS_InitClass(aCx, aObj, NULL, &sClass, Construct, 0, sProperties, + NULL, sStaticProperties, NULL); + } + + static JSObject* + Create(JSContext* aCx, int aCode); + +private: + FileException() + { + MOZ_COUNT_CTOR(mozilla::dom::workers::exceptions::FileException); + } + + ~FileException() + { + MOZ_COUNT_DTOR(mozilla::dom::workers::exceptions::FileException); + } + + static JSBool + Construct(JSContext* aCx, unsigned aArgc, jsval* aVp) + { + JS_ReportErrorNumber(aCx, js_GetErrorMessage, NULL, JSMSG_WRONG_CONSTRUCTOR, + sClass.name); + return false; + } + + static void + Finalize(JSFreeOp* aFop, JSObject* aObj) + { + JS_ASSERT(JS_GetClass(aObj) == &sClass); + delete GetJSPrivateSafeish(aObj); + } + + static JSBool + GetProperty(JSContext* aCx, JSObject* aObj, jsid aIdval, jsval* aVp) + { + JS_ASSERT(JSID_IS_INT(aIdval)); + + int32 slot = JSID_TO_INT(aIdval); + + JSClass* classPtr = JS_GetClass(aObj); + + if (classPtr != &sClass || !GetJSPrivateSafeish(aObj)) { + JS_ReportErrorNumber(aCx, js_GetErrorMessage, NULL, + JSMSG_INCOMPATIBLE_PROTO, sClass.name, + sProperties[slot].name, classPtr->name); + return false; + } + + *aVp = JS_GetReservedSlot(aObj, slot); + return true; + } + + static JSBool + GetConstant(JSContext* aCx, JSObject* aObj, jsid idval, jsval* aVp) + { + JS_ASSERT(JSID_IS_INT(idval)); + *aVp = INT_TO_JSVAL(JSID_TO_INT(idval)); + return true; + } +}; + +JSClass FileException::sClass = { + "FileException", + JSCLASS_HAS_PRIVATE | JSCLASS_HAS_RESERVED_SLOTS(SLOT_COUNT), + JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, + JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, Finalize +}; + +JSPropertySpec FileException::sProperties[] = { + { "code", SLOT_code, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub }, + { "name", SLOT_name, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub }, + { 0, 0, 0, NULL, NULL } +}; + +JSPropertySpec FileException::sStaticProperties[] = { + +#define EXCEPTION_ENTRY(_name) \ + { #_name, FILE_##_name, CONSTANT_FLAGS, GetConstant, NULL }, + + EXCEPTION_ENTRY(NOT_FOUND_ERR) + EXCEPTION_ENTRY(SECURITY_ERR) + EXCEPTION_ENTRY(ABORT_ERR) + EXCEPTION_ENTRY(NOT_READABLE_ERR) + EXCEPTION_ENTRY(ENCODING_ERR) + +#undef EXCEPTION_ENTRY + + { 0, 0, 0, NULL, NULL } +}; + +// static +JSObject* +FileException::Create(JSContext* aCx, int aCode) +{ + JSObject* obj = JS_NewObject(aCx, &sClass, NULL, NULL); + if (!obj) { + return NULL; + } + + size_t foundIndex = size_t(-1); + for (size_t index = 0; index < ArrayLength(sStaticProperties) - 1; index++) { + if (sStaticProperties[index].tinyid == aCode) { + foundIndex = index; + break; + } + } + + JS_ASSERT(foundIndex != size_t(-1)); + + JSString* name = JS_NewStringCopyZ(aCx, sStaticProperties[foundIndex].name); + if (!name) { + return NULL; + } + + JS_SetReservedSlot(obj, SLOT_code, INT_TO_JSVAL(aCode)); + JS_SetReservedSlot(obj, SLOT_name, STRING_TO_JSVAL(name)); + + FileException* priv = new FileException(); + SetJSPrivateSafeish(obj, priv); + + return obj; +} + } // anonymous namespace BEGIN_WORKERS_NAMESPACE @@ -289,16 +422,24 @@ namespace exceptions { bool InitClasses(JSContext* aCx, JSObject* aGlobal) { - return DOMException::InitClass(aCx, aGlobal); + return DOMException::InitClass(aCx, aGlobal) && + FileException::InitClass(aCx, aGlobal); } void -ThrowDOMExceptionForNSResult(JSContext* aCx, nsresult aNSResult) +ThrowDOMExceptionForCode(JSContext* aCx, int aCode) { - JSObject* exception = DOMException::Create(aCx, aNSResult); - if (!exception) { - return; - } + JSObject* exception = DOMException::Create(aCx, aCode); + JS_ASSERT(exception); + + JS_SetPendingException(aCx, OBJECT_TO_JSVAL(exception)); +} + +void +ThrowFileExceptionForCode(JSContext* aCx, int aCode) +{ + JSObject* exception = FileException::Create(aCx, aCode); + JS_ASSERT(exception); JS_SetPendingException(aCx, OBJECT_TO_JSVAL(exception)); } diff --git a/dom/workers/Exceptions.h b/dom/workers/Exceptions.h index 75839816d73..c83608c8b83 100644 --- a/dom/workers/Exceptions.h +++ b/dom/workers/Exceptions.h @@ -71,6 +71,16 @@ #define INVALID_NODE_TYPE_ERR 24 #define DATA_CLONE_ERR 25 +// This one isn't actually spec'd anywhere, use it when we can't find a match. +#define UNKNOWN_ERR 0 + +// FileException Codes +#define FILE_NOT_FOUND_ERR 1 +#define FILE_SECURITY_ERR 2 +#define FILE_ABORT_ERR 3 +#define FILE_NOT_READABLE_ERR 4 +#define FILE_ENCODING_ERR 5 + BEGIN_WORKERS_NAMESPACE namespace exceptions { @@ -78,6 +88,12 @@ namespace exceptions { bool InitClasses(JSContext* aCx, JSObject* aGlobal); +void +ThrowDOMExceptionForCode(JSContext* aCx, int aCode); + +void +ThrowFileExceptionForCode(JSContext* aCx, int aCode); + } // namespace exceptions END_WORKERS_NAMESPACE diff --git a/dom/workers/File.cpp b/dom/workers/File.cpp index b895863072b..96a96911ac0 100644 --- a/dom/workers/File.cpp +++ b/dom/workers/File.cpp @@ -41,7 +41,6 @@ #include "nsIDOMFile.h" #include "nsDOMBlobBuilder.h" -#include "nsDOMError.h" #include "jsapi.h" #include "jsatom.h" @@ -59,7 +58,8 @@ USING_WORKERS_NAMESPACE -using mozilla::dom::workers::exceptions::ThrowDOMExceptionForNSResult; +using mozilla::dom::workers::exceptions::ThrowDOMExceptionForCode; +using mozilla::dom::workers::exceptions::ThrowFileExceptionForCode; namespace { @@ -125,7 +125,9 @@ private: nsresult rv = file->InitInternal(aCx, aArgc, JS_ARGV(aCx, aVp), Unwrap); if (NS_FAILED(rv)) { - ThrowDOMExceptionForNSResult(aCx, rv); + ThrowDOMExceptionForCode(aCx, + NS_ERROR_GET_MODULE(rv) == NS_ERROR_MODULE_DOM ? + NS_ERROR_GET_CODE(rv) : UNKNOWN_ERR); return false; } @@ -157,8 +159,7 @@ private: PRUint64 size; if (NS_FAILED(blob->GetSize(&size))) { - ThrowDOMExceptionForNSResult(aCx, NS_ERROR_DOM_FILE_NOT_READABLE_ERR); - return false; + ThrowFileExceptionForCode(aCx, FILE_NOT_READABLE_ERR); } if (!JS_NewNumberValue(aCx, double(size), aVp)) { @@ -178,8 +179,7 @@ private: nsString type; if (NS_FAILED(blob->GetType(type))) { - ThrowDOMExceptionForNSResult(aCx, NS_ERROR_DOM_FILE_NOT_READABLE_ERR); - return false; + ThrowFileExceptionForCode(aCx, FILE_NOT_READABLE_ERR); } JSString* jsType = JS_NewUCStringCopyN(aCx, type.get(), type.Length()); @@ -223,7 +223,7 @@ private: static_cast(end), contentType, optionalArgc, getter_AddRefs(rtnBlob)))) { - ThrowDOMExceptionForNSResult(aCx, NS_ERROR_DOM_FILE_NOT_READABLE_ERR); + ThrowFileExceptionForCode(aCx, FILE_NOT_READABLE_ERR); return false; } @@ -350,7 +350,7 @@ private: if (GetWorkerPrivateFromContext(aCx)->UsesSystemPrincipal() && NS_FAILED(file->GetMozFullPathInternal(fullPath))) { - ThrowDOMExceptionForNSResult(aCx, NS_ERROR_DOM_FILE_NOT_READABLE_ERR); + ThrowFileExceptionForCode(aCx, FILE_NOT_READABLE_ERR); return false; } diff --git a/dom/workers/FileReaderSync.cpp b/dom/workers/FileReaderSync.cpp index 55c3485f8c4..fc19d9f6ee6 100644 --- a/dom/workers/FileReaderSync.cpp +++ b/dom/workers/FileReaderSync.cpp @@ -40,7 +40,6 @@ #include "FileReaderSync.h" #include "nsIDOMFile.h" -#include "nsDOMError.h" #include "jsapi.h" #include "jsatom.h" @@ -57,7 +56,7 @@ USING_WORKERS_NAMESPACE -using mozilla::dom::workers::exceptions::ThrowDOMExceptionForNSResult; +using mozilla::dom::workers::exceptions::ThrowFileExceptionForCode; namespace { @@ -68,10 +67,10 @@ EnsureSucceededOrThrow(JSContext* aCx, nsresult rv) return true; } - rv = rv == NS_ERROR_FILE_NOT_FOUND ? - NS_ERROR_DOM_FILE_NOT_FOUND_ERR : - NS_ERROR_DOM_FILE_NOT_READABLE_ERR; - ThrowDOMExceptionForNSResult(aCx, rv); + int code = rv == NS_ERROR_FILE_NOT_FOUND ? + FILE_NOT_FOUND_ERR : + FILE_NOT_READABLE_ERR; + ThrowFileExceptionForCode(aCx, code); return false; } diff --git a/dom/workers/WorkerPrivate.cpp b/dom/workers/WorkerPrivate.cpp index 22e2608bab3..a1390d5b608 100644 --- a/dom/workers/WorkerPrivate.cpp +++ b/dom/workers/WorkerPrivate.cpp @@ -100,7 +100,7 @@ using mozilla::MutexAutoLock; using mozilla::TimeDuration; using mozilla::TimeStamp; -using mozilla::dom::workers::exceptions::ThrowDOMExceptionForNSResult; +using mozilla::dom::workers::exceptions::ThrowDOMExceptionForCode; USING_WORKERS_NAMESPACE using namespace mozilla::dom::workers::events; @@ -415,7 +415,7 @@ struct WorkerStructuredCloneCallbacks static void Error(JSContext* aCx, uint32_t /* aErrorId */) { - ThrowDOMExceptionForNSResult(aCx, NS_ERROR_DOM_DATA_CLONE_ERR); + ThrowDOMExceptionForCode(aCx, DATA_CLONE_ERR); } }; diff --git a/dom/workers/Workers.h b/dom/workers/Workers.h index 947a3541c1d..2f3aff8c91d 100644 --- a/dom/workers/Workers.h +++ b/dom/workers/Workers.h @@ -97,14 +97,6 @@ GetWorkerCrossThreadDispatcher(JSContext* aCx, jsval aWorker); // Random unique constant to facilitate JSPrincipal debugging const uint32_t kJSPrincipalsDebugToken = 0x7e2df9d2; -namespace exceptions { - -// Implemented in Exceptions.cpp -void -ThrowDOMExceptionForNSResult(JSContext* aCx, nsresult aNSResult); - -} // namespace exceptions - END_WORKERS_NAMESPACE #endif // mozilla_dom_workers_workers_h__ diff --git a/dom/workers/XMLHttpRequest.cpp b/dom/workers/XMLHttpRequest.cpp index 8a4018275d0..58fd37bbd3a 100644 --- a/dom/workers/XMLHttpRequest.cpp +++ b/dom/workers/XMLHttpRequest.cpp @@ -34,7 +34,7 @@ USING_WORKERS_NAMESPACE namespace XMLHttpRequestResponseTypeValues = mozilla::dom::bindings::prototypes::XMLHttpRequestResponseType; -using mozilla::dom::workers::exceptions::ThrowDOMExceptionForNSResult; +using mozilla::dom::workers::exceptions::ThrowDOMExceptionForCode; // XXX Need to figure this out... #define UNCATCHABLE_EXCEPTION NS_ERROR_OUT_OF_MEMORY @@ -214,6 +214,21 @@ END_WORKERS_NAMESPACE namespace { +inline int +GetDOMExceptionCodeFromResult(nsresult aResult) +{ + if (NS_SUCCEEDED(aResult)) { + return 0; + } + + if (NS_ERROR_GET_MODULE(aResult) == NS_ERROR_MODULE_DOM) { + return NS_ERROR_GET_CODE(aResult); + } + + NS_WARNING("Update main thread implementation for a DOM error code here!"); + return INVALID_STATE_ERR; +} + inline void ConvertResponseTypeToString(XMLHttpRequestResponseType aType, nsString& aString) { @@ -768,11 +783,11 @@ private: class ResponseRunnable : public MainThreadProxyRunnable { PRUint32 mSyncQueueKey; - nsresult mErrorCode; + int mErrorCode; public: ResponseRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy, - PRUint32 aSyncQueueKey, nsresult aErrorCode) + PRUint32 aSyncQueueKey, int aErrorCode) : MainThreadProxyRunnable(aWorkerPrivate, SkipWhenClearing, aProxy), mSyncQueueKey(aSyncQueueKey), mErrorCode(aErrorCode) { @@ -782,8 +797,8 @@ private: bool WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) { - if (NS_FAILED(mErrorCode)) { - ThrowDOMExceptionForNSResult(aCx, mErrorCode); + if (mErrorCode) { + ThrowDOMExceptionForCode(aCx, mErrorCode); aWorkerPrivate->StopSyncLoop(mSyncQueueKey, false); } else { @@ -821,7 +836,7 @@ public: return true; } - virtual nsresult + virtual int MainThreadRun() = 0; NS_IMETHOD @@ -832,7 +847,7 @@ public: PRUint32 oldSyncQueueKey = mProxy->mSyncEventResponseSyncQueueKey; mProxy->mSyncEventResponseSyncQueueKey = mSyncQueueKey; - nsresult rv = MainThreadRun(); + int rv = MainThreadRun(); nsRefPtr response = new ResponseRunnable(mWorkerPrivate, mProxy, mSyncQueueKey, rv); @@ -856,7 +871,7 @@ public: MOZ_ASSERT(aProxy); } - virtual nsresult + virtual int MainThreadRun() { AssertIsOnMainThread(); @@ -877,10 +892,10 @@ public: : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mValue(aValue) { } - nsresult + int MainThreadRun() { - return mProxy->mXHR->SetMultipart(mValue); + return GetDOMExceptionCodeFromResult(mProxy->mXHR->SetMultipart(mValue)); } }; @@ -894,10 +909,11 @@ public: : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mValue(aValue) { } - nsresult + int MainThreadRun() { - return mProxy->mXHR->SetMozBackgroundRequest(mValue); + nsresult rv = mProxy->mXHR->SetMozBackgroundRequest(mValue); + return GetDOMExceptionCodeFromResult(rv); } }; @@ -911,10 +927,11 @@ public: : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mValue(aValue) { } - nsresult + int MainThreadRun() { - return mProxy->mXHR->SetWithCredentials(mValue); + nsresult rv = mProxy->mXHR->SetWithCredentials(mValue); + return GetDOMExceptionCodeFromResult(rv); } }; @@ -929,7 +946,7 @@ public: mResponseType(aResponseType) { } - nsresult + int MainThreadRun() { nsresult rv = mProxy->mXHR->SetResponseType(mResponseType); @@ -937,7 +954,7 @@ public: if (NS_SUCCEEDED(rv)) { rv = mProxy->mXHR->GetResponseType(mResponseType); } - return rv; + return GetDOMExceptionCodeFromResult(rv); } void @@ -957,10 +974,10 @@ public: mTimeout(aTimeout) { } - nsresult + int MainThreadRun() { - return mProxy->mXHR->SetTimeout(mTimeout); + return GetDOMExceptionCodeFromResult(mProxy->mXHR->SetTimeout(mTimeout)); } }; @@ -971,7 +988,7 @@ public: : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy) { } - nsresult + int MainThreadRun() { mProxy->mInnerEventStreamId++; @@ -985,7 +1002,7 @@ public: mProxy->Reset(); - return NS_OK; + return 0; } }; @@ -1000,11 +1017,11 @@ public: mResponseHeaders(aResponseHeaders) { } - nsresult + int MainThreadRun() { mProxy->mXHR->GetAllResponseHeaders(mResponseHeaders); - return NS_OK; + return 0; } }; @@ -1020,10 +1037,11 @@ public: mValue(aValue) { } - nsresult + int MainThreadRun() { - return mProxy->mXHR->GetResponseHeader(mHeader, mValue); + nsresult rv = mProxy->mXHR->GetResponseHeader(mHeader, mValue); + return GetDOMExceptionCodeFromResult(rv); } }; @@ -1050,45 +1068,53 @@ public: mTimeout(aTimeout) { } - nsresult + int MainThreadRun() { WorkerPrivate* oldWorker = mProxy->mWorkerPrivate; mProxy->mWorkerPrivate = mWorkerPrivate; - nsresult rv = MainThreadRunInternal(); + int retval = MainThreadRunInternal(); mProxy->mWorkerPrivate = oldWorker; - return rv; + return retval; } - nsresult + int MainThreadRunInternal() { if (!mProxy->Init()) { - return NS_ERROR_DOM_INVALID_STATE_ERR; + return INVALID_STATE_ERR; } nsresult rv; if (mMultipart) { rv = mProxy->mXHR->SetMultipart(mMultipart); - NS_ENSURE_SUCCESS(rv, rv); + if (NS_FAILED(rv)) { + return GetDOMExceptionCodeFromResult(rv); + } } if (mBackgroundRequest) { rv = mProxy->mXHR->SetMozBackgroundRequest(mBackgroundRequest); - NS_ENSURE_SUCCESS(rv, rv); + if (NS_FAILED(rv)) { + return GetDOMExceptionCodeFromResult(rv); + } } if (mWithCredentials) { rv = mProxy->mXHR->SetWithCredentials(mWithCredentials); - NS_ENSURE_SUCCESS(rv, rv); + if (NS_FAILED(rv)) { + return GetDOMExceptionCodeFromResult(rv); + } } if (mTimeout) { rv = mProxy->mXHR->SetTimeout(mTimeout); - NS_ENSURE_SUCCESS(rv, rv); + if (NS_FAILED(rv)) { + return GetDOMExceptionCodeFromResult(rv); + } } NS_ASSERTION(!mProxy->mInOpen, "Reentrancy is bad!"); @@ -1103,7 +1129,7 @@ public: rv = mProxy->mXHR->SetResponseType(NS_LITERAL_STRING("text")); } - return rv; + return GetDOMExceptionCodeFromResult(rv); } }; @@ -1128,7 +1154,7 @@ public: mClonedObjects.SwapElements(aClonedObjects); } - nsresult + int MainThreadRun() { nsCOMPtr variant; @@ -1138,7 +1164,7 @@ public: nsIXPConnect* xpc = nsContentUtils::XPConnect(); NS_ASSERTION(xpc, "This should never be null!"); - nsresult rv = NS_OK; + int error = 0; JSStructuredCloneCallbacks* callbacks = mWorkerPrivate->IsChromeWorker() ? @@ -1149,22 +1175,24 @@ public: if (mBody.read(cx, &body, callbacks, &mClonedObjects)) { if (NS_FAILED(xpc->JSValToVariant(cx, &body, getter_AddRefs(variant)))) { - rv = NS_ERROR_DOM_INVALID_STATE_ERR; + error = INVALID_STATE_ERR; } } else { - rv = NS_ERROR_DOM_DATA_CLONE_ERR; + error = DATA_CLONE_ERR; } mBody.clear(); mClonedObjects.Clear(); - NS_ENSURE_SUCCESS(rv, rv); + if (error) { + return error; + } } else { nsCOMPtr wvariant = do_CreateInstance(NS_VARIANT_CONTRACTID); - NS_ENSURE_TRUE(wvariant, NS_ERROR_UNEXPECTED); + NS_ENSURE_TRUE(wvariant, UNKNOWN_ERR); if (NS_FAILED(wvariant->SetAsAString(mStringBody))) { NS_ERROR("This should never fail!"); @@ -1201,7 +1229,7 @@ public: } } - return rv; + return GetDOMExceptionCodeFromResult(rv); } }; @@ -1217,10 +1245,11 @@ public: mValue(aValue) { } - nsresult + int MainThreadRun() { - return mProxy->mXHR->SetRequestHeader(mHeader, mValue); + nsresult rv = mProxy->mXHR->SetRequestHeader(mHeader, mValue); + return GetDOMExceptionCodeFromResult(rv); } }; @@ -1234,11 +1263,11 @@ public: : WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mMimeType(aMimeType) { } - nsresult + int MainThreadRun() { mProxy->mXHR->OverrideMimeType(mMimeType); - return NS_OK; + return 0; } }; diff --git a/dom/workers/test/xhr2_worker.js b/dom/workers/test/xhr2_worker.js index 18924a15a4e..1d9e0ed5a83 100644 --- a/dom/workers/test/xhr2_worker.js +++ b/dom/workers/test/xhr2_worker.js @@ -66,16 +66,6 @@ onmessage = function(event) { throw new Error("Failed to throw when getting responseText on '" + type + "' type"); } - - if (exception.name != "InvalidStateError") { - throw new Error("Unexpected error when getting responseText on '" + type + - "' type"); - } - - if (exception.code != DOMException.INVALID_STATE_ERR) { - throw new Error("Unexpected error code when getting responseText on '" + type + - "' type"); - } } testResponseTextException("arraybuffer"); @@ -112,16 +102,6 @@ onmessage = function(event) { "calling open()"); } - if (exception.name != "InvalidStateError") { - throw new Error("Unexpected error when setting responseType before " + - "calling open()"); - } - - if (exception.code != DOMException.INVALID_STATE_ERR) { - throw new Error("Unexpected error code when setting responseType before " + - "calling open()"); - } - xhr.open("GET", url); xhr.responseType = "text"; xhr.onload = function(event) { @@ -172,14 +152,4 @@ onmessage = function(event) { throw new Error("Failed to throw when setting responseType after " + "calling send()"); } - - if (exception.name != "InvalidStateError") { - throw new Error("Unexpected error when setting responseType after " + - "calling send()"); - } - - if (exception.code != DOMException.INVALID_STATE_ERR) { - throw new Error("Unexpected error code when setting responseType after " + - "calling send()"); - } } From 657b0b8a57551572c5ad72dd49acbd51acc1bfd1 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Tue, 24 Apr 2012 20:47:16 -0700 Subject: [PATCH 168/182] Back out bug 730208 and bug 747543 because of xpcshell test failures --- .../document/src/nsXULPrototypeDocument.cpp | 2 +- dom/base/nsDOMClassInfo.cpp | 4 +- dom/base/nsGlobalWindow.cpp | 8 ++- dom/base/nsIJSEventListener.h | 5 +- dom/base/nsJSEnvironment.cpp | 50 +++++-------------- js/jsd/jsd_high.c | 7 --- js/src/jsfriendapi.cpp | 6 --- js/src/jsfriendapi.h | 3 -- js/src/jsprobes.cpp | 12 ++--- js/src/jsprobes.h | 14 +++--- js/src/methodjit/BaseCompiler.h | 2 +- js/src/methodjit/Compiler.cpp | 2 +- js/src/methodjit/MethodJIT.cpp | 4 +- js/xpconnect/src/XPCWrappedJSClass.cpp | 2 +- js/xpconnect/src/XPCWrappedNativeJSOps.cpp | 4 +- js/xpconnect/src/XPCWrappedNativeScope.cpp | 4 +- js/xpconnect/src/nsXPConnect.cpp | 16 +++--- js/xpconnect/src/xpcprivate.h | 29 ++++------- js/xpconnect/src/xpcpublic.h | 43 ++-------------- 19 files changed, 63 insertions(+), 154 deletions(-) diff --git a/content/xul/document/src/nsXULPrototypeDocument.cpp b/content/xul/document/src/nsXULPrototypeDocument.cpp index ef7572495e9..e0321082db2 100644 --- a/content/xul/document/src/nsXULPrototypeDocument.cpp +++ b/content/xul/document/src/nsXULPrototypeDocument.cpp @@ -773,7 +773,7 @@ nsXULPDGlobalObject::GetScriptContext() JSObject* nsXULPDGlobalObject::GetGlobalJSObject() { - return xpc_UnmarkGrayObject(mJSObject); + return mJSObject; } diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index a090117ba2f..035ddd60380 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -5463,8 +5463,8 @@ nsWindowSH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, nsCOMPtr holder; jsval v; - rv = WrapNative(cx, xpc_UnmarkGrayObject(frameWin->GetGlobalJSObject()), - frame, &NS_GET_IID(nsIDOMWindow), true, &v, + rv = WrapNative(cx, frameWin->GetGlobalJSObject(), frame, + &NS_GET_IID(nsIDOMWindow), true, &v, getter_AddRefs(holder)); NS_ENSURE_SUCCESS(rv, rv); diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index 9414831a1b5..1e43714903c 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -2027,7 +2027,7 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument, return NS_ERROR_FAILURE; } - XPCAutoRequest ar(cx); + JSAutoRequest ar(cx); nsCOMPtr wsh = do_QueryInterface(aState); NS_ASSERTION(!aState || wsh, "What kind of weird state are you giving me here?"); @@ -2039,7 +2039,6 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument, newInnerWindow = currentInner; if (aDocument != oldDoc) { - xpc_UnmarkGrayObject(currentInner->mJSObject); nsWindowSH::InvalidateGlobalScopePolluter(cx, currentInner->mJSObject); } @@ -2048,7 +2047,6 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument, // don't expose that API because the implementation would be // identical to that of JS_TransplantObject, so we just call that // instead. - xpc_UnmarkGrayObject(mJSObject); if (!JS_TransplantObject(cx, mJSObject, mJSObject)) { return NS_ERROR_FAILURE; } @@ -2131,7 +2129,7 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument, mJSObject = mContext->GetNativeGlobal(); SetWrapper(mJSObject); } else { - JSObject *outerObject = NewOuterWindowProxy(cx, xpc_UnmarkGrayObject(newInnerWindow->mJSObject)); + JSObject *outerObject = NewOuterWindowProxy(cx, newInnerWindow->mJSObject); if (!outerObject) { NS_ERROR("out of memory"); return NS_ERROR_FAILURE; @@ -2202,7 +2200,7 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument, proto = nsnull; } - if (!JS_SetPrototype(cx, mJSObject, xpc_UnmarkGrayObject(proto))) { + if (!JS_SetPrototype(cx, mJSObject, proto)) { NS_ERROR("can't set prototype"); return NS_ERROR_FAILURE; } diff --git a/dom/base/nsIJSEventListener.h b/dom/base/nsIJSEventListener.h index 9da88ad9441..b67276c40f2 100644 --- a/dom/base/nsIJSEventListener.h +++ b/dom/base/nsIJSEventListener.h @@ -40,7 +40,6 @@ #include "nsIScriptContext.h" #include "jsapi.h" -#include "xpcpublic.h" #include "nsIDOMEventListener.h" class nsIScriptObjectOwner; @@ -87,12 +86,12 @@ public: JSObject* GetEventScope() const { - return xpc_UnmarkGrayObject(mScopeObject); + return mScopeObject; } JSObject *GetHandler() const { - return xpc_UnmarkGrayObject(mHandler); + return mHandler; } // Set a handler for this event listener. Must not be called if diff --git a/dom/base/nsJSEnvironment.cpp b/dom/base/nsJSEnvironment.cpp index 2fb4e09fc65..c2734619532 100644 --- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -1194,7 +1194,6 @@ nsJSContext::EvaluateStringWithValue(const nsAString& aScript, return NS_OK; } - xpc_UnmarkGrayObject(aScopeObject); nsAutoMicroTask mt; // Safety first: get an object representing the script's principals, i.e., @@ -1244,7 +1243,7 @@ nsJSContext::EvaluateStringWithValue(const nsAString& aScript, // check it isn't JSVERSION_UNKNOWN. if (ok && ((JSVersion)aVersion) != JSVERSION_UNKNOWN) { - XPCAutoRequest ar(mContext); + JSAutoRequest ar(mContext); JSAutoEnterCompartment ac; if (!ac.enter(mContext, aScopeObject)) { @@ -1397,8 +1396,6 @@ nsJSContext::EvaluateString(const nsAString& aScript, aScopeObject = JS_GetGlobalObject(mContext); } - xpc_UnmarkGrayObject(aScopeObject); - // Safety first: get an object representing the script's principals, i.e., // the entities who signed this script, or the fully-qualified-domain-name // or "codebase" from which it was loaded. @@ -1447,7 +1444,7 @@ nsJSContext::EvaluateString(const nsAString& aScript, // Since the caller is responsible for parsing the version strings, we just // check it isn't JSVERSION_UNKNOWN. if (ok && JSVersion(aVersion) != JSVERSION_UNKNOWN) { - XPCAutoRequest ar(mContext); + JSAutoRequest ar(mContext); JSAutoEnterCompartment ac; if (!ac.enter(mContext, aScopeObject)) { stack->Pop(nsnull); @@ -1471,7 +1468,7 @@ nsJSContext::EvaluateString(const nsAString& aScript, // If all went well, convert val to a string if one is wanted. if (ok) { - XPCAutoRequest ar(mContext); + JSAutoRequest ar(mContext); JSAutoEnterCompartment ac; if (!ac.enter(mContext, aScopeObject)) { stack->Pop(nsnull); @@ -1516,7 +1513,6 @@ nsJSContext::CompileScript(const PRUnichar* aText, NS_ENSURE_ARG_POINTER(aPrincipal); JSObject* scopeObject = ::JS_GetGlobalObject(mContext); - xpc_UnmarkGrayObject(scopeObject); bool ok = false; @@ -1533,8 +1529,7 @@ nsJSContext::CompileScript(const PRUnichar* aText, if (!ok || JSVersion(aVersion) == JSVERSION_UNKNOWN) return NS_OK; - XPCAutoRequest ar(mContext); - + JSAutoRequest ar(mContext); JSScript* script = ::JS_CompileUCScriptForPrincipalsVersion(mContext, @@ -1577,9 +1572,6 @@ nsJSContext::ExecuteScript(JSScript* aScriptObject, aScopeObject = JS_GetGlobalObject(mContext); } - xpc_UnmarkGrayScript(aScriptObject); - xpc_UnmarkGrayObject(aScopeObject); - // Push our JSContext on our thread's context stack, in case native code // called from JS calls back into JS via XPConnect. nsresult rv; @@ -1599,7 +1591,7 @@ nsJSContext::ExecuteScript(JSScript* aScriptObject, NS_ENSURE_SUCCESS(rv, rv); nsJSContext::TerminationFuncHolder holder(this); - XPCAutoRequest ar(mContext); + JSAutoRequest ar(mContext); ++mExecuteDepth; // The result of evaluation, used only if there were no errors. This need @@ -1682,7 +1674,7 @@ nsJSContext::JSObjectFromInterface(nsISupports* aTarget, JSObject* aScope, JSObj NS_ASSERTION(native == targetSupp, "Native should be the target!"); #endif - *aRet = xpc_UnmarkGrayObject(JSVAL_TO_OBJECT(v)); + *aRet = JSVAL_TO_OBJECT(v); return NS_OK; } @@ -1727,7 +1719,7 @@ nsJSContext::CompileEventHandler(nsIAtom *aName, // Event handlers are always shared, and must be bound before use. // Therefore we never bother compiling with principals. // (that probably means we should avoid JS_CompileUCFunctionForPrincipals!) - XPCAutoRequest ar(mContext); + JSAutoRequest ar(mContext); JSFunction* fun = ::JS_CompileUCFunctionForPrincipalsVersion(mContext, @@ -1774,8 +1766,6 @@ nsJSContext::CompileFunction(JSObject* aTarget, return NS_ERROR_ILLEGAL_VALUE; } - xpc_UnmarkGrayObject(aTarget); - nsIScriptGlobalObject *global = GetGlobalObject(); nsCOMPtr principal; if (global) { @@ -1790,7 +1780,7 @@ nsJSContext::CompileFunction(JSObject* aTarget, JSObject *target = aTarget; - XPCAutoRequest ar(mContext); + JSAutoRequest ar(mContext); JSFunction* fun = ::JS_CompileUCFunctionForPrincipalsVersion(mContext, @@ -1835,10 +1825,7 @@ nsJSContext::CallEventHandler(nsISupports* aTarget, JSObject* aScope, SAMPLE_LABEL("JS", "CallEventHandler"); nsAutoMicroTask mt; - xpc_UnmarkGrayObject(aScope); - xpc_UnmarkGrayObject(aHandler); - - XPCAutoRequest ar(mContext); + JSAutoRequest ar(mContext); JSObject* target = nsnull; nsresult rv = JSObjectFromInterface(aTarget, aScope, &target); NS_ENSURE_SUCCESS(rv, rv); @@ -1896,11 +1883,6 @@ nsJSContext::CallEventHandler(nsISupports* aTarget, JSObject* aScope, // in the same scope as aTarget. rv = ConvertSupportsTojsvals(aargv, target, &argc, &argv, tempStorage); NS_ENSURE_SUCCESS(rv, rv); - for (uint32_t i = 0; i < argc; i++) { - if (!JSVAL_IS_PRIMITIVE(argv[i])) { - xpc_UnmarkGrayObject(JSVAL_TO_OBJECT(argv[i])); - } - } ++mExecuteDepth; bool ok = ::JS_CallFunctionValue(mContext, target, @@ -1947,10 +1929,7 @@ nsJSContext::BindCompiledEventHandler(nsISupports* aTarget, JSObject* aScope, NS_ENSURE_TRUE(mIsInitialized, NS_ERROR_NOT_INITIALIZED); NS_PRECONDITION(!aBoundHandler, "Shouldn't already have a bound handler!"); - xpc_UnmarkGrayObject(aScope); - xpc_UnmarkGrayObject(aHandler); - - XPCAutoRequest ar(mContext); + JSAutoRequest ar(mContext); // Get the jsobject associated with this target JSObject *target = nsnull; @@ -1999,8 +1978,6 @@ nsJSContext::Serialize(nsIObjectOutputStream* aStream, JSScript* aScriptObject) return NS_ERROR_FAILURE; return nsContentUtils::XPConnect()->WriteScript(aStream, mContext, aScriptObject); - xpc_UnmarkGrayScript(aScriptObject); - } nsresult @@ -2107,7 +2084,7 @@ nsJSContext::CreateNativeGlobalForInner( JSContext* nsJSContext::GetNativeContext() { - return xpc_UnmarkGrayContext(mContext); + return mContext; } nsresult @@ -2153,7 +2130,7 @@ nsJSContext::SetProperty(JSObject* aTarget, const char* aPropName, nsISupports* PRUint32 argc; jsval *argv = nsnull; - XPCAutoRequest ar(mContext); + JSAutoRequest ar(mContext); Maybe tempStorage; @@ -2464,9 +2441,8 @@ nsJSContext::AddSupportsPrimitiveTojsvals(nsISupports *aArg, jsval *aArgv) AutoFree iidGuard(iid); // Free iid upon destruction. nsCOMPtr wrapper; - JSObject *global = xpc_UnmarkGrayObject(::JS_GetGlobalObject(cx)); jsval v; - nsresult rv = nsContentUtils::WrapNative(cx, global, + nsresult rv = nsContentUtils::WrapNative(cx, ::JS_GetGlobalObject(cx), data, iid, &v, getter_AddRefs(wrapper)); NS_ENSURE_SUCCESS(rv, rv); diff --git a/js/jsd/jsd_high.c b/js/jsd/jsd_high.c index 78fb7c05d6b..97698dd47b4 100644 --- a/js/jsd/jsd_high.c +++ b/js/jsd/jsd_high.c @@ -148,9 +148,6 @@ _newJSDContext(JSRuntime* jsrt, if( ! call ) goto label_newJSDContext_failure; - if ( ! JS_AddNamedObjectRoot(jsdc->dumbContext, &jsdc->glob, "JSD context global") ) - goto label_newJSDContext_failure; - ok = JS_InitStandardClasses(jsdc->dumbContext, jsdc->glob); JS_LeaveCrossCompartmentCall(call); @@ -170,8 +167,6 @@ _newJSDContext(JSRuntime* jsrt, label_newJSDContext_failure: if( jsdc ) { - if ( jsdc->dumbContext && jsdc->glob ) - JS_RemoveObjectRoot(jsdc->dumbContext, &jsdc->glob); jsd_DestroyObjectManager(jsdc); jsd_DestroyAtomTable(jsdc); if( jsdc->dumbContext ) @@ -190,8 +185,6 @@ _destroyJSDContext(JSDContext* jsdc) JS_REMOVE_LINK(&jsdc->links); JSD_UNLOCK(); - if ( jsdc->dumbContext && jsdc->glob ) - JS_RemoveObjectRoot(jsdc->dumbContext, &jsdc->glob); jsd_DestroyObjectManager(jsdc); jsd_DestroyAtomTable(jsdc); diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index aff7de5edef..eae2d322b3a 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -768,12 +768,6 @@ IsIncrementalBarrierNeededOnObject(JSObject *obj) return obj->compartment()->needsBarrier(); } -JS_FRIEND_API(bool) -IsIncrementalBarrierNeededOnScript(JSScript *script) -{ - return script->compartment()->needsBarrier(); -} - extern JS_FRIEND_API(void) IncrementalReferenceBarrier(void *ptr) { diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h index 997f4010b22..4df3f883c5c 100644 --- a/js/src/jsfriendapi.h +++ b/js/src/jsfriendapi.h @@ -724,9 +724,6 @@ IsIncrementalBarrierNeeded(JSContext *cx); extern JS_FRIEND_API(bool) IsIncrementalBarrierNeededOnObject(JSObject *obj); -extern JS_FRIEND_API(bool) -IsIncrementalBarrierNeededOnScript(JSScript *obj); - extern JS_FRIEND_API(void) IncrementalReferenceBarrier(void *ptr); diff --git a/js/src/jsprobes.cpp b/js/src/jsprobes.cpp index 5a59e556718..c786e8e98e2 100644 --- a/js/src/jsprobes.cpp +++ b/js/src/jsprobes.cpp @@ -217,33 +217,33 @@ Probes::JITWatcher::CollectNativeRegions(RegionVector ®ions, } void -Probes::registerMJITCode(JSContext *cx, js::mjit::JITChunk *chunk, +Probes::registerMJITCode(JSContext *cx, js::mjit::JITScript *jscr, js::mjit::JSActiveFrame *outerFrame, js::mjit::JSActiveFrame **inlineFrames, void *mainCodeAddress, size_t mainCodeSize, void *stubCodeAddress, size_t stubCodeSize) { for (JITWatcher **p = jitWatchers.begin(); p != jitWatchers.end(); ++p) - (*p)->registerMJITCode(cx, chunk, outerFrame, + (*p)->registerMJITCode(cx, jscr, outerFrame, inlineFrames, mainCodeAddress, mainCodeSize, stubCodeAddress, stubCodeSize); } void -Probes::discardMJITCode(FreeOp *fop, mjit::JITScript *jscr, mjit::JITChunk *chunk, void* address) +Probes::discardMJITCode(FreeOp *fop, mjit::JITScript *jscr, JSScript *script, void* address) { for (JITWatcher **p = jitWatchers.begin(); p != jitWatchers.end(); ++p) - (*p)->discardMJITCode(fop, jscr, chunk, address); + (*p)->discardMJITCode(fop, jscr, script, address); } void Probes::registerICCode(JSContext *cx, - mjit::JITChunk *chunk, JSScript *script, jsbytecode* pc, + mjit::JITScript *jscr, JSScript *script, jsbytecode* pc, void *start, size_t size) { for (JITWatcher **p = jitWatchers.begin(); p != jitWatchers.end(); ++p) - (*p)->registerICCode(cx, chunk, script, pc, start, size); + (*p)->registerICCode(cx, jscr, script, pc, start, size); } #endif diff --git a/js/src/jsprobes.h b/js/src/jsprobes.h index c64daf4e211..1c44f96c7ee 100644 --- a/js/src/jsprobes.h +++ b/js/src/jsprobes.h @@ -258,17 +258,17 @@ public: mjit::JSActiveFrame *outerFrame, mjit::JSActiveFrame **inlineFrames); - virtual void registerMJITCode(JSContext *cx, js::mjit::JITChunk *chunk, + virtual void registerMJITCode(JSContext *cx, js::mjit::JITScript *jscr, mjit::JSActiveFrame *outerFrame, mjit::JSActiveFrame **inlineFrames, void *mainCodeAddress, size_t mainCodeSize, void *stubCodeAddress, size_t stubCodeSize) = 0; - virtual void discardMJITCode(FreeOp *fop, mjit::JITScript *jscr, mjit::JITChunk *chunk, + virtual void discardMJITCode(FreeOp *fop, mjit::JITScript *jscr, JSScript *script, void* address) = 0; virtual void registerICCode(JSContext *cx, - js::mjit::JITChunk *chunk, JSScript *script, jsbytecode* pc, + js::mjit::JITScript *jscr, JSScript *script, jsbytecode* pc, void *start, size_t size) = 0; #endif @@ -306,7 +306,7 @@ JITGranularityRequested(); * New method JIT code has been created */ void -registerMJITCode(JSContext *cx, js::mjit::JITChunk *chunk, +registerMJITCode(JSContext *cx, js::mjit::JITScript *jscr, mjit::JSActiveFrame *outerFrame, mjit::JSActiveFrame **inlineFrames, void *mainCodeAddress, size_t mainCodeSize, @@ -316,14 +316,14 @@ registerMJITCode(JSContext *cx, js::mjit::JITChunk *chunk, * Method JIT code is about to be discarded */ void -discardMJITCode(FreeOp *fop, mjit::JITScript *jscr, mjit::JITChunk *chunk, void* address); +discardMJITCode(FreeOp *fop, mjit::JITScript *jscr, JSScript *script, void* address); /* - * IC code has been allocated within the given JITChunk + * IC code has been allocated within the given JITScript */ void registerICCode(JSContext *cx, - mjit::JITChunk *chunk, JSScript *script, jsbytecode* pc, + mjit::JITScript *jscr, JSScript *script, jsbytecode* pc, void *start, size_t size); #endif /* JS_METHODJIT */ diff --git a/js/src/methodjit/BaseCompiler.h b/js/src/methodjit/BaseCompiler.h index ad31e63fdf4..24f65022da4 100644 --- a/js/src/methodjit/BaseCompiler.h +++ b/js/src/methodjit/BaseCompiler.h @@ -171,7 +171,7 @@ class LinkerHelper : public JSC::LinkBuffer JSC::CodeLocationLabel finalize(VMFrame &f) { masm.finalize(*this); JSC::CodeLocationLabel label = finalizeCodeAddendum(); - Probes::registerICCode(f.cx, f.chunk(), f.script(), f.pc(), + Probes::registerICCode(f.cx, f.jit(), f.script(), f.pc(), label.executableAddress(), masm.size()); return label; } diff --git a/js/src/methodjit/Compiler.cpp b/js/src/methodjit/Compiler.cpp index aeed084fbb7..f9d47fdd84c 100644 --- a/js/src/methodjit/Compiler.cpp +++ b/js/src/methodjit/Compiler.cpp @@ -1774,7 +1774,7 @@ mjit::Compiler::finishThisUp() JSC::ExecutableAllocator::makeExecutable(result, masm.size() + stubcc.size()); JSC::ExecutableAllocator::cacheFlush(result, masm.size() + stubcc.size()); - Probes::registerMJITCode(cx, chunk, + Probes::registerMJITCode(cx, jit, a, (JSActiveFrame**) inlineFrames.begin(), result, masm.size(), diff --git a/js/src/methodjit/MethodJIT.cpp b/js/src/methodjit/MethodJIT.cpp index 49ea633e221..66162ad9d2d 100644 --- a/js/src/methodjit/MethodJIT.cpp +++ b/js/src/methodjit/MethodJIT.cpp @@ -1328,7 +1328,7 @@ JITScript::destroyChunk(FreeOp *fop, unsigned chunkIndex, bool resetUses) ChunkDescriptor &desc = chunkDescriptor(chunkIndex); if (desc.chunk) { - Probes::discardMJITCode(fop, this, desc.chunk, desc.chunk->code.m_code.executableAddress()); + Probes::discardMJITCode(fop, this, script, desc.chunk->code.m_code.executableAddress()); fop->delete_(desc.chunk); desc.chunk = NULL; @@ -1484,8 +1484,6 @@ JITScript::nativeToPC(void *returnAddress, CallSite **pinline) JITChunk *chunk = findCodeChunk(returnAddress); JS_ASSERT(chunk); - JS_ASSERT(chunk->isValidCode(returnAddress)); - size_t low = 0; size_t high = chunk->nCallICs; js::mjit::ic::CallICInfo *callICs_ = chunk->callICs(); diff --git a/js/xpconnect/src/XPCWrappedJSClass.cpp b/js/xpconnect/src/XPCWrappedJSClass.cpp index 18019fee528..6177c20e1a5 100644 --- a/js/xpconnect/src/XPCWrappedJSClass.cpp +++ b/js/xpconnect/src/XPCWrappedJSClass.cpp @@ -1189,7 +1189,7 @@ nsXPCWrappedJSClass::CallMethod(nsXPCWrappedJS* wrapper, uint16_t methodIndex, return retval; XPCContext *xpcc = ccx.GetXPCContext(); - JSContext *cx = xpc_UnmarkGrayContext(ccx.GetJSContext()); + JSContext *cx = ccx.GetJSContext(); if (!cx || !xpcc || !IsReflectable(methodIndex)) return NS_ERROR_FAILURE; diff --git a/js/xpconnect/src/XPCWrappedNativeJSOps.cpp b/js/xpconnect/src/XPCWrappedNativeJSOps.cpp index 3800117509e..d50e21c711b 100644 --- a/js/xpconnect/src/XPCWrappedNativeJSOps.cpp +++ b/js/xpconnect/src/XPCWrappedNativeJSOps.cpp @@ -652,11 +652,11 @@ TraceScopeJSObjects(JSTracer *trc, XPCWrappedNativeScope* scope) JSObject* obj; - obj = scope->GetGlobalJSObjectPreserveColor(); + obj = scope->GetGlobalJSObject(); NS_ASSERTION(obj, "bad scope JSObject"); JS_CALL_OBJECT_TRACER(trc, obj, "XPCWrappedNativeScope::mGlobalJSObject"); - obj = scope->GetPrototypeJSObjectPreserveColor(); + obj = scope->GetPrototypeJSObject(); if (obj) { JS_CALL_OBJECT_TRACER(trc, obj, "XPCWrappedNativeScope::mPrototypeJSObject"); diff --git a/js/xpconnect/src/XPCWrappedNativeScope.cpp b/js/xpconnect/src/XPCWrappedNativeScope.cpp index 1a58273759b..6c5db66ee82 100644 --- a/js/xpconnect/src/XPCWrappedNativeScope.cpp +++ b/js/xpconnect/src/XPCWrappedNativeScope.cpp @@ -158,7 +158,7 @@ XPCWrappedNativeScope::XPCWrappedNativeScope(XPCCallContext& ccx, #ifdef DEBUG for (XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext) - MOZ_ASSERT(aGlobal != cur->GetGlobalJSObjectPreserveColor(), "dup object"); + NS_ASSERTION(aGlobal != cur->GetGlobalJSObject(), "dup object"); #endif mNext = gScopes; @@ -764,7 +764,7 @@ XPCWrappedNativeScope::FindInJSObjectScope(JSContext* cx, JSObject* obj, DEBUG_TrackScopeTraversal(); for (XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext) { - if (obj == cur->GetGlobalJSObjectPreserveColor()) { + if (obj == cur->GetGlobalJSObject()) { found = cur; break; } diff --git a/js/xpconnect/src/nsXPConnect.cpp b/js/xpconnect/src/nsXPConnect.cpp index 8526ab88d32..eb93c104481 100644 --- a/js/xpconnect/src/nsXPConnect.cpp +++ b/js/xpconnect/src/nsXPConnect.cpp @@ -774,19 +774,17 @@ UnmarkGrayChildren(JSTracer *trc, void **thingp, JSGCTraceKind kind) } void -xpc_UnmarkGrayGCThingRecursive(void *thing, JSGCTraceKind kind) +xpc_UnmarkGrayObjectRecursive(JSObject *obj) { - MOZ_ASSERT(thing, "Don't pass me null!"); - MOZ_ASSERT(kind != JSTRACE_SHAPE, "UnmarkGrayGCThingRecursive not intended for Shapes"); + NS_ASSERTION(obj, "Don't pass me null!"); // Unmark. - static_cast(thing)->unmark(js::gc::GRAY); + js::gc::AsCell(obj)->unmark(js::gc::GRAY); // Trace children. UnmarkGrayTracer trc; - JSRuntime *rt = nsXPConnect::GetRuntimeInstance()->GetJSRuntime(); - JS_TracerInit(&trc, rt, UnmarkGrayChildren); - JS_TraceChildren(&trc, thing, kind); + JS_TracerInit(&trc, JS_GetObjectRuntime(obj), UnmarkGrayChildren); + JS_TraceChildren(&trc, obj, JSTRACE_OBJECT); } struct TraversalTracer : public JSTracer @@ -2487,7 +2485,7 @@ nsXPConnect::Peek(JSContext * *_retval) return NS_ERROR_FAILURE; } - *_retval = xpc_UnmarkGrayContext(data->GetJSContextStack()->Peek()); + *_retval = data->GetJSContextStack()->Peek(); return NS_OK; } @@ -2592,7 +2590,7 @@ nsXPConnect::Pop(JSContext * *_retval) JSContext *cx = data->GetJSContextStack()->Pop(); if (_retval) - *_retval = xpc_UnmarkGrayContext(cx); + *_retval = cx; return NS_OK; } diff --git a/js/xpconnect/src/xpcprivate.h b/js/xpconnect/src/xpcprivate.h index 9b0733ded1f..8a86ebf2c7c 100644 --- a/js/xpconnect/src/xpcprivate.h +++ b/js/xpconnect/src/xpcprivate.h @@ -1289,7 +1289,7 @@ public: if (mCcx) return mCcx->GetScopeForNewJSObjects(); - return xpc_UnmarkGrayObject(mObj); + return mObj; } void SetScopeForNewJSObjects(JSObject *obj) { @@ -1305,7 +1305,7 @@ public: if (mCcx) return mCcx->GetFlattenedJSObject(); - return xpc_UnmarkGrayObject(mFlattenedJSObject); + return mFlattenedJSObject; } XPCCallContext &GetXPCCallContext() { @@ -1313,9 +1313,8 @@ public: mCcxToDestroy = mCcx = new (mData) XPCCallContext(mCallerLanguage, mCx, mCallBeginRequest == CALL_BEGINREQUEST, - xpc_UnmarkGrayObject(mObj), - xpc_UnmarkGrayObject(mFlattenedJSObject), - mWrapper, + mObj, + mFlattenedJSObject, mWrapper, mTearOff); if (!mCcx->IsValid()) { NS_ERROR("This is not supposed to fail!"); @@ -1524,18 +1523,10 @@ public: GetComponents() const {return mComponents;} JSObject* - GetGlobalJSObject() const - {return xpc_UnmarkGrayObject(mGlobalJSObject);} + GetGlobalJSObject() const {return mGlobalJSObject;} JSObject* - GetGlobalJSObjectPreserveColor() const {return mGlobalJSObject;} - - JSObject* - GetPrototypeJSObject() const - {return xpc_UnmarkGrayObject(mPrototypeJSObject);} - - JSObject* - GetPrototypeJSObjectPreserveColor() const {return mPrototypeJSObject;} + GetPrototypeJSObject() const {return mPrototypeJSObject;} // Getter for the prototype that we use for wrappers that have no // helper. @@ -2247,7 +2238,7 @@ public: GetRuntime() const {return mScope->GetRuntime();} JSObject* - GetJSProtoObject() const {return xpc_UnmarkGrayObject(mJSProtoObject);} + GetJSProtoObject() const {return mJSProtoObject;} nsIClassInfo* GetClassInfo() const {return mClassInfo;} @@ -3035,7 +3026,8 @@ public: * This getter clears the gray bit before handing out the JSObject which * means that the object is guaranteed to be kept alive past the next CC. */ - JSObject* GetJSObject() const {return xpc_UnmarkGrayObject(mJSObj);} + JSObject* GetJSObject() const {xpc_UnmarkGrayObject(mJSObj); + return mJSObj;} /** * This getter does not change the color of the JSObject meaning that the @@ -4495,7 +4487,8 @@ struct CompartmentPrivate */ JSObject *LookupExpandoObject(XPCWrappedNative *wn) { JSObject *obj = LookupExpandoObjectPreserveColor(wn); - return xpc_UnmarkGrayObject(obj); + xpc_UnmarkGrayObject(obj); + return obj; } bool RegisterDOMExpandoObject(JSObject *expando) { diff --git a/js/xpconnect/src/xpcpublic.h b/js/xpconnect/src/xpcpublic.h index 257300283c9..ff23f465bac 100644 --- a/js/xpconnect/src/xpcpublic.h +++ b/js/xpconnect/src/xpcpublic.h @@ -177,58 +177,21 @@ xpc_GCThingIsGrayCCThing(void *thing); // Implemented in nsXPConnect.cpp. extern void -xpc_UnmarkGrayGCThingRecursive(void *thing, JSGCTraceKind kind); +xpc_UnmarkGrayObjectRecursive(JSObject* obj); // Remove the gray color from the given JSObject and any other objects that can // be reached through it. -inline JSObject * +inline void xpc_UnmarkGrayObject(JSObject *obj) { if (obj) { if (xpc_IsGrayGCThing(obj)) - xpc_UnmarkGrayGCThingRecursive(obj, JSTRACE_OBJECT); + xpc_UnmarkGrayObjectRecursive(obj); else if (js::IsIncrementalBarrierNeededOnObject(obj)) js::IncrementalReferenceBarrier(obj); } - return obj; } -inline JSScript * -xpc_UnmarkGrayScript(JSScript *script) -{ - if (script) { - if (xpc_IsGrayGCThing(script)) - xpc_UnmarkGrayGCThingRecursive(script, JSTRACE_SCRIPT); - else if (js::IsIncrementalBarrierNeededOnScript(script)) - js::IncrementalReferenceBarrier(script); - } - return script; -} - -inline JSContext * -xpc_UnmarkGrayContext(JSContext *cx) -{ - if (cx) { - JSObject *global = JS_GetGlobalObject(cx); - xpc_UnmarkGrayObject(global); - if (JS_IsInRequest(JS_GetRuntime(cx))) { - JSObject *scope = JS_GetGlobalForScopeChain(cx); - if (scope != global) - xpc_UnmarkGrayObject(scope); - } - } - return cx; -} - -#ifdef __cplusplus -class XPCAutoRequest : public JSAutoRequest { -public: - XPCAutoRequest(JSContext *cx) : JSAutoRequest(cx) { - xpc_UnmarkGrayContext(cx); - } -}; -#endif - // If aVariant is an XPCVariant, this marks the object to be in aGeneration. // This also unmarks the gray JSObject. extern void From 2702248b0cc89574867c896ddafb620405d4ef55 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Tue, 24 Apr 2012 20:47:46 -0700 Subject: [PATCH 169/182] Bug 748473 - Back button is no longer mapped to escape key [r=cpeterson] --- widget/android/nsWindow.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/widget/android/nsWindow.cpp b/widget/android/nsWindow.cpp index 3251a608f7e..b00eedc253a 100644 --- a/widget/android/nsWindow.cpp +++ b/widget/android/nsWindow.cpp @@ -1615,7 +1615,9 @@ static unsigned int ConvertAndroidKeyCodeToDOMKeyCode(int androidKeyCode) } switch (androidKeyCode) { - // KEYCODE_UNKNOWN (0) ... KEYCODE_POUND (18) + // KEYCODE_UNKNOWN (0) ... KEYCODE_HOME (3) + case AndroidKeyEvent::KEYCODE_BACK: return NS_VK_ESCAPE; + // KEYCODE_CALL (5) ... KEYCODE_POUND (18) case AndroidKeyEvent::KEYCODE_DPAD_UP: return NS_VK_UP; case AndroidKeyEvent::KEYCODE_DPAD_DOWN: return NS_VK_DOWN; case AndroidKeyEvent::KEYCODE_DPAD_LEFT: return NS_VK_LEFT; From d2c28292257b5e80948236e550360cb7636ab23d Mon Sep 17 00:00:00 2001 From: Kan-Ru Chen Date: Wed, 25 Apr 2012 11:59:01 +0800 Subject: [PATCH 170/182] Bug 745077 - Reconfigure InputReader on screen rotation. r=mwu a=b2g-only --- widget/gonk/nsAppShell.cpp | 9 ++++++++- widget/gonk/nsAppShell.h | 1 + widget/gonk/nsWindow.cpp | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/widget/gonk/nsAppShell.cpp b/widget/gonk/nsAppShell.cpp index 33a39ab364f..fb960649708 100644 --- a/widget/gonk/nsAppShell.cpp +++ b/widget/gonk/nsAppShell.cpp @@ -696,8 +696,15 @@ nsAppShell::NotifyNativeEvent() write(signalfds[1], "w", 1); } -/*static*/ void +/* static */ void nsAppShell::NotifyScreenInitialized() { gAppShell->InitInputDevices(); } + +/* static */ void +nsAppShell::NotifyScreenRotation() +{ + gAppShell->mReaderPolicy->setDisplayInfo(); + gAppShell->mReader->requestRefreshConfiguration(InputReaderConfiguration::CHANGE_DISPLAY_INFO); +} diff --git a/widget/gonk/nsAppShell.h b/widget/gonk/nsAppShell.h index 84ef30d2986..3f196018288 100644 --- a/widget/gonk/nsAppShell.h +++ b/widget/gonk/nsAppShell.h @@ -98,6 +98,7 @@ public: void NotifyNativeEvent(); static void NotifyScreenInitialized(); + static void NotifyScreenRotation(); protected: virtual ~nsAppShell(); diff --git a/widget/gonk/nsWindow.cpp b/widget/gonk/nsWindow.cpp index e0f91c0bad6..585b6b09ee9 100644 --- a/widget/gonk/nsWindow.cpp +++ b/widget/gonk/nsWindow.cpp @@ -681,6 +681,8 @@ nsScreenGonk::SetRotation(PRUint32 aRotation) sVirtualBounds.height, !i); + nsAppShell::NotifyScreenRotation(); + return NS_OK; } From bc0077869e503ee90f753ba2ca717062007db340 Mon Sep 17 00:00:00 2001 From: Trevor Saunders Date: Wed, 25 Apr 2012 01:42:57 -0400 Subject: [PATCH 171/182] enable logging for bug 739455 --- accessible/tests/mochitest/relations/test_tabbrowser.xul | 1 + 1 file changed, 1 insertion(+) diff --git a/accessible/tests/mochitest/relations/test_tabbrowser.xul b/accessible/tests/mochitest/relations/test_tabbrowser.xul index 5f68e7218d0..75d1852eb90 100644 --- a/accessible/tests/mochitest/relations/test_tabbrowser.xul +++ b/accessible/tests/mochitest/relations/test_tabbrowser.xul @@ -62,6 +62,7 @@ //////////////////////////////////////////////////////////////////////////// // Test var gQueue = null; + gA11yEventDumpToConsole = true; function doTest() { // Load documents into tabs and wait for DocLoadComplete events caused by From 9671629505c5e059461f6375136f2f336193a916 Mon Sep 17 00:00:00 2001 From: Trevor Saunders Date: Wed, 25 Apr 2012 01:42:58 -0400 Subject: [PATCH 172/182] bug 747588 - set eImageAccessible bit in mFlags for nsHTMLImageAccessible r=surkov --- accessible/src/html/nsHTMLImageAccessible.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/accessible/src/html/nsHTMLImageAccessible.cpp b/accessible/src/html/nsHTMLImageAccessible.cpp index 3325c49f398..c72ba1f3a0c 100644 --- a/accessible/src/html/nsHTMLImageAccessible.cpp +++ b/accessible/src/html/nsHTMLImageAccessible.cpp @@ -65,6 +65,7 @@ nsHTMLImageAccessible:: nsHTMLImageAccessible(nsIContent* aContent, nsDocAccessible* aDoc) : nsLinkableAccessible(aContent, aDoc) { + mFlags |= eImageAccessible; } NS_IMPL_ISUPPORTS_INHERITED1(nsHTMLImageAccessible, nsAccessible, From 95605392909b73902603617e81c3e5541c62f873 Mon Sep 17 00:00:00 2001 From: Trevor Saunders Date: Wed, 25 Apr 2012 01:42:59 -0400 Subject: [PATCH 173/182] enable logging for bug 745788 --- accessible/tests/mochitest/treeupdate/test_imagemap.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessible/tests/mochitest/treeupdate/test_imagemap.html b/accessible/tests/mochitest/treeupdate/test_imagemap.html index 1a448d1693a..d35de77b40d 100644 --- a/accessible/tests/mochitest/treeupdate/test_imagemap.html +++ b/accessible/tests/mochitest/treeupdate/test_imagemap.html @@ -380,7 +380,7 @@ } } - //gA11yEventDumpToConsole = true; + gA11yEventDumpToConsole = true; var gQueue = null; function doTest() From 8ef0db5648d67ac609f7c425f09ce7751ac1a970 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Wed, 25 Apr 2012 08:56:32 +0300 Subject: [PATCH 174/182] Bug 743819 - Only re-spellcheck new nodes on insertions, not everything; r=ehsan --- editor/libeditor/html/nsHTMLEditRules.cpp | 3 --- editor/libeditor/html/nsHTMLEditor.cpp | 16 +++++++++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/editor/libeditor/html/nsHTMLEditRules.cpp b/editor/libeditor/html/nsHTMLEditRules.cpp index 609553e30cf..0b342272127 100644 --- a/editor/libeditor/html/nsHTMLEditRules.cpp +++ b/editor/libeditor/html/nsHTMLEditRules.cpp @@ -9250,7 +9250,4 @@ nsHTMLEditRules::DocumentModifiedWorker() // Try to recreate the bogus node if needed. CreateBogusNodeIfNeeded(selection); - - // Reset the spell checker - mEditor->SyncRealTimeSpell(); } diff --git a/editor/libeditor/html/nsHTMLEditor.cpp b/editor/libeditor/html/nsHTMLEditor.cpp index e290da64476..61b91b877c2 100644 --- a/editor/libeditor/html/nsHTMLEditor.cpp +++ b/editor/libeditor/html/nsHTMLEditor.cpp @@ -3506,14 +3506,14 @@ NS_IMETHODIMP nsHTMLEditor::InsertTextImpl(const nsAString& aStringToInsert, void nsHTMLEditor::ContentAppended(nsIDocument *aDocument, nsIContent* aContainer, nsIContent* aFirstNewContent, - PRInt32 /* unused */) + PRInt32 aIndexInContainer) { - ContentInserted(aDocument, aContainer, aFirstNewContent, 0); + ContentInserted(aDocument, aContainer, aFirstNewContent, aIndexInContainer); } void nsHTMLEditor::ContentInserted(nsIDocument *aDocument, nsIContent* aContainer, - nsIContent* aChild, PRInt32 /* unused */) + nsIContent* aChild, PRInt32 aIndexInContainer) { if (!aChild) { return; @@ -3531,6 +3531,16 @@ nsHTMLEditor::ContentInserted(nsIDocument *aDocument, nsIContent* aContainer, return; } mRules->DocumentModified(); + + // Update spellcheck for only the newly-inserted node (bug 743819) + if (mInlineSpellChecker) { + nsRefPtr range = new nsRange(); + nsresult res = range->Set(aContainer, aIndexInContainer, + aContainer, aIndexInContainer + 1); + if (NS_SUCCEEDED(res)) { + mInlineSpellChecker->SpellCheckRange(range); + } + } } } From e9359afb21ca52fc84d0650380c7666c78262a85 Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Wed, 25 Apr 2012 09:00:57 +0200 Subject: [PATCH 175/182] Bug 508942 - Use Preprocessor.py filters in #defines and #includes. r=ted,r=pike Original patch by Markus Stange. --- config/Preprocessor.py | 11 ++++++++--- config/tests/unit-Preprocessor.py | 9 +++++++++ js/src/config/Preprocessor.py | 11 ++++++++--- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/config/Preprocessor.py b/config/Preprocessor.py index a2721179aa5..298165a9d50 100644 --- a/config/Preprocessor.py +++ b/config/Preprocessor.py @@ -134,6 +134,11 @@ class Preprocessor: rv.out = self.out return rv + def applyFilters(self, aLine): + for f in self.filters: + aLine = f[1](aLine) + return aLine + def write(self, aLine): """ Internal method for handling output. @@ -146,8 +151,7 @@ class Preprocessor: 'file': self.context['FILE'], 'le': self.LE}) self.writtenLines = ln - for f in self.filters: - aLine = f[1](aLine) + aLine = self.applyFilters(aLine) # ensure our line ending. Only need to handle \n, as we're reading # with universal line ending support, at least for files. aLine = re.sub('\n', self.LE, aLine) @@ -242,7 +246,7 @@ class Preprocessor: raise Preprocessor.Error(self, 'SYNTAX_DEF', args) val = 1 if m.group('value'): - val = m.group('value') + val = self.applyFilters(m.group('value')) try: val = int(val) except: @@ -423,6 +427,7 @@ class Preprocessor: if isName: try: args = str(args) + args = self.applyFilters(args) if not os.path.isabs(args): args = os.path.join(self.context['DIRECTORY'], args) args = open(args, 'rU') diff --git a/config/tests/unit-Preprocessor.py b/config/tests/unit-Preprocessor.py index d2f95f0270c..0ae2f88f802 100644 --- a/config/tests/unit-Preprocessor.py +++ b/config/tests/unit-Preprocessor.py @@ -404,6 +404,15 @@ FAIL self.pp.do_include(f) self.assertEqual(self.pp.out.getvalue(), "first\rsecond\r") + def test_filterDefine(self): + f = NamedIO('filterDefine.in', '''#filter substitution +#define VAR AS +#define VAR2 P@VAR@ +@VAR2@S +''') + self.pp.do_include(f) + self.assertEqual(self.pp.out.getvalue(), "PASS\n") + def test_number_value_equals(self): f = NamedIO("number_value_equals.in", """#define FOO 1000 #if FOO == 1000 diff --git a/js/src/config/Preprocessor.py b/js/src/config/Preprocessor.py index a2721179aa5..298165a9d50 100644 --- a/js/src/config/Preprocessor.py +++ b/js/src/config/Preprocessor.py @@ -134,6 +134,11 @@ class Preprocessor: rv.out = self.out return rv + def applyFilters(self, aLine): + for f in self.filters: + aLine = f[1](aLine) + return aLine + def write(self, aLine): """ Internal method for handling output. @@ -146,8 +151,7 @@ class Preprocessor: 'file': self.context['FILE'], 'le': self.LE}) self.writtenLines = ln - for f in self.filters: - aLine = f[1](aLine) + aLine = self.applyFilters(aLine) # ensure our line ending. Only need to handle \n, as we're reading # with universal line ending support, at least for files. aLine = re.sub('\n', self.LE, aLine) @@ -242,7 +246,7 @@ class Preprocessor: raise Preprocessor.Error(self, 'SYNTAX_DEF', args) val = 1 if m.group('value'): - val = m.group('value') + val = self.applyFilters(m.group('value')) try: val = int(val) except: @@ -423,6 +427,7 @@ class Preprocessor: if isName: try: args = str(args) + args = self.applyFilters(args) if not os.path.isabs(args): args = os.path.join(self.context['DIRECTORY'], args) args = open(args, 'rU') From 82568e3e187847030e464063a614d237957ed09a Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Wed, 25 Apr 2012 09:01:10 +0200 Subject: [PATCH 176/182] Bug 743241 - Remove OSARCH and OSTYPE defines from config.mk. r=ted --- config/config.mk | 6 ------ intl/locale/src/unix/Makefile.in | 2 ++ js/src/config/config.mk | 6 ------ layout/style/forms.css | 2 +- 4 files changed, 3 insertions(+), 13 deletions(-) diff --git a/config/config.mk b/config/config.mk index d246b8dc8ac..9ad21697a37 100644 --- a/config/config.mk +++ b/config/config.mk @@ -660,12 +660,6 @@ endif -include $(topsrcdir)/$(MOZ_BUILD_APP)/app-config.mk -include $(MY_CONFIG) -###################################################################### -# Now test variables that might have been set or overridden by $(MY_CONFIG). - -DEFINES += -DOSTYPE=\"$(OS_CONFIG)\" -DEFINES += -DOSARCH=$(OS_ARCH) - ###################################################################### GARBAGE += $(DEPENDENCIES) $(MKDEPENDENCIES) $(MKDEPENDENCIES).bak core $(wildcard core.[0-9]*) $(wildcard *.err) $(wildcard *.pure) $(wildcard *_pure_*.o) Templates.DB diff --git a/intl/locale/src/unix/Makefile.in b/intl/locale/src/unix/Makefile.in index c28ea5c56c3..4093cfd1fd0 100644 --- a/intl/locale/src/unix/Makefile.in +++ b/intl/locale/src/unix/Makefile.in @@ -71,6 +71,8 @@ ifeq ($(OS_ARCH), Linux) DEFINES += -D_XOPEN_SOURCE=500 endif +DEFINES += -DOSTYPE=\"$(OS_CONFIG)\" + nsUNIXCharset.$(OBJ_SUFFIX): unixcharset.properties.h unixcharset.properties.h: $(srcdir)/../props2arrays.py unixcharset.properties diff --git a/js/src/config/config.mk b/js/src/config/config.mk index d246b8dc8ac..9ad21697a37 100644 --- a/js/src/config/config.mk +++ b/js/src/config/config.mk @@ -660,12 +660,6 @@ endif -include $(topsrcdir)/$(MOZ_BUILD_APP)/app-config.mk -include $(MY_CONFIG) -###################################################################### -# Now test variables that might have been set or overridden by $(MY_CONFIG). - -DEFINES += -DOSTYPE=\"$(OS_CONFIG)\" -DEFINES += -DOSARCH=$(OS_ARCH) - ###################################################################### GARBAGE += $(DEPENDENCIES) $(MKDEPENDENCIES) $(MKDEPENDENCIES).bak core $(wildcard core.[0-9]*) $(wildcard *.err) $(wildcard *.pure) $(wildcard *_pure_*.o) Templates.DB diff --git a/layout/style/forms.css b/layout/style/forms.css index 5681ebe13d7..869819550b5 100644 --- a/layout/style/forms.css +++ b/layout/style/forms.css @@ -692,7 +692,7 @@ progress { background-color: #0064b4; /* blue */ } -%if OSARCH==OS2 +%ifdef XP_OS2 input { font: medium serif; font-family: inherit } From 21f5df707f2b9983e5b97781feac2322e8b9c6d4 Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Wed, 25 Apr 2012 09:04:40 +0200 Subject: [PATCH 177/182] Bug 746650 - Don't run expandlibs configure tests when building with --disable-compile-environment. r=ted --- configure.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configure.in b/configure.in index 6e0f051210c..431b40f6c6a 100644 --- a/configure.in +++ b/configure.in @@ -7926,7 +7926,9 @@ fi # ! SKIP_COMPILER_CHECKS AC_DEFINE(CPP_THROW_NEW, [throw()]) AC_LANG_C +if test "$COMPILE_ENVIRONMENT"; then MOZ_EXPAND_LIBS +fi # COMPILE_ENVIRONMENT dnl ======================================================== dnl = From 1e89bab7e7b60f213f6462ea50c44aec23259dfd Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Wed, 25 Apr 2012 09:05:02 +0200 Subject: [PATCH 178/182] Bug 747033 - Implement dl_iterate_phdr in the custom linker. r=froydnj --HG-- rename : mozglue/linker/CustomElf.h => mozglue/linker/Elfxx.h --- mozglue/linker/CustomElf.cpp | 2 + mozglue/linker/CustomElf.h | 227 +-------------------------------- mozglue/linker/ElfLoader.cpp | 20 +++ mozglue/linker/ElfLoader.h | 56 +++++++++ mozglue/linker/Elfxx.h | 236 +++++++++++++++++++++++++++++++++++ 5 files changed, 315 insertions(+), 226 deletions(-) create mode 100644 mozglue/linker/Elfxx.h diff --git a/mozglue/linker/CustomElf.cpp b/mozglue/linker/CustomElf.cpp index 4eac8a71e84..4f5152f2faf 100644 --- a/mozglue/linker/CustomElf.cpp +++ b/mozglue/linker/CustomElf.cpp @@ -291,6 +291,8 @@ CustomElf::GetSymbolPtrInDeps(const char *symbol) const return FunctionPtr(__wrap_dlsym); if (strcmp(symbol + 2, "addr") == 0) return FunctionPtr(__wrap_dladdr); + if (strcmp(symbol + 2, "_iterate_phdr") == 0) + return FunctionPtr(__wrap_dl_iterate_phdr); } else if (symbol[0] == '_' && symbol[1] == '_') { /* Resolve a few C++ ABI specific functions to point to ours */ #ifdef __ARM_EABI__ diff --git a/mozglue/linker/CustomElf.h b/mozglue/linker/CustomElf.h index 043ea2c1fb4..74f789b27c3 100644 --- a/mozglue/linker/CustomElf.h +++ b/mozglue/linker/CustomElf.h @@ -5,234 +5,9 @@ #ifndef CustomElf_h #define CustomElf_h -/** - * Android system headers have two different elf.h file. The one under linux/ - * is the most complete. - */ -#ifdef ANDROID -#include -#else -#include -#endif -#include #include "ElfLoader.h" #include "Logging.h" - -/** - * Generic ELF macros for the target system - */ -#ifdef HAVE_64BIT_OS -#define Elf_(type) Elf64_ ## type -#define ELFCLASS ELFCLASS64 -#define ELF_R_TYPE ELF64_R_TYPE -#define ELF_R_SYM ELF64_R_SYM -#ifndef ELF_ST_BIND -#define ELF_ST_BIND ELF64_ST_BIND -#endif -#define PRIxAddr "lx" -#else -#define Elf_(type) Elf32_ ## type -#define ELFCLASS ELFCLASS32 -#define ELF_R_TYPE ELF32_R_TYPE -#define ELF_R_SYM ELF32_R_SYM -#ifndef ELF_ST_BIND -#define ELF_ST_BIND ELF32_ST_BIND -#endif -#define PRIxAddr "x" -#endif - -#ifndef __BYTE_ORDER -#error Cannot find endianness -#endif - -#if __BYTE_ORDER == __LITTLE_ENDIAN -#define ELFDATA ELFDATA2LSB -#elif __BYTE_ORDER == __BIG_ENDIAN -#define ELFDATA ELFDATA2MSB -#endif - -#ifdef __linux__ -#define ELFOSABI ELFOSABI_LINUX -#ifdef EI_ABIVERSION -#define ELFABIVERSION 0 -#endif -#else -#error Unknown ELF OSABI -#endif - -#if defined(__i386__) -#define ELFMACHINE EM_386 - -// Doing this way probably doesn't scale to other architectures -#define R_ABS R_386_32 -#define R_GLOB_DAT R_386_GLOB_DAT -#define R_JMP_SLOT R_386_JMP_SLOT -#define R_RELATIVE R_386_RELATIVE -#define RELOC(n) DT_REL ## n -#define UNSUPPORTED_RELOC(n) DT_RELA ## n -#define STR_RELOC(n) "DT_REL" # n -#define Reloc Rel - -#elif defined(__x86_64__) -#define ELFMACHINE EM_X86_64 - -#define R_ABS R_X86_64_64 -#define R_GLOB_DAT R_X86_64_GLOB_DAT -#define R_JMP_SLOT R_X86_64_JUMP_SLOT -#define R_RELATIVE R_X86_64_RELATIVE -#define RELOC(n) DT_RELA ## n -#define UNSUPPORTED_RELOC(n) DT_REL ## n -#define STR_RELOC(n) "DT_RELA" # n -#define Reloc Rela - -#elif defined(__arm__) -#define ELFMACHINE EM_ARM - -#ifndef R_ARM_ABS32 -#define R_ARM_ABS32 2 -#endif -#ifndef R_ARM_GLOB_DAT -#define R_ARM_GLOB_DAT 21 -#endif -#ifndef R_ARM_JUMP_SLOT -#define R_ARM_JUMP_SLOT 22 -#endif -#ifndef R_ARM_RELATIVE -#define R_ARM_RELATIVE 23 -#endif - -#define R_ABS R_ARM_ABS32 -#define R_GLOB_DAT R_ARM_GLOB_DAT -#define R_JMP_SLOT R_ARM_JUMP_SLOT -#define R_RELATIVE R_ARM_RELATIVE -#define RELOC(n) DT_REL ## n -#define UNSUPPORTED_RELOC(n) DT_RELA ## n -#define STR_RELOC(n) "DT_REL" # n -#define Reloc Rel - -#else -#error Unknown ELF machine type -#endif - -/** - * Android system headers don't have all definitions - */ -#ifndef STN_UNDEF -#define STN_UNDEF 0 -#endif -#ifndef DT_INIT_ARRAY -#define DT_INIT_ARRAY 25 -#endif -#ifndef DT_FINI_ARRAY -#define DT_FINI_ARRAY 26 -#endif -#ifndef DT_INIT_ARRAYSZ -#define DT_INIT_ARRAYSZ 27 -#endif -#ifndef DT_FINI_ARRAYSZ -#define DT_FINI_ARRAYSZ 28 -#endif -#ifndef DT_RELACOUNT -#define DT_RELACOUNT 0x6ffffff9 -#endif -#ifndef DT_RELCOUNT -#define DT_RELCOUNT 0x6ffffffa -#endif -#ifndef DT_VERSYM -#define DT_VERSYM 0x6ffffff0 -#endif -#ifndef DT_VERDEF -#define DT_VERDEF 0x6ffffffc -#endif -#ifndef DT_VERDEFNUM -#define DT_VERDEFNUM 0x6ffffffd -#endif -#ifndef DT_VERNEED -#define DT_VERNEED 0x6ffffffe -#endif -#ifndef DT_VERNEEDNUM -#define DT_VERNEEDNUM 0x6fffffff -#endif -#ifndef DT_FLAGS -#define DT_FLAGS 30 -#endif -#ifndef DF_SYMBOLIC -#define DF_SYMBOLIC 0x00000002 -#endif -#ifndef DF_TEXTREL -#define DF_TEXTREL 0x00000004 -#endif - -namespace Elf { - -/** - * Define a few basic Elf Types - */ -typedef Elf_(Phdr) Phdr; -typedef Elf_(Dyn) Dyn; -typedef Elf_(Sym) Sym; -typedef Elf_(Addr) Addr; -typedef Elf_(Word) Word; - -/** - * Helper class around the standard Elf header struct - */ -struct Ehdr: public Elf_(Ehdr) -{ - /** - * Equivalent to reinterpret_cast(buf), but additionally - * checking that this is indeed an Elf header and that the Elf type - * corresponds to that of the system - */ - static const Ehdr *validate(const void *buf); -}; - -/** - * Elf String table - */ -class Strtab: public UnsizedArray -{ -public: - /** - * Returns the string at the given index in the table - */ - const char *GetStringAt(off_t index) const - { - return &UnsizedArray::operator[](index); - } -}; - -/** - * Helper class around Elf relocation. - */ -struct Rel: public Elf_(Rel) -{ - /** - * Returns the addend for the relocation, which is the value stored - * at r_offset. - */ - Addr GetAddend(void *base) const - { - return *(reinterpret_cast( - reinterpret_cast(base) + r_offset)); - } -}; - -/** - * Helper class around Elf relocation with addend. - */ -struct Rela: public Elf_(Rela) -{ - /** - * Returns the addend for the relocation. - */ - Addr GetAddend(void *base) const - { - return r_addend; - } -}; - -} /* namespace Elf */ +#include "Elfxx.h" class Mappable; diff --git a/mozglue/linker/ElfLoader.cpp b/mozglue/linker/ElfLoader.cpp index d33aa67eb45..7cdb1bd48fb 100644 --- a/mozglue/linker/ElfLoader.cpp +++ b/mozglue/linker/ElfLoader.cpp @@ -92,6 +92,26 @@ __wrap_dladdr(void *addr, Dl_info *info) return 1; } +int +__wrap_dl_iterate_phdr(dl_phdr_cb callback, void *data) +{ + if (ElfLoader::Singleton.dbg == NULL) + return -1; + + for (ElfLoader::r_debug::iterator it = ElfLoader::Singleton.dbg->begin(); + it < ElfLoader::Singleton.dbg->end(); ++it) { + dl_phdr_info info; + info.dlpi_addr = reinterpret_cast(it->l_addr); + info.dlpi_name = it->l_name; + info.dlpi_phdr = NULL; + info.dlpi_phnum = 0; + int ret = callback(&info, sizeof(dl_phdr_info), data); + if (ret) + return ret; + } + return 0; +} + namespace { /** diff --git a/mozglue/linker/ElfLoader.h b/mozglue/linker/ElfLoader.h index d5df3f5f943..2c0a6fa0765 100644 --- a/mozglue/linker/ElfLoader.h +++ b/mozglue/linker/ElfLoader.h @@ -10,6 +10,7 @@ #include #include "mozilla/RefPtr.h" #include "Zip.h" +#include "Elfxx.h" /** * dlfcn.h replacement functions @@ -33,6 +34,16 @@ extern "C" { sighandler_t __wrap_signal(int signum, sighandler_t handler); int __wrap_sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); + + struct dl_phdr_info { + Elf::Addr dlpi_addr; + const char *dlpi_name; + const Elf::Phdr *dlpi_phdr; + Elf::Half dlpi_phnum; + }; + + typedef int (*dl_phdr_cb)(struct dl_phdr_info *, size_t, void *); + int __wrap_dl_iterate_phdr(dl_phdr_cb callback, void *data); } /** @@ -356,6 +367,8 @@ private: /* Keep track of Zips used for library loading */ ZipCollection zips; + /* Forward declaration, see further below */ + class r_debug; public: /* Loaded object descriptor for the debugger interface below*/ struct link_map { @@ -365,6 +378,9 @@ public: const char *l_name; /* Address of the PT_DYNAMIC segment. */ const void *l_ld; + + private: + friend class ElfLoader::r_debug; /* Double linked list of loaded objects. */ link_map *l_next, *l_prev; }; @@ -381,6 +397,45 @@ private: /* Make the debugger aware of the unloading of an object */ void Remove(link_map *map); + /* Iterates over all link_maps */ + class iterator + { + public: + const link_map *operator ->() const + { + return item; + } + + const link_map &operator ++() + { + item = item->l_next; + return *item; + } + + bool operator<(const iterator &other) const + { + if (other.item == NULL) + return item ? true : false; + MOZ_NOT_REACHED("r_debug::iterator::operator< called with something else than r_debug::end()"); + } + protected: + friend class r_debug; + iterator(const link_map *item): item(item) { } + + private: + const link_map *item; + }; + + iterator begin() const + { + return iterator(r_map); + } + + iterator end() const + { + return iterator(NULL); + } + private: /* Version number of the protocol. */ int r_version; @@ -401,6 +456,7 @@ private: RT_DELETE /* Beginning to remove an object */ } r_state; }; + friend int __wrap_dl_iterate_phdr(dl_phdr_cb callback, void *data); r_debug *dbg; /** diff --git a/mozglue/linker/Elfxx.h b/mozglue/linker/Elfxx.h new file mode 100644 index 00000000000..cd871561bda --- /dev/null +++ b/mozglue/linker/Elfxx.h @@ -0,0 +1,236 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef Elfxx_h +#define Elfxx_h + +/** + * Android system headers have two different elf.h file. The one under linux/ + * is the most complete. + */ +#ifdef ANDROID +#include +#else +#include +#endif +#include + +/** + * Generic ELF macros for the target system + */ +#ifdef HAVE_64BIT_OS +#define Elf_(type) Elf64_ ## type +#define ELFCLASS ELFCLASS64 +#define ELF_R_TYPE ELF64_R_TYPE +#define ELF_R_SYM ELF64_R_SYM +#ifndef ELF_ST_BIND +#define ELF_ST_BIND ELF64_ST_BIND +#endif +#define PRIxAddr "lx" +#else +#define Elf_(type) Elf32_ ## type +#define ELFCLASS ELFCLASS32 +#define ELF_R_TYPE ELF32_R_TYPE +#define ELF_R_SYM ELF32_R_SYM +#ifndef ELF_ST_BIND +#define ELF_ST_BIND ELF32_ST_BIND +#endif +#define PRIxAddr "x" +#endif + +#ifndef __BYTE_ORDER +#error Cannot find endianness +#endif + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define ELFDATA ELFDATA2LSB +#elif __BYTE_ORDER == __BIG_ENDIAN +#define ELFDATA ELFDATA2MSB +#endif + +#ifdef __linux__ +#define ELFOSABI ELFOSABI_LINUX +#ifdef EI_ABIVERSION +#define ELFABIVERSION 0 +#endif +#else +#error Unknown ELF OSABI +#endif + +#if defined(__i386__) +#define ELFMACHINE EM_386 + +// Doing this way probably doesn't scale to other architectures +#define R_ABS R_386_32 +#define R_GLOB_DAT R_386_GLOB_DAT +#define R_JMP_SLOT R_386_JMP_SLOT +#define R_RELATIVE R_386_RELATIVE +#define RELOC(n) DT_REL ## n +#define UNSUPPORTED_RELOC(n) DT_RELA ## n +#define STR_RELOC(n) "DT_REL" # n +#define Reloc Rel + +#elif defined(__x86_64__) +#define ELFMACHINE EM_X86_64 + +#define R_ABS R_X86_64_64 +#define R_GLOB_DAT R_X86_64_GLOB_DAT +#define R_JMP_SLOT R_X86_64_JUMP_SLOT +#define R_RELATIVE R_X86_64_RELATIVE +#define RELOC(n) DT_RELA ## n +#define UNSUPPORTED_RELOC(n) DT_REL ## n +#define STR_RELOC(n) "DT_RELA" # n +#define Reloc Rela + +#elif defined(__arm__) +#define ELFMACHINE EM_ARM + +#ifndef R_ARM_ABS32 +#define R_ARM_ABS32 2 +#endif +#ifndef R_ARM_GLOB_DAT +#define R_ARM_GLOB_DAT 21 +#endif +#ifndef R_ARM_JUMP_SLOT +#define R_ARM_JUMP_SLOT 22 +#endif +#ifndef R_ARM_RELATIVE +#define R_ARM_RELATIVE 23 +#endif + +#define R_ABS R_ARM_ABS32 +#define R_GLOB_DAT R_ARM_GLOB_DAT +#define R_JMP_SLOT R_ARM_JUMP_SLOT +#define R_RELATIVE R_ARM_RELATIVE +#define RELOC(n) DT_REL ## n +#define UNSUPPORTED_RELOC(n) DT_RELA ## n +#define STR_RELOC(n) "DT_REL" # n +#define Reloc Rel + +#else +#error Unknown ELF machine type +#endif + +/** + * Android system headers don't have all definitions + */ +#ifndef STN_UNDEF +#define STN_UNDEF 0 +#endif +#ifndef DT_INIT_ARRAY +#define DT_INIT_ARRAY 25 +#endif +#ifndef DT_FINI_ARRAY +#define DT_FINI_ARRAY 26 +#endif +#ifndef DT_INIT_ARRAYSZ +#define DT_INIT_ARRAYSZ 27 +#endif +#ifndef DT_FINI_ARRAYSZ +#define DT_FINI_ARRAYSZ 28 +#endif +#ifndef DT_RELACOUNT +#define DT_RELACOUNT 0x6ffffff9 +#endif +#ifndef DT_RELCOUNT +#define DT_RELCOUNT 0x6ffffffa +#endif +#ifndef DT_VERSYM +#define DT_VERSYM 0x6ffffff0 +#endif +#ifndef DT_VERDEF +#define DT_VERDEF 0x6ffffffc +#endif +#ifndef DT_VERDEFNUM +#define DT_VERDEFNUM 0x6ffffffd +#endif +#ifndef DT_VERNEED +#define DT_VERNEED 0x6ffffffe +#endif +#ifndef DT_VERNEEDNUM +#define DT_VERNEEDNUM 0x6fffffff +#endif +#ifndef DT_FLAGS +#define DT_FLAGS 30 +#endif +#ifndef DF_SYMBOLIC +#define DF_SYMBOLIC 0x00000002 +#endif +#ifndef DF_TEXTREL +#define DF_TEXTREL 0x00000004 +#endif + +namespace Elf { + +/** + * Define a few basic Elf Types + */ +typedef Elf_(Phdr) Phdr; +typedef Elf_(Dyn) Dyn; +typedef Elf_(Sym) Sym; +typedef Elf_(Addr) Addr; +typedef Elf_(Word) Word; +typedef Elf_(Half) Half; + +/** + * Helper class around the standard Elf header struct + */ +struct Ehdr: public Elf_(Ehdr) +{ + /** + * Equivalent to reinterpret_cast(buf), but additionally + * checking that this is indeed an Elf header and that the Elf type + * corresponds to that of the system + */ + static const Ehdr *validate(const void *buf); +}; + +/** + * Elf String table + */ +class Strtab: public UnsizedArray +{ +public: + /** + * Returns the string at the given index in the table + */ + const char *GetStringAt(off_t index) const + { + return &UnsizedArray::operator[](index); + } +}; + +/** + * Helper class around Elf relocation. + */ +struct Rel: public Elf_(Rel) +{ + /** + * Returns the addend for the relocation, which is the value stored + * at r_offset. + */ + Addr GetAddend(void *base) const + { + return *(reinterpret_cast( + reinterpret_cast(base) + r_offset)); + } +}; + +/** + * Helper class around Elf relocation with addend. + */ +struct Rela: public Elf_(Rela) +{ + /** + * Returns the addend for the relocation. + */ + Addr GetAddend(void *base) const + { + return r_addend; + } +}; + +} /* namespace Elf */ + +#endif /* Elfxx_h */ From 1d45c60f19ad7b9405cc7084de68453beb0a535c Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Wed, 25 Apr 2012 09:09:08 +0200 Subject: [PATCH 179/182] Bug 747870 - Properly align XPCLazyCallContext::mData. r=bholley --- js/xpconnect/src/xpcprivate.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/js/xpconnect/src/xpcprivate.h b/js/xpconnect/src/xpcprivate.h index 8a86ebf2c7c..b576bbdfb52 100644 --- a/js/xpconnect/src/xpcprivate.h +++ b/js/xpconnect/src/xpcprivate.h @@ -1310,12 +1310,13 @@ public: XPCCallContext &GetXPCCallContext() { if (!mCcx) { + XPCCallContext *data = mData.addr(); mCcxToDestroy = mCcx = - new (mData) XPCCallContext(mCallerLanguage, mCx, - mCallBeginRequest == CALL_BEGINREQUEST, - mObj, - mFlattenedJSObject, mWrapper, - mTearOff); + new (data) XPCCallContext(mCallerLanguage, mCx, + mCallBeginRequest == CALL_BEGINREQUEST, + mObj, + mFlattenedJSObject, mWrapper, + mTearOff); if (!mCcx->IsValid()) { NS_ERROR("This is not supposed to fail!"); } @@ -1343,7 +1344,7 @@ private: JSObject *mFlattenedJSObject; XPCWrappedNative *mWrapper; XPCWrappedNativeTearOff *mTearOff; - char mData[sizeof(XPCCallContext)]; + mozilla::AlignedStorage2 mData; }; /*************************************************************************** From e2fc1d05c80580f656ce708896315fd4b5e06798 Mon Sep 17 00:00:00 2001 From: Ed Morley Date: Wed, 25 Apr 2012 09:54:34 +0100 Subject: [PATCH 180/182] Backout afab1aaf6704 & 0405d42629fd (bug 747197), 0379525bbdca (bug 746262), 91b9cba098f8 (bug 745944), 8535dc5b590a (bug 741040) for win debug bustage --- js/src/frontend/FoldConstants.cpp | 21 ++- js/src/jsapi.cpp | 7 +- js/src/jsarray.cpp | 3 +- js/src/jsclone.cpp | 4 +- js/src/jsdate.cpp | 27 ++- js/src/jsdate.h | 29 +-- js/src/jsgc.cpp | 8 +- js/src/jsgc.h | 2 +- js/src/jsnum.cpp | 5 +- js/src/jsnum.h | 273 +++++++++++++++++++++++++++- js/src/jsnuminlines.h | 3 +- js/src/jsobj.cpp | 193 +++++++++++--------- js/src/jsobjinlines.h | 22 +++ js/src/jsproxy.cpp | 6 +- js/src/jsstr.cpp | 5 +- js/src/jstypedarray.cpp | 9 +- js/src/jstypedarray.h | 4 +- js/src/methodjit/FastOps.cpp | 17 +- js/src/methodjit/PunboxAssembler.h | 11 +- js/src/methodjit/StubCalls.cpp | 4 +- js/src/methodjit/TypedArrayIC.h | 5 +- js/src/vm/Debugger.cpp | 74 +++++--- js/src/vm/NumericConversions.h | 281 ----------------------------- js/src/vm/ObjectImpl.cpp | 135 +------------- js/src/vm/ObjectImpl.h | 107 +++-------- js/src/vm/Xdr.h | 49 ++--- 26 files changed, 563 insertions(+), 741 deletions(-) delete mode 100644 js/src/vm/NumericConversions.h diff --git a/js/src/frontend/FoldConstants.cpp b/js/src/frontend/FoldConstants.cpp index f397cbdbbf5..ba7d9b7c5b5 100644 --- a/js/src/frontend/FoldConstants.cpp +++ b/js/src/frontend/FoldConstants.cpp @@ -40,16 +40,17 @@ #include "mozilla/FloatingPoint.h" +#include "frontend/FoldConstants.h" + #include "jslibmath.h" + +#include "frontend/BytecodeEmitter.h" +#include "frontend/ParseNode.h" + #if JS_HAS_XML_SUPPORT #include "jsxml.h" #endif -#include "frontend/BytecodeEmitter.h" -#include "frontend/FoldConstants.h" -#include "frontend/ParseNode.h" -#include "vm/NumericConversions.h" - #include "jsatominlines.h" #include "vm/String-inl.h" @@ -156,16 +157,16 @@ FoldBinaryNumeric(JSContext *cx, JSOp op, ParseNode *pn1, ParseNode *pn2, switch (op) { case JSOP_LSH: case JSOP_RSH: - i = ToInt32(d); - j = ToInt32(d2); + i = js_DoubleToECMAInt32(d); + j = js_DoubleToECMAInt32(d2); j &= 31; d = (op == JSOP_LSH) ? i << j : i >> j; break; case JSOP_URSH: - j = ToInt32(d2); + j = js_DoubleToECMAInt32(d2); j &= 31; - d = ToUint32(d) >> j; + d = js_DoubleToECMAUint32(d) >> j; break; case JSOP_ADD: @@ -827,7 +828,7 @@ js::FoldConstants(JSContext *cx, ParseNode *pn, TreeContext *tc, bool inCond) d = pn1->pn_dval; switch (pn->getOp()) { case JSOP_BITNOT: - d = ~ToInt32(d); + d = ~js_DoubleToECMAInt32(d); break; case JSOP_NEG: diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index 49d9e1f2460..7f0b5687228 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -95,7 +95,6 @@ #include "js/MemoryMetrics.h" #include "yarr/BumpPointerAllocator.h" #include "vm/MethodGuard.h" -#include "vm/NumericConversions.h" #include "vm/StringBuffer.h" #include "vm/Xdr.h" @@ -346,7 +345,7 @@ JS_ConvertArgumentsVA(JSContext *cx, unsigned argc, jsval *argv, const char *for case 'I': if (!JS_ValueToNumber(cx, *sp, &d)) return JS_FALSE; - *va_arg(ap, double *) = ToInteger(d); + *va_arg(ap, double *) = js_DoubleToInteger(d); break; case 'S': case 'W': @@ -557,13 +556,13 @@ JS_DoubleIsInt32(double d, int32_t *ip) JS_PUBLIC_API(int32_t) JS_DoubleToInt32(double d) { - return ToInt32(d); + return js_DoubleToECMAInt32(d); } JS_PUBLIC_API(uint32_t) JS_DoubleToUint32(double d) { - return ToUint32(d); + return js_DoubleToECMAUint32(d); } JS_PUBLIC_API(JSBool) diff --git a/js/src/jsarray.cpp b/js/src/jsarray.cpp index 7b6c4d5a842..a14e17c025f 100644 --- a/js/src/jsarray.cpp +++ b/js/src/jsarray.cpp @@ -129,7 +129,6 @@ #include "vm/ArgumentsObject.h" #include "vm/MethodGuard.h" -#include "vm/NumericConversions.h" #include "vm/StringBuffer.h" #include "ds/Sort.h" @@ -3710,7 +3709,7 @@ js_Array(JSContext *cx, unsigned argc, Value *vp) length = uint32_t(i); } else { double d = args[0].toDouble(); - length = ToUint32(d); + length = js_DoubleToECMAUint32(d); if (d != double(length)) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_ARRAY_LENGTH); return false; diff --git a/js/src/jsclone.cpp b/js/src/jsclone.cpp index 3bd33dd43e4..865c44c4c59 100644 --- a/js/src/jsclone.cpp +++ b/js/src/jsclone.cpp @@ -36,8 +36,6 @@ * * ***** END LICENSE BLOCK ***** */ -#include "mozilla/FloatingPoint.h" - #include "jsclone.h" #include "jsdate.h" #include "jstypedarray.h" @@ -837,7 +835,7 @@ JSStructuredCloneReader::startRead(Value *vp) double d; if (!in.readDouble(&d) || !checkDouble(d)) return false; - if (!MOZ_DOUBLE_IS_NaN(d) && d != TimeClip(d)) { + if (d == d && d != TIMECLIP(d)) { JS_ReportErrorNumber(context(), js_GetErrorMessage, NULL, JSMSG_SC_BAD_SERIALIZED_DATA, "date"); return false; diff --git a/js/src/jsdate.cpp b/js/src/jsdate.cpp index 678c3bb2d14..1a30deadc28 100644 --- a/js/src/jsdate.cpp +++ b/js/src/jsdate.cpp @@ -75,7 +75,6 @@ #include "jslibmath.h" #include "vm/GlobalObject.h" -#include "vm/NumericConversions.h" #include "vm/StringBuffer.h" #include "jsinferinlines.h" @@ -615,7 +614,7 @@ date_msecFromArgs(JSContext *cx, CallArgs args, double *rval) *rval = js_NaN; return JS_TRUE; } - array[loop] = ToInteger(d); + array[loop] = js_DoubleToInteger(d); } else { if (loop == 2) { array[loop] = 1; /* Default the date argument to 1. */ @@ -647,7 +646,7 @@ date_UTC(JSContext *cx, unsigned argc, Value *vp) if (!date_msecFromArgs(cx, args, &msec_time)) return JS_FALSE; - msec_time = TimeClip(msec_time); + msec_time = TIMECLIP(msec_time); args.rval().setNumber(msec_time); return JS_TRUE; @@ -1206,7 +1205,7 @@ date_parse(JSContext *cx, unsigned argc, Value *vp) return true; } - result = TimeClip(result); + result = TIMECLIP(result); vp->setNumber(result); return true; } @@ -1747,7 +1746,7 @@ date_setTime(JSContext *cx, unsigned argc, Value *vp) if (!ToNumber(cx, args[0], &result)) return false; - return SetUTCTime(cx, obj, TimeClip(result), &args.rval()); + return SetUTCTime(cx, obj, TIMECLIP(result), &args.rval()); } static JSBool @@ -1786,7 +1785,7 @@ date_makeTime(JSContext *cx, Native native, unsigned maxargs, JSBool local, unsi if (!MOZ_DOUBLE_IS_FINITE(nums[i])) { argIsNotFinite = true; } else { - nums[i] = ToInteger(nums[i]); + nums[i] = js_DoubleToInteger(nums[i]); } } @@ -1843,7 +1842,7 @@ date_makeTime(JSContext *cx, Native native, unsigned maxargs, JSBool local, unsi if (local) result = UTC(result, cx); - return SetUTCTime(cx, obj, TimeClip(result), &args.rval()); + return SetUTCTime(cx, obj, TIMECLIP(result), &args.rval()); } static JSBool @@ -1922,7 +1921,7 @@ date_makeDate(JSContext *cx, Native native, unsigned maxargs, JSBool local, unsi if (!MOZ_DOUBLE_IS_FINITE(nums[i])) { argIsNotFinite = true; } else { - nums[i] = ToInteger(nums[i]); + nums[i] = js_DoubleToInteger(nums[i]); } } @@ -1973,7 +1972,7 @@ date_makeDate(JSContext *cx, Native native, unsigned maxargs, JSBool local, unsi if (local) result = UTC(result, cx); - return SetUTCTime(cx, obj, TimeClip(result), &args.rval()); + return SetUTCTime(cx, obj, TIMECLIP(result), &args.rval()); } static JSBool @@ -2037,7 +2036,7 @@ date_setYear(JSContext *cx, unsigned argc, Value *vp) SetDateToNaN(cx, obj, &args.rval()); return true; } - year = ToInteger(year); + year = js_DoubleToInteger(year); if (year >= 0 && year <= 99) year += 1900; @@ -2046,7 +2045,7 @@ date_setYear(JSContext *cx, unsigned argc, Value *vp) result = MakeDate(day, TimeWithinDay(t)); result = UTC(result, cx); - return SetUTCTime(cx, obj, TimeClip(result), &args.rval()); + return SetUTCTime(cx, obj, TIMECLIP(result), &args.rval()); } /* constants for toString, toUTCString */ @@ -2623,7 +2622,7 @@ js_Date(JSContext *cx, unsigned argc, Value *vp) /* the argument is a millisecond number */ if (!ToNumber(cx, args[0], &d)) return false; - d = TimeClip(d); + d = TIMECLIP(d); } else { /* the argument is a string; parse it. */ JSString *str = ToString(cx, args[0]); @@ -2637,7 +2636,7 @@ js_Date(JSContext *cx, unsigned argc, Value *vp) if (!date_parseString(linearStr, &d, cx)) d = js_NaN; else - d = TimeClip(d); + d = TIMECLIP(d); } } else { double msec_time; @@ -2646,7 +2645,7 @@ js_Date(JSContext *cx, unsigned argc, Value *vp) if (MOZ_DOUBLE_IS_FINITE(msec_time)) { msec_time = UTC(msec_time, cx); - msec_time = TimeClip(msec_time); + msec_time = TIMECLIP(msec_time); } d = msec_time; } diff --git a/js/src/jsdate.h b/js/src/jsdate.h index 39309f9b978..b891a96e178 100644 --- a/js/src/jsdate.h +++ b/js/src/jsdate.h @@ -46,32 +46,13 @@ #include "mozilla/FloatingPoint.h" -#include +#include "jscntxt.h" -#include "jstypes.h" +#define HalfTimeDomain 8.64e15 -#include "vm/NumericConversions.h" - -extern "C" { -struct JSObject; -struct JSContext; -} - -namespace js { - -/* ES5 15.9.1.14. */ -inline double -TimeClip(double time) -{ - /* Steps 1-2. */ - if (!MOZ_DOUBLE_IS_FINITE(time) || abs(time) > 8.64e15) - return js_NaN; - - /* Step 3. */ - return ToInteger(time + (+0.0)); -} - -} /* namespace js */ +#define TIMECLIP(d) ((MOZ_DOUBLE_IS_FINITE(d) \ + && !((d < 0 ? -d : d) > HalfTimeDomain)) \ + ? js_DoubleToInteger(d + (+0.)) : js_NaN) extern JSObject * js_InitDateClass(JSContext *cx, JSObject *obj); diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp index 873419c3ec5..4d955c02e51 100644 --- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -2140,10 +2140,10 @@ AutoGCRooter::trace(JSTracer *trc) static_cast(this)->descriptors; for (size_t i = 0, len = descriptors.length(); i < len; i++) { PropDesc &desc = descriptors[i]; - MarkValueRoot(trc, &desc.pd_, "PropDesc::pd_"); - MarkValueRoot(trc, &desc.value_, "PropDesc::value_"); - MarkValueRoot(trc, &desc.get_, "PropDesc::get_"); - MarkValueRoot(trc, &desc.set_, "PropDesc::set_"); + MarkValueRoot(trc, &desc.pd, "PropDesc::pd"); + MarkValueRoot(trc, &desc.value, "PropDesc::value"); + MarkValueRoot(trc, &desc.get, "PropDesc::get"); + MarkValueRoot(trc, &desc.set, "PropDesc::set"); } return; } diff --git a/js/src/jsgc.h b/js/src/jsgc.h index 43e072eb517..89fa885687e 100644 --- a/js/src/jsgc.h +++ b/js/src/jsgc.h @@ -64,7 +64,7 @@ struct JSCompartment; -extern void +extern "C" void js_TraceXML(JSTracer *trc, JSXML* thing); #if JS_STACK_GROWTH_DIRECTION > 0 diff --git a/js/src/jsnum.cpp b/js/src/jsnum.cpp index a9ceba1a8d6..db72988b5e2 100644 --- a/js/src/jsnum.cpp +++ b/js/src/jsnum.cpp @@ -79,7 +79,6 @@ #include "vm/GlobalObject.h" #include "vm/MethodGuard.h" -#include "vm/NumericConversions.h" #include "vm/StringBuffer.h" #include "jsatominlines.h" @@ -1275,7 +1274,7 @@ ToInt32Slow(JSContext *cx, const Value &v, int32_t *out) if (!ToNumberSlow(cx, v, &d)) return false; } - *out = ToInt32(d); + *out = js_DoubleToECMAInt32(d); return true; } @@ -1290,7 +1289,7 @@ ToUint32Slow(JSContext *cx, const Value &v, uint32_t *out) if (!ToNumberSlow(cx, v, &d)) return false; } - *out = ToUint32(d); + *out = js_DoubleToECMAUint32(d); return true; } diff --git a/js/src/jsnum.h b/js/src/jsnum.h index 3ad946c1eac..0d424f8bc1a 100644 --- a/js/src/jsnum.h +++ b/js/src/jsnum.h @@ -46,8 +46,6 @@ #include "jsobj.h" -#include "vm/NumericConversions.h" - extern double js_NaN; extern double js_PositiveInfinity; extern double js_NegativeInfinity; @@ -223,6 +221,275 @@ num_parseInt(JSContext *cx, unsigned argc, Value *vp); } /* namespace js */ +union jsdpun { + struct { +#if defined(IS_LITTLE_ENDIAN) && !defined(FPU_IS_ARM_FPA) + uint32_t lo, hi; +#else + uint32_t hi, lo; +#endif + } s; + uint64_t u64; + double d; +}; + +/* + * Specialized ToInt32 and ToUint32 converters for doubles. + */ +/* + * From the ES3 spec, 9.5 + * 2. If Result(1) is NaN, +0, -0, +Inf, or -Inf, return +0. + * 3. Compute sign(Result(1)) * floor(abs(Result(1))). + * 4. Compute Result(3) modulo 2^32; that is, a finite integer value k of Number + * type with positive sign and less than 2^32 in magnitude such the mathematical + * difference of Result(3) and k is mathematically an integer multiple of 2^32. + * 5. If Result(4) is greater than or equal to 2^31, return Result(4)- 2^32, + * otherwise return Result(4). + */ +static inline int32_t +js_DoubleToECMAInt32(double d) +{ +#if defined(__i386__) || defined(__i386) || defined(__x86_64__) || \ + defined(_M_IX86) || defined(_M_X64) + jsdpun du, duh, two32; + uint32_t di_h, u_tmp, expon, shift_amount; + int32_t mask32; + + /* + * Algorithm Outline + * Step 1. If d is NaN, +/-Inf or |d|>=2^84 or |d|<1, then return 0 + * All of this is implemented based on an exponent comparison. + * Step 2. If |d|<2^31, then return (int)d + * The cast to integer (conversion in RZ mode) returns the correct result. + * Step 3. If |d|>=2^32, d:=fmod(d, 2^32) is taken -- but without a call + * Step 4. If |d|>=2^31, then the fractional bits are cleared before + * applying the correction by 2^32: d - sign(d)*2^32 + * Step 5. Return (int)d + */ + + du.d = d; + di_h = du.s.hi; + + u_tmp = (di_h & 0x7ff00000) - 0x3ff00000; + if (u_tmp >= (0x45300000-0x3ff00000)) { + // d is Nan, +/-Inf or +/-0, or |d|>=2^(32+52) or |d|<1, in which case result=0 + return 0; + } + + if (u_tmp < 0x01f00000) { + // |d|<2^31 + return int32_t(d); + } + + if (u_tmp > 0x01f00000) { + // |d|>=2^32 + expon = u_tmp >> 20; + shift_amount = expon - 21; + duh.u64 = du.u64; + mask32 = 0x80000000; + if (shift_amount < 32) { + mask32 >>= shift_amount; + duh.s.hi = du.s.hi & mask32; + duh.s.lo = 0; + } else { + mask32 >>= (shift_amount-32); + duh.s.hi = du.s.hi; + duh.s.lo = du.s.lo & mask32; + } + du.d -= duh.d; + } + + di_h = du.s.hi; + + // eliminate fractional bits + u_tmp = (di_h & 0x7ff00000); + if (u_tmp >= 0x41e00000) { + // |d|>=2^31 + expon = u_tmp >> 20; + shift_amount = expon - (0x3ff - 11); + mask32 = 0x80000000; + if (shift_amount < 32) { + mask32 >>= shift_amount; + du.s.hi &= mask32; + du.s.lo = 0; + } else { + mask32 >>= (shift_amount-32); + du.s.lo &= mask32; + } + two32.s.hi = 0x41f00000 ^ (du.s.hi & 0x80000000); + two32.s.lo = 0; + du.d -= two32.d; + } + + return int32_t(du.d); +#elif defined (__arm__) && defined (__GNUC__) + int32_t i; + uint32_t tmp0; + uint32_t tmp1; + uint32_t tmp2; + asm ( + // We use a pure integer solution here. In the 'softfp' ABI, the argument + // will start in r0 and r1, and VFP can't do all of the necessary ECMA + // conversions by itself so some integer code will be required anyway. A + // hybrid solution is faster on A9, but this pure integer solution is + // notably faster for A8. + + // %0 is the result register, and may alias either of the %[QR]1 registers. + // %Q4 holds the lower part of the mantissa. + // %R4 holds the sign, exponent, and the upper part of the mantissa. + // %1, %2 and %3 are used as temporary values. + + // Extract the exponent. +" mov %1, %R4, LSR #20\n" +" bic %1, %1, #(1 << 11)\n" // Clear the sign. + + // Set the implicit top bit of the mantissa. This clobbers a bit of the + // exponent, but we have already extracted that. +" orr %R4, %R4, #(1 << 20)\n" + + // Special Cases + // We should return zero in the following special cases: + // - Exponent is 0x000 - 1023: +/-0 or subnormal. + // - Exponent is 0x7ff - 1023: +/-INFINITY or NaN + // - This case is implicitly handled by the standard code path anyway, + // as shifting the mantissa up by the exponent will result in '0'. + // + // The result is composed of the mantissa, prepended with '1' and + // bit-shifted left by the (decoded) exponent. Note that because the r1[20] + // is the bit with value '1', r1 is effectively already shifted (left) by + // 20 bits, and r0 is already shifted by 52 bits. + + // Adjust the exponent to remove the encoding offset. If the decoded + // exponent is negative, quickly bail out with '0' as such values round to + // zero anyway. This also catches +/-0 and subnormals. +" sub %1, %1, #0xff\n" +" subs %1, %1, #0x300\n" +" bmi 8f\n" + + // %1 = (decoded) exponent >= 0 + // %R4 = upper mantissa and sign + + // ---- Lower Mantissa ---- +" subs %3, %1, #52\n" // Calculate exp-52 +" bmi 1f\n" + + // Shift r0 left by exp-52. + // Ensure that we don't overflow ARM's 8-bit shift operand range. + // We need to handle anything up to an 11-bit value here as we know that + // 52 <= exp <= 1024 (0x400). Any shift beyond 31 bits results in zero + // anyway, so as long as we don't touch the bottom 5 bits, we can use + // a logical OR to push long shifts into the 32 <= (exp&0xff) <= 255 range. +" bic %2, %3, #0xff\n" +" orr %3, %3, %2, LSR #3\n" + // We can now perform a straight shift, avoiding the need for any + // conditional instructions or extra branches. +" mov %Q4, %Q4, LSL %3\n" +" b 2f\n" +"1:\n" // Shift r0 right by 52-exp. + // We know that 0 <= exp < 52, and we can shift up to 255 bits so 52-exp + // will always be a valid shift and we can sk%3 the range check for this case. +" rsb %3, %1, #52\n" +" mov %Q4, %Q4, LSR %3\n" + + // %1 = (decoded) exponent + // %R4 = upper mantissa and sign + // %Q4 = partially-converted integer + +"2:\n" + // ---- Upper Mantissa ---- + // This is much the same as the lower mantissa, with a few different + // boundary checks and some masking to hide the exponent & sign bit in the + // upper word. + // Note that the upper mantissa is pre-shifted by 20 in %R4, but we shift + // it left more to remove the sign and exponent so it is effectively + // pre-shifted by 31 bits. +" subs %3, %1, #31\n" // Calculate exp-31 +" mov %1, %R4, LSL #11\n" // Re-use %1 as a temporary register. +" bmi 3f\n" + + // Shift %R4 left by exp-31. + // Avoid overflowing the 8-bit shift range, as before. +" bic %2, %3, #0xff\n" +" orr %3, %3, %2, LSR #3\n" + // Perform the shift. +" mov %2, %1, LSL %3\n" +" b 4f\n" +"3:\n" // Shift r1 right by 31-exp. + // We know that 0 <= exp < 31, and we can shift up to 255 bits so 31-exp + // will always be a valid shift and we can skip the range check for this case. +" rsb %3, %3, #0\n" // Calculate 31-exp from -(exp-31) +" mov %2, %1, LSR %3\n" // Thumb-2 can't do "LSR %3" in "orr". + + // %Q4 = partially-converted integer (lower) + // %R4 = upper mantissa and sign + // %2 = partially-converted integer (upper) + +"4:\n" + // Combine the converted parts. +" orr %Q4, %Q4, %2\n" + // Negate the result if we have to, and move it to %0 in the process. To + // avoid conditionals, we can do this by inverting on %R4[31], then adding + // %R4[31]>>31. +" eor %Q4, %Q4, %R4, ASR #31\n" +" add %0, %Q4, %R4, LSR #31\n" +" b 9f\n" +"8:\n" + // +/-INFINITY, +/-0, subnormals, NaNs, and anything else out-of-range that + // will result in a conversion of '0'. +" mov %0, #0\n" +"9:\n" + : "=r" (i), "=&r" (tmp0), "=&r" (tmp1), "=&r" (tmp2) + : "r" (d) + : "cc" + ); + return i; +#else + int32_t i; + double two32, two31; + + if (!MOZ_DOUBLE_IS_FINITE(d)) + return 0; + + i = (int32_t) d; + if ((double) i == d) + return i; + + two32 = 4294967296.0; + two31 = 2147483648.0; + d = fmod(d, two32); + d = (d >= 0) ? floor(d) : ceil(d) + two32; + return (int32_t) (d >= two31 ? d - two32 : d); +#endif +} + +inline uint32_t +js_DoubleToECMAUint32(double d) +{ + return uint32_t(js_DoubleToECMAInt32(d)); +} + +/* + * Convert a double to an integral number, stored in a double. + * If d is NaN, return 0. If d is an infinity, return it without conversion. + */ +static inline double +js_DoubleToInteger(double d) +{ + if (d == 0) + return d; + + if (!MOZ_DOUBLE_IS_FINITE(d)) { + if (MOZ_DOUBLE_IS_NaN(d)) + return 0; + return d; + } + + JSBool neg = (d < 0); + d = floor(neg ? -d : d); + + return neg ? -d : d; +} + /* * Similar to strtod except that it replaces overflows with infinities of the * correct sign, and underflows with zeros of the correct sign. Guaranteed to @@ -293,7 +560,7 @@ ToInteger(JSContext *cx, const js::Value &v, double *dp) if (!ToNumberSlow(cx, v, dp)) return false; } - *dp = ToInteger(*dp); + *dp = js_DoubleToInteger(*dp); return true; } diff --git a/js/src/jsnuminlines.h b/js/src/jsnuminlines.h index e438743643c..169fb022cbb 100644 --- a/js/src/jsnuminlines.h +++ b/js/src/jsnuminlines.h @@ -40,7 +40,6 @@ #ifndef jsnuminlines_h___ #define jsnuminlines_h___ -#include "vm/NumericConversions.h" #include "vm/Unicode.h" #include "jsstrinlines.h" @@ -52,7 +51,7 @@ template struct NumberTraits { }; template<> struct NumberTraits { static JS_ALWAYS_INLINE int32_t NaN() { return 0; } static JS_ALWAYS_INLINE int32_t toSelfType(int32_t i) { return i; } - static JS_ALWAYS_INLINE int32_t toSelfType(double d) { return ToUint32(d); } + static JS_ALWAYS_INLINE int32_t toSelfType(double d) { return js_DoubleToECMAUint32(d); } }; template<> struct NumberTraits { static JS_ALWAYS_INLINE double NaN() { return js_NaN; } diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index 53197137646..062bfe78219 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -1522,72 +1522,69 @@ NewPropertyDescriptorObject(JSContext *cx, const PropertyDescriptor *desc, Value d.initFromPropertyDescriptor(*desc); if (!d.makeObject(cx)) return false; - *vp = d.pd(); + *vp = d.pd; return true; } void PropDesc::initFromPropertyDescriptor(const PropertyDescriptor &desc) { - isUndefined_ = false; - pd_.setUndefined(); + pd.setUndefined(); attrs = uint8_t(desc.attrs); JS_ASSERT_IF(attrs & JSPROP_READONLY, !(attrs & (JSPROP_GETTER | JSPROP_SETTER))); if (desc.attrs & (JSPROP_GETTER | JSPROP_SETTER)) { - hasGet_ = true; - get_ = ((desc.attrs & JSPROP_GETTER) && desc.getter) - ? CastAsObjectJsval(desc.getter) - : UndefinedValue(); - hasSet_ = true; - set_ = ((desc.attrs & JSPROP_SETTER) && desc.setter) - ? CastAsObjectJsval(desc.setter) - : UndefinedValue(); - hasValue_ = false; - value_.setUndefined(); - hasWritable_ = false; + hasGet = true; + get = ((desc.attrs & JSPROP_GETTER) && desc.getter) + ? CastAsObjectJsval(desc.getter) + : UndefinedValue(); + hasSet = true; + set = ((desc.attrs & JSPROP_SETTER) && desc.setter) + ? CastAsObjectJsval(desc.setter) + : UndefinedValue(); + hasValue = false; + value.setUndefined(); + hasWritable = false; } else { - hasGet_ = false; - get_.setUndefined(); - hasSet_ = false; - set_.setUndefined(); - hasValue_ = true; - value_ = desc.value; - hasWritable_ = true; + hasGet = false; + get.setUndefined(); + hasSet = false; + set.setUndefined(); + hasValue = true; + value = desc.value; + hasWritable = true; } - hasEnumerable_ = true; - hasConfigurable_ = true; + hasEnumerable = true; + hasConfigurable = true; } bool PropDesc::makeObject(JSContext *cx) { - MOZ_ASSERT(!isUndefined()); - JSObject *obj = NewBuiltinClassInstance(cx, &ObjectClass); if (!obj) return false; const JSAtomState &atomState = cx->runtime->atomState; - if ((hasConfigurable() && + if ((hasConfigurable && !obj->defineProperty(cx, atomState.configurableAtom, BooleanValue((attrs & JSPROP_PERMANENT) == 0))) || - (hasEnumerable() && + (hasEnumerable && !obj->defineProperty(cx, atomState.enumerableAtom, BooleanValue((attrs & JSPROP_ENUMERATE) != 0))) || - (hasGet() && - !obj->defineProperty(cx, atomState.getAtom, getterValue())) || - (hasSet() && - !obj->defineProperty(cx, atomState.setAtom, setterValue())) || - (hasValue() && - !obj->defineProperty(cx, atomState.valueAtom, value())) || - (hasWritable() && + (hasGet && + !obj->defineProperty(cx, atomState.getAtom, get)) || + (hasSet && + !obj->defineProperty(cx, atomState.setAtom, set)) || + (hasValue && + !obj->defineProperty(cx, atomState.valueAtom, value)) || + (hasWritable && !obj->defineProperty(cx, atomState.writableAtom, BooleanValue((attrs & JSPROP_READONLY) == 0)))) { return false; } - pd_.setObject(*obj); + pd.setObject(*obj); return true; } @@ -1731,6 +1728,21 @@ HasProperty(JSContext *cx, JSObject *obj, jsid id, Value *vp, bool *foundp) return !!obj->getGeneric(cx, id, vp); } +PropDesc::PropDesc() + : pd(UndefinedValue()), + value(UndefinedValue()), + get(UndefinedValue()), + set(UndefinedValue()), + attrs(0), + hasGet(false), + hasSet(false), + hasValue(false), + hasWritable(false), + hasEnumerable(false), + hasConfigurable(false) +{ +} + bool PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) { @@ -1744,14 +1756,9 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) JSObject *desc = &v.toObject(); /* Make a copy of the descriptor. We might need it later. */ - pd_ = v; + pd = v; - isUndefined_ = false; - - /* - * Start with the proper defaults. XXX shouldn't be necessary when we get - * rid of PropDesc::attributes() - */ + /* Start with the proper defaults. */ attrs = JSPROP_PERMANENT | JSPROP_READONLY; bool found; @@ -1763,7 +1770,7 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) if (!HasProperty(cx, desc, ATOM_TO_JSID(cx->runtime->atomState.enumerableAtom), &v, &found)) return false; if (found) { - hasEnumerable_ = true; + hasEnumerable = JS_TRUE; if (js_ValueToBoolean(v)) attrs |= JSPROP_ENUMERATE; } @@ -1772,7 +1779,7 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) if (!HasProperty(cx, desc, ATOM_TO_JSID(cx->runtime->atomState.configurableAtom), &v, &found)) return false; if (found) { - hasConfigurable_ = true; + hasConfigurable = JS_TRUE; if (js_ValueToBoolean(v)) attrs &= ~JSPROP_PERMANENT; } @@ -1781,15 +1788,15 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) if (!HasProperty(cx, desc, ATOM_TO_JSID(cx->runtime->atomState.valueAtom), &v, &found)) return false; if (found) { - hasValue_ = true; - value_ = v; + hasValue = true; + value = v; } /* 8.10.6 step 6 */ if (!HasProperty(cx, desc, ATOM_TO_JSID(cx->runtime->atomState.writableAtom), &v, &found)) return false; if (found) { - hasWritable_ = true; + hasWritable = JS_TRUE; if (js_ValueToBoolean(v)) attrs &= ~JSPROP_READONLY; } @@ -1798,8 +1805,8 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) if (!HasProperty(cx, desc, ATOM_TO_JSID(cx->runtime->atomState.getAtom), &v, &found)) return false; if (found) { - hasGet_ = true; - get_ = v; + hasGet = true; + get = v; attrs |= JSPROP_GETTER | JSPROP_SHARED; attrs &= ~JSPROP_READONLY; if (checkAccessors && !checkGetter(cx)) @@ -1810,8 +1817,8 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) if (!HasProperty(cx, desc, ATOM_TO_JSID(cx->runtime->atomState.setAtom), &v, &found)) return false; if (found) { - hasSet_ = true; - set_ = v; + hasSet = true; + set = v; attrs |= JSPROP_SETTER | JSPROP_SHARED; attrs &= ~JSPROP_READONLY; if (checkAccessors && !checkSetter(cx)) @@ -1819,7 +1826,7 @@ PropDesc::initialize(JSContext *cx, const Value &origval, bool checkAccessors) } /* 8.10.7 step 9 */ - if ((hasGet() || hasSet()) && (hasValue() || hasWritable())) { + if ((hasGet || hasSet) && (hasValue || hasWritable)) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_INVALID_DESCRIPTOR); return false; } @@ -1904,10 +1911,8 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD if (desc.isGenericDescriptor() || desc.isDataDescriptor()) { JS_ASSERT(!obj->getOps()->defineProperty); - Value v = desc.hasValue() ? desc.value() : UndefinedValue(); - return js_DefineProperty(cx, obj, id, &v, - JS_PropertyStub, JS_StrictPropertyStub, - desc.attributes()); + return js_DefineProperty(cx, obj, id, &desc.value, + JS_PropertyStub, JS_StrictPropertyStub, desc.attrs); } JS_ASSERT(desc.isAccessorDescriptor()); @@ -1923,7 +1928,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD Value tmp = UndefinedValue(); return js_DefineProperty(cx, obj, id, &tmp, - desc.getter(), desc.setter(), desc.attributes()); + desc.getter(), desc.setter(), desc.attrs); } /* 8.12.9 steps 5-6 (note 5 is merely a special case of 6). */ @@ -1937,7 +1942,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD if (!shape->isAccessorDescriptor()) break; - if (desc.hasGet()) { + if (desc.hasGet) { bool same; if (!SameValue(cx, desc.getterValue(), shape->getterOrUndefined(), &same)) return false; @@ -1945,7 +1950,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD break; } - if (desc.hasSet()) { + if (desc.hasSet) { bool same; if (!SameValue(cx, desc.setterValue(), shape->setterOrUndefined(), &same)) return false; @@ -1974,7 +1979,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD if (!shape->configurable() && (!shape->hasDefaultGetter() || !shape->hasDefaultSetter()) && desc.isDataDescriptor() && - (desc.hasWritable() ? desc.writable() : shape->writable())) + (desc.hasWritable ? desc.writable() : shape->writable())) { return Reject(cx, JSMSG_CANT_REDEFINE_PROP, throwError, id, rval); } @@ -1988,8 +1993,8 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD break; bool same; - if (desc.hasValue()) { - if (!SameValue(cx, desc.value(), v, &same)) + if (desc.hasValue) { + if (!SameValue(cx, desc.value, v, &same)) return false; if (!same) { /* @@ -2016,7 +2021,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD break; } } - if (desc.hasWritable() && desc.writable() != shape->writable()) + if (desc.hasWritable && desc.writable() != shape->writable()) break; } else { /* The only fields in desc will be handled below. */ @@ -2024,20 +2029,28 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD } } - if (desc.hasConfigurable() && desc.configurable() != shape->configurable()) + if (desc.hasConfigurable && desc.configurable() != shape->configurable()) break; - if (desc.hasEnumerable() && desc.enumerable() != shape->enumerable()) + if (desc.hasEnumerable && desc.enumerable() != shape->enumerable()) break; /* The conditions imposed by step 5 or step 6 apply. */ *rval = true; - return true; + return JS_TRUE; } while (0); /* 8.12.9 step 7. */ if (!shape->configurable()) { - if ((desc.hasConfigurable() && desc.configurable()) || - (desc.hasEnumerable() && desc.enumerable() != shape->enumerable())) { + /* + * Since [[Configurable]] defaults to false, we don't need to check + * whether it was specified. We can't do likewise for [[Enumerable]] + * because its putative value is used in a comparison -- a comparison + * whose result must always be false per spec if the [[Enumerable]] + * field is not present. Perfectly pellucid logic, eh? + */ + JS_ASSERT_IF(!desc.hasConfigurable, !desc.configurable()); + if (desc.configurable() || + (desc.hasEnumerable && desc.enumerable() != shape->enumerable())) { return Reject(cx, JSMSG_CANT_REDEFINE_PROP, throwError, id, rval); } } @@ -2054,11 +2067,11 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD /* 8.12.9 step 10. */ JS_ASSERT(shape->isDataDescriptor()); if (!shape->configurable() && !shape->writable()) { - if (desc.hasWritable() && desc.writable()) + if (desc.hasWritable && desc.writable()) return Reject(cx, JSMSG_CANT_REDEFINE_PROP, throwError, id, rval); - if (desc.hasValue()) { + if (desc.hasValue) { bool same; - if (!SameValue(cx, desc.value(), v, &same)) + if (!SameValue(cx, desc.value, v, &same)) return false; if (!same) return Reject(cx, JSMSG_CANT_REDEFINE_PROP, throwError, id, rval); @@ -2070,7 +2083,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD /* 8.12.9 step 11. */ JS_ASSERT(desc.isAccessorDescriptor() && shape->isAccessorDescriptor()); if (!shape->configurable()) { - if (desc.hasSet()) { + if (desc.hasSet) { bool same; if (!SameValue(cx, desc.setterValue(), shape->setterOrUndefined(), &same)) return false; @@ -2078,7 +2091,7 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD return Reject(cx, JSMSG_CANT_REDEFINE_PROP, throwError, id, rval); } - if (desc.hasGet()) { + if (desc.hasGet) { bool same; if (!SameValue(cx, desc.getterValue(), shape->getterOrUndefined(), &same)) return false; @@ -2094,27 +2107,27 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD StrictPropertyOp setter; if (desc.isGenericDescriptor()) { unsigned changed = 0; - if (desc.hasConfigurable()) + if (desc.hasConfigurable) changed |= JSPROP_PERMANENT; - if (desc.hasEnumerable()) + if (desc.hasEnumerable) changed |= JSPROP_ENUMERATE; - attrs = (shape->attributes() & ~changed) | (desc.attributes() & changed); + attrs = (shape->attributes() & ~changed) | (desc.attrs & changed); getter = shape->getter(); setter = shape->setter(); } else if (desc.isDataDescriptor()) { unsigned unchanged = 0; - if (!desc.hasConfigurable()) + if (!desc.hasConfigurable) unchanged |= JSPROP_PERMANENT; - if (!desc.hasEnumerable()) + if (!desc.hasEnumerable) unchanged |= JSPROP_ENUMERATE; /* Watch out for accessor -> data transformations here. */ - if (!desc.hasWritable() && shape->isDataDescriptor()) + if (!desc.hasWritable && shape->isDataDescriptor()) unchanged |= JSPROP_READONLY; - if (desc.hasValue()) - v = desc.value(); - attrs = (desc.attributes() & ~unchanged) | (shape->attributes() & unchanged); + if (desc.hasValue) + v = desc.value; + attrs = (desc.attrs & ~unchanged) | (shape->attributes() & unchanged); getter = JS_PropertyStub; setter = JS_StrictPropertyStub; } else { @@ -2130,24 +2143,24 @@ DefinePropertyOnObject(JSContext *cx, HandleObject obj, HandleId id, const PropD /* 8.12.9 step 12. */ unsigned changed = 0; - if (desc.hasConfigurable()) + if (desc.hasConfigurable) changed |= JSPROP_PERMANENT; - if (desc.hasEnumerable()) + if (desc.hasEnumerable) changed |= JSPROP_ENUMERATE; - if (desc.hasGet()) + if (desc.hasGet) changed |= JSPROP_GETTER | JSPROP_SHARED | JSPROP_READONLY; - if (desc.hasSet()) + if (desc.hasSet) changed |= JSPROP_SETTER | JSPROP_SHARED | JSPROP_READONLY; - attrs = (desc.attributes() & changed) | (shape->attributes() & ~changed); - if (desc.hasGet()) { + attrs = (desc.attrs & changed) | (shape->attributes() & ~changed); + if (desc.hasGet) { getter = desc.getter(); } else { getter = (shape->hasDefaultGetter() && !shape->hasGetterValue()) ? JS_PropertyStub : shape->getter(); } - if (desc.hasSet()) { + if (desc.hasSet) { setter = desc.setter(); } else { setter = (shape->hasDefaultSetter() && !shape->hasSetterValue()) @@ -2239,7 +2252,7 @@ DefineProperty(JSContext *cx, HandleObject obj, HandleId id, const PropDesc &des if (obj->getOps()->lookupGeneric) { if (obj->isProxy()) - return Proxy::defineProperty(cx, obj, id, desc.pd()); + return Proxy::defineProperty(cx, obj, id, desc.pd); return Reject(cx, obj, JSMSG_OBJECT_NOT_EXTENSIBLE, throwError, rval); } diff --git a/js/src/jsobjinlines.h b/js/src/jsobjinlines.h index bab8e86e29d..938e6cafac8 100644 --- a/js/src/jsobjinlines.h +++ b/js/src/jsobjinlines.h @@ -1651,6 +1651,28 @@ DefineConstructorAndPrototype(JSContext *cx, GlobalObject *global, return true; } +bool +PropDesc::checkGetter(JSContext *cx) +{ + if (hasGet && !js_IsCallable(get) && !get.isUndefined()) { + JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_GET_SET_FIELD, + js_getter_str); + return false; + } + return true; +} + +bool +PropDesc::checkSetter(JSContext *cx) +{ + if (hasSet && !js_IsCallable(set) && !set.isUndefined()) { + JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_GET_SET_FIELD, + js_setter_str); + return false; + } + return true; +} + inline bool ObjectClassIs(JSObject &obj, ESClassValue classValue, JSContext *cx) { diff --git a/js/src/jsproxy.cpp b/js/src/jsproxy.cpp index 1db444d561e..9cbea364171 100644 --- a/js/src/jsproxy.cpp +++ b/js/src/jsproxy.cpp @@ -466,9 +466,9 @@ ParsePropertyDescriptorObject(JSContext *cx, JSObject *obj, jsid id, const Value if (!d || !d->initialize(cx, v)) return false; desc->obj = obj; - desc->value = d->hasValue() ? d->value() : UndefinedValue(); - JS_ASSERT(!(d->attributes() & JSPROP_SHORTID)); - desc->attrs = d->attributes(); + desc->value = d->value; + JS_ASSERT(!(d->attrs & JSPROP_SHORTID)); + desc->attrs = d->attrs; desc->getter = d->getter(); desc->setter = d->setter(); desc->shortid = 0; diff --git a/js/src/jsstr.cpp b/js/src/jsstr.cpp index 202b972c04d..928a9031775 100644 --- a/js/src/jsstr.cpp +++ b/js/src/jsstr.cpp @@ -76,7 +76,6 @@ #include "builtin/RegExp.h" #include "vm/GlobalObject.h" -#include "vm/NumericConversions.h" #include "vm/RegExpObject.h" #include "vm/StringBuffer.h" @@ -1243,7 +1242,7 @@ str_lastIndexOf(JSContext *cx, unsigned argc, Value *vp) if (!ToNumber(cx, args[1], &d)) return false; if (!MOZ_DOUBLE_IS_NaN(d)) { - d = ToInteger(d); + d = js_DoubleToInteger(d); if (d <= 0) i = 0; else if (d < i) @@ -2604,7 +2603,7 @@ js::str_split(JSContext *cx, unsigned argc, Value *vp) double d; if (!ToNumber(cx, args[1], &d)) return false; - limit = ToUint32(d); + limit = js_DoubleToECMAUint32(d); } else { limit = UINT32_MAX; } diff --git a/js/src/jstypedarray.cpp b/js/src/jstypedarray.cpp index bef0f455038..ea44d7537e8 100644 --- a/js/src/jstypedarray.cpp +++ b/js/src/jstypedarray.cpp @@ -61,7 +61,6 @@ #include "jstypedarray.h" #include "vm/GlobalObject.h" -#include "vm/NumericConversions.h" #include "jsatominlines.h" #include "jsinferinlines.h" @@ -1187,7 +1186,7 @@ class TypedArrayTemplate setIndex(tarray, index, NativeType(d)); } else if (ArrayTypeIsUnsigned()) { JS_ASSERT(sizeof(NativeType) <= 4); - uint32_t n = ToUint32(d); + uint32_t n = js_DoubleToECMAUint32(d); setIndex(tarray, index, NativeType(n)); } else if (ArrayTypeID() == TypedArray::TYPE_UINT8_CLAMPED) { // The uint8_clamped type has a special rounding converter @@ -1195,7 +1194,7 @@ class TypedArrayTemplate setIndex(tarray, index, NativeType(d)); } else { JS_ASSERT(sizeof(NativeType) <= 4); - int32_t n = ToInt32(d); + int32_t n = js_DoubleToECMAInt32(d); setIndex(tarray, index, NativeType(n)); } @@ -1759,8 +1758,8 @@ class TypedArrayTemplate if (TypeIsFloatingPoint()) return NativeType(d); if (TypeIsUnsigned()) - return NativeType(ToUint32(d)); - return NativeType(ToInt32(d)); + return NativeType(js_DoubleToECMAUint32(d)); + return NativeType(js_DoubleToECMAInt32(d)); } static NativeType diff --git a/js/src/jstypedarray.h b/js/src/jstypedarray.h index 2874179b45d..e11a3289be6 100644 --- a/js/src/jstypedarray.h +++ b/js/src/jstypedarray.h @@ -57,9 +57,7 @@ namespace js { * explicitly and passed to an ArrayBufferView subclass, or can be created * implicitly by constructing a TypedArray with a size. */ -class ArrayBufferObject : public JSObject -{ - public: +struct ArrayBufferObject : public JSObject { static Class protoClass; static JSPropertySpec jsprops[]; static JSFunctionSpec jsfuncs[]; diff --git a/js/src/methodjit/FastOps.cpp b/js/src/methodjit/FastOps.cpp index 3a6acea2165..bcb047dd284 100644 --- a/js/src/methodjit/FastOps.cpp +++ b/js/src/methodjit/FastOps.cpp @@ -41,18 +41,16 @@ #include "jsbool.h" #include "jscntxt.h" #include "jslibmath.h" +#include "jsnum.h" #include "jsscope.h" +#include "jsobjinlines.h" +#include "jsscriptinlines.h" +#include "jstypedarrayinlines.h" #include "frontend/BytecodeEmitter.h" #include "methodjit/MethodJIT.h" #include "methodjit/Compiler.h" #include "methodjit/StubCalls.h" -#include "vm/NumericConversions.h" - -#include "jsobjinlines.h" -#include "jsscriptinlines.h" -#include "jstypedarrayinlines.h" - #include "methodjit/FrameState-inl.h" #include "jsautooplen.h" @@ -1264,7 +1262,7 @@ mjit::Compiler::convertForTypedArray(int atype, ValueRemat *vr, bool *allocated) } else { i32 = (atype == TypedArray::TYPE_UINT8_CLAMPED) ? ClampDoubleToUint8(v.toDouble()) - : ToInt32(v.toDouble()); + : js_DoubleToECMAInt32(v.toDouble()); } *vr = ValueRemat::FromConstant(Int32Value(i32)); } @@ -1700,8 +1698,9 @@ mjit::Compiler::jsop_setelem(bool popGuaranteed) ic.fastPathRejoin = masm.label(); // When generating typed array stubs, it may be necessary to call - // ToInt32(), which would clobber registers. To deal with this, we tell the - // IC exactly which registers need to be saved across calls. + // js_DoubleToECMAInt32(), which would clobber registers. To deal with + // this, we tell the IC exactly which registers need to be saved + // across calls. ic.volatileMask = frame.regsInUse(); // If the RHS will be popped, and doesn't overlap any live values, then diff --git a/js/src/methodjit/PunboxAssembler.h b/js/src/methodjit/PunboxAssembler.h index d363988e319..db1b42aa445 100644 --- a/js/src/methodjit/PunboxAssembler.h +++ b/js/src/methodjit/PunboxAssembler.h @@ -43,7 +43,7 @@ #include "assembler/assembler/MacroAssembler.h" #include "methodjit/MachineRegs.h" #include "methodjit/RematInfo.h" -#include "jsval.h" +#include "jsnum.h" namespace js { namespace mjit { @@ -397,12 +397,9 @@ class PunboxAssembler : public JSC::MacroAssembler } void loadStaticDouble(const double *dp, FPRegisterID dest, RegisterID scratch) { - union DoublePun { - double d; - uint64_t u; - } pun; - pun.d = *dp; - move(ImmPtr(reinterpret_cast(pun.u)), scratch); + jsdpun du; + du.d = *dp; + move(ImmPtr(reinterpret_cast(du.u64)), scratch); m_assembler.movq_rr(scratch, dest); } diff --git a/js/src/methodjit/StubCalls.cpp b/js/src/methodjit/StubCalls.cpp index 3ff2c8a8a9b..ca0309e4736 100644 --- a/js/src/methodjit/StubCalls.cpp +++ b/js/src/methodjit/StubCalls.cpp @@ -51,9 +51,7 @@ #include "jsbool.h" #include "assembler/assembler/MacroAssemblerCodeRef.h" #include "jstypes.h" - #include "vm/Debugger.h" -#include "vm/NumericConversions.h" #include "vm/String.h" #include "methodjit/Compiler.h" #include "methodjit/StubCalls.h" @@ -1736,7 +1734,7 @@ stubs::ConvertToTypedInt(JSContext *cx, Value *vp) if (vp->isDouble()) { if (Clamped) return ClampDoubleToUint8(vp->toDouble()); - return ToInt32(vp->toDouble()); + return js_DoubleToECMAInt32(vp->toDouble()); } if (vp->isNull() || vp->isObject() || vp->isUndefined()) diff --git a/js/src/methodjit/TypedArrayIC.h b/js/src/methodjit/TypedArrayIC.h index f7618dea908..5841249178c 100644 --- a/js/src/methodjit/TypedArrayIC.h +++ b/js/src/methodjit/TypedArrayIC.h @@ -42,8 +42,7 @@ #include "jscntxt.h" #include "jstypedarray.h" - -#include "vm/NumericConversions.h" +#include "jstypedarrayinlines.h" #include "jsnuminlines.h" #include "jstypedarrayinlines.h" @@ -130,7 +129,7 @@ ConstantFoldForIntArray(JSContext *cx, JSObject *tarray, ValueRemat *vr) if (v.isDouble()) { i32 = (TypedArray::getType(tarray) == js::TypedArray::TYPE_UINT8_CLAMPED) ? ClampDoubleToUint8(v.toDouble()) - : ToInt32(v.toDouble()); + : js_DoubleToECMAInt32(v.toDouble()); } else if (v.isInt32()) { i32 = v.toInt32(); if (TypedArray::getType(tarray) == js::TypedArray::TYPE_UINT8_CLAMPED) diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp index 59613aeca10..c9bc3c740b9 100644 --- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -3811,6 +3811,52 @@ DebuggerObject_getOwnPropertyNames(JSContext *cx, unsigned argc, Value *vp) return true; } +static bool +CheckArgCompartment(JSContext *cx, JSObject *obj, const Value &v, + const char *methodname, const char *propname) +{ + if (v.isObject() && v.toObject().compartment() != obj->compartment()) { + JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEBUG_COMPARTMENT_MISMATCH, + methodname, propname); + return false; + } + return true; +} + +/* + * Convert Debugger.Objects in desc to debuggee values. + * Reject non-callable getters and setters. + */ +static bool +UnwrapPropDesc(JSContext *cx, Debugger *dbg, JSObject *obj, PropDesc *desc) +{ + return (!desc->hasValue || (dbg->unwrapDebuggeeValue(cx, &desc->value) && + CheckArgCompartment(cx, obj, desc->value, "defineProperty", + "value"))) && + (!desc->hasGet || (dbg->unwrapDebuggeeValue(cx, &desc->get) && + CheckArgCompartment(cx, obj, desc->get, "defineProperty", "get") && + desc->checkGetter(cx))) && + (!desc->hasSet || (dbg->unwrapDebuggeeValue(cx, &desc->set) && + CheckArgCompartment(cx, obj, desc->set, "defineProperty", "set") && + desc->checkSetter(cx))); +} + +/* + * Rewrap *idp and the fields of *desc for the current compartment. Also: + * defining a property on a proxy requires the pd field to contain a descriptor + * object, so reconstitute desc->pd if needed. + */ +static bool +WrapIdAndPropDesc(JSContext *cx, JSObject *obj, jsid *idp, PropDesc *desc) +{ + JSCompartment *comp = cx->compartment; + return comp->wrapId(cx, idp) && + comp->wrap(cx, &desc->value) && + comp->wrap(cx, &desc->get) && + comp->wrap(cx, &desc->set) && + (!IsProxy(obj) || desc->makeObject(cx)); +} + static JSBool DebuggerObject_defineProperty(JSContext *cx, unsigned argc, Value *vp) { @@ -3826,25 +3872,19 @@ DebuggerObject_defineProperty(JSContext *cx, unsigned argc, Value *vp) PropDesc *desc = descs.append(); if (!desc || !desc->initialize(cx, descval, false)) return false; - desc->clearPd(); - PropDesc *unwrappedDesc = descs.append(); - if (!unwrappedDesc || !desc->unwrapDebuggerObjectsInto(cx, dbg, obj, unwrappedDesc)) + desc->pd.setUndefined(); + if (!UnwrapPropDesc(cx, dbg, obj, desc)) return false; { - PropDesc *rewrappedDesc = descs.append(); - if (!rewrappedDesc) - return false; - RootedVarId wrappedId(cx); - AutoCompartment ac(cx, obj); - if (!ac.enter() || !unwrappedDesc->wrapInto(cx, obj, id, wrappedId.address(), rewrappedDesc)) + if (!ac.enter() || !WrapIdAndPropDesc(cx, obj, id.address(), desc)) return false; ErrorCopier ec(ac, dbg->toJSObject()); bool dummy; - if (!DefineProperty(cx, obj, wrappedId, *rewrappedDesc, true, &dummy)) + if (!DefineProperty(cx, obj, id, *desc, true, &dummy)) return false; } @@ -3867,32 +3907,24 @@ DebuggerObject_defineProperties(JSContext *cx, unsigned argc, Value *vp) return false; size_t n = ids.length(); - AutoPropDescArrayRooter unwrappedDescs(cx); for (size_t i = 0; i < n; i++) { - if (!unwrappedDescs.append()) - return false; - if (!descs[i].unwrapDebuggerObjectsInto(cx, dbg, obj, &unwrappedDescs[i])) + if (!UnwrapPropDesc(cx, dbg, obj, &descs[i])) return false; } { - AutoIdVector rewrappedIds(cx); - AutoPropDescArrayRooter rewrappedDescs(cx); - AutoCompartment ac(cx, obj); if (!ac.enter()) return false; for (size_t i = 0; i < n; i++) { - if (!rewrappedIds.append(jsid()) || !rewrappedDescs.append()) - return false; - if (!unwrappedDescs[i].wrapInto(cx, obj, ids[i], &rewrappedIds[i], &rewrappedDescs[i])) + if (!WrapIdAndPropDesc(cx, obj, &ids[i], &descs[i])) return false; } ErrorCopier ec(ac, dbg->toJSObject()); for (size_t i = 0; i < n; i++) { bool dummy; - if (!DefineProperty(cx, obj, RootedVarId(cx, rewrappedIds[i]), rewrappedDescs[i], true, &dummy)) + if (!DefineProperty(cx, obj, RootedVarId(cx, ids[i]), descs[i], true, &dummy)) return false; } } diff --git a/js/src/vm/NumericConversions.h b/js/src/vm/NumericConversions.h deleted file mode 100644 index dc201c26e8c..00000000000 --- a/js/src/vm/NumericConversions.h +++ /dev/null @@ -1,281 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * vim: set ts=8 sw=4 et tw=78: - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef NumericConversions_h___ -#define NumericConversions_h___ - -#include "mozilla/FloatingPoint.h" - -#include - -/* A NaN whose bit pattern conforms to JS::Value's bit pattern restrictions. */ -extern double js_NaN; - -namespace js { - -namespace detail { - -union DoublePun { - struct { -#if defined(IS_LITTLE_ENDIAN) && !defined(FPU_IS_ARM_FPA) - uint32_t lo, hi; -#else - uint32_t hi, lo; -#endif - } s; - uint64_t u64; - double d; -}; - -} /* namespace detail */ - -/* ES5 9.5 ToInt32 (specialized for doubles). */ -inline int32_t -ToInt32(double d) -{ -#if defined(__i386__) || defined(__i386) || defined(__x86_64__) || \ - defined(_M_IX86) || defined(_M_X64) - detail::DoublePun du, duh, two32; - uint32_t di_h, u_tmp, expon, shift_amount; - int32_t mask32; - - /* - * Algorithm Outline - * Step 1. If d is NaN, +/-Inf or |d|>=2^84 or |d|<1, then return 0 - * All of this is implemented based on an exponent comparison. - * Step 2. If |d|<2^31, then return (int)d - * The cast to integer (conversion in RZ mode) returns the correct result. - * Step 3. If |d|>=2^32, d:=fmod(d, 2^32) is taken -- but without a call - * Step 4. If |d|>=2^31, then the fractional bits are cleared before - * applying the correction by 2^32: d - sign(d)*2^32 - * Step 5. Return (int)d - */ - - du.d = d; - di_h = du.s.hi; - - u_tmp = (di_h & 0x7ff00000) - 0x3ff00000; - if (u_tmp >= (0x45300000-0x3ff00000)) { - // d is Nan, +/-Inf or +/-0, or |d|>=2^(32+52) or |d|<1, in which case result=0 - return 0; - } - - if (u_tmp < 0x01f00000) { - // |d|<2^31 - return int32_t(d); - } - - if (u_tmp > 0x01f00000) { - // |d|>=2^32 - expon = u_tmp >> 20; - shift_amount = expon - 21; - duh.u64 = du.u64; - mask32 = 0x80000000; - if (shift_amount < 32) { - mask32 >>= shift_amount; - duh.s.hi = du.s.hi & mask32; - duh.s.lo = 0; - } else { - mask32 >>= (shift_amount-32); - duh.s.hi = du.s.hi; - duh.s.lo = du.s.lo & mask32; - } - du.d -= duh.d; - } - - di_h = du.s.hi; - - // eliminate fractional bits - u_tmp = (di_h & 0x7ff00000); - if (u_tmp >= 0x41e00000) { - // |d|>=2^31 - expon = u_tmp >> 20; - shift_amount = expon - (0x3ff - 11); - mask32 = 0x80000000; - if (shift_amount < 32) { - mask32 >>= shift_amount; - du.s.hi &= mask32; - du.s.lo = 0; - } else { - mask32 >>= (shift_amount-32); - du.s.lo &= mask32; - } - two32.s.hi = 0x41f00000 ^ (du.s.hi & 0x80000000); - two32.s.lo = 0; - du.d -= two32.d; - } - - return int32_t(du.d); -#elif defined (__arm__) && defined (__GNUC__) - int32_t i; - uint32_t tmp0; - uint32_t tmp1; - uint32_t tmp2; - asm ( - // We use a pure integer solution here. In the 'softfp' ABI, the argument - // will start in r0 and r1, and VFP can't do all of the necessary ECMA - // conversions by itself so some integer code will be required anyway. A - // hybrid solution is faster on A9, but this pure integer solution is - // notably faster for A8. - - // %0 is the result register, and may alias either of the %[QR]1 registers. - // %Q4 holds the lower part of the mantissa. - // %R4 holds the sign, exponent, and the upper part of the mantissa. - // %1, %2 and %3 are used as temporary values. - - // Extract the exponent. -" mov %1, %R4, LSR #20\n" -" bic %1, %1, #(1 << 11)\n" // Clear the sign. - - // Set the implicit top bit of the mantissa. This clobbers a bit of the - // exponent, but we have already extracted that. -" orr %R4, %R4, #(1 << 20)\n" - - // Special Cases - // We should return zero in the following special cases: - // - Exponent is 0x000 - 1023: +/-0 or subnormal. - // - Exponent is 0x7ff - 1023: +/-INFINITY or NaN - // - This case is implicitly handled by the standard code path anyway, - // as shifting the mantissa up by the exponent will result in '0'. - // - // The result is composed of the mantissa, prepended with '1' and - // bit-shifted left by the (decoded) exponent. Note that because the r1[20] - // is the bit with value '1', r1 is effectively already shifted (left) by - // 20 bits, and r0 is already shifted by 52 bits. - - // Adjust the exponent to remove the encoding offset. If the decoded - // exponent is negative, quickly bail out with '0' as such values round to - // zero anyway. This also catches +/-0 and subnormals. -" sub %1, %1, #0xff\n" -" subs %1, %1, #0x300\n" -" bmi 8f\n" - - // %1 = (decoded) exponent >= 0 - // %R4 = upper mantissa and sign - - // ---- Lower Mantissa ---- -" subs %3, %1, #52\n" // Calculate exp-52 -" bmi 1f\n" - - // Shift r0 left by exp-52. - // Ensure that we don't overflow ARM's 8-bit shift operand range. - // We need to handle anything up to an 11-bit value here as we know that - // 52 <= exp <= 1024 (0x400). Any shift beyond 31 bits results in zero - // anyway, so as long as we don't touch the bottom 5 bits, we can use - // a logical OR to push long shifts into the 32 <= (exp&0xff) <= 255 range. -" bic %2, %3, #0xff\n" -" orr %3, %3, %2, LSR #3\n" - // We can now perform a straight shift, avoiding the need for any - // conditional instructions or extra branches. -" mov %Q4, %Q4, LSL %3\n" -" b 2f\n" -"1:\n" // Shift r0 right by 52-exp. - // We know that 0 <= exp < 52, and we can shift up to 255 bits so 52-exp - // will always be a valid shift and we can sk%3 the range check for this case. -" rsb %3, %1, #52\n" -" mov %Q4, %Q4, LSR %3\n" - - // %1 = (decoded) exponent - // %R4 = upper mantissa and sign - // %Q4 = partially-converted integer - -"2:\n" - // ---- Upper Mantissa ---- - // This is much the same as the lower mantissa, with a few different - // boundary checks and some masking to hide the exponent & sign bit in the - // upper word. - // Note that the upper mantissa is pre-shifted by 20 in %R4, but we shift - // it left more to remove the sign and exponent so it is effectively - // pre-shifted by 31 bits. -" subs %3, %1, #31\n" // Calculate exp-31 -" mov %1, %R4, LSL #11\n" // Re-use %1 as a temporary register. -" bmi 3f\n" - - // Shift %R4 left by exp-31. - // Avoid overflowing the 8-bit shift range, as before. -" bic %2, %3, #0xff\n" -" orr %3, %3, %2, LSR #3\n" - // Perform the shift. -" mov %2, %1, LSL %3\n" -" b 4f\n" -"3:\n" // Shift r1 right by 31-exp. - // We know that 0 <= exp < 31, and we can shift up to 255 bits so 31-exp - // will always be a valid shift and we can skip the range check for this case. -" rsb %3, %3, #0\n" // Calculate 31-exp from -(exp-31) -" mov %2, %1, LSR %3\n" // Thumb-2 can't do "LSR %3" in "orr". - - // %Q4 = partially-converted integer (lower) - // %R4 = upper mantissa and sign - // %2 = partially-converted integer (upper) - -"4:\n" - // Combine the converted parts. -" orr %Q4, %Q4, %2\n" - // Negate the result if we have to, and move it to %0 in the process. To - // avoid conditionals, we can do this by inverting on %R4[31], then adding - // %R4[31]>>31. -" eor %Q4, %Q4, %R4, ASR #31\n" -" add %0, %Q4, %R4, LSR #31\n" -" b 9f\n" -"8:\n" - // +/-INFINITY, +/-0, subnormals, NaNs, and anything else out-of-range that - // will result in a conversion of '0'. -" mov %0, #0\n" -"9:\n" - : "=r" (i), "=&r" (tmp0), "=&r" (tmp1), "=&r" (tmp2) - : "r" (d) - : "cc" - ); - return i; -#else - int32_t i; - double two32, two31; - - if (!MOZ_DOUBLE_IS_FINITE(d)) - return 0; - - /* FIXME: This relies on undefined behavior; see bug 667739. */ - i = (int32_t) d; - if ((double) i == d) - return i; - - two32 = 4294967296.0; - two31 = 2147483648.0; - d = fmod(d, two32); - d = (d >= 0) ? floor(d) : ceil(d) + two32; - return (int32_t) (d >= two31 ? d - two32 : d); -#endif -} - -/* ES5 9.6 (specialized for doubles). */ -inline uint32_t -ToUint32(double d) -{ - return uint32_t(ToInt32(d)); -} - -/* ES5 9.4 ToInteger (specialized for doubles). */ -inline double -ToInteger(double d) -{ - if (d == 0) - return d; - - if (!MOZ_DOUBLE_IS_FINITE(d)) { - if (MOZ_DOUBLE_IS_NaN(d)) - return 0; - return d; - } - - bool neg = (d < 0); - d = floor(neg ? -d : d); - return neg ? -d : d; -} - -} /* namespace js */ - -#endif /* NumericConversions_h__ */ diff --git a/js/src/vm/ObjectImpl.cpp b/js/src/vm/ObjectImpl.cpp index 64dd1952dc6..e726841352b 100644 --- a/js/src/vm/ObjectImpl.cpp +++ b/js/src/vm/ObjectImpl.cpp @@ -11,7 +11,6 @@ #include "jsscope.h" #include "jsobjinlines.h" -#include "Debugger.h" #include "ObjectImpl.h" #include "gc/Barrier-inl.h" @@ -20,126 +19,6 @@ using namespace js; -PropDesc::PropDesc() - : pd_(UndefinedValue()), - value_(UndefinedValue()), - get_(UndefinedValue()), - set_(UndefinedValue()), - attrs(0), - hasGet_(false), - hasSet_(false), - hasValue_(false), - hasWritable_(false), - hasEnumerable_(false), - hasConfigurable_(false), - isUndefined_(true) -{ -} - -bool -PropDesc::checkGetter(JSContext *cx) -{ - if (hasGet_) { - if (!js_IsCallable(get_) && !get_.isUndefined()) { - JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_GET_SET_FIELD, - js_getter_str); - return false; - } - } - return true; -} - -bool -PropDesc::checkSetter(JSContext *cx) -{ - if (hasSet_) { - if (!js_IsCallable(set_) && !set_.isUndefined()) { - JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_GET_SET_FIELD, - js_setter_str); - return false; - } - } - return true; -} - -static bool -CheckArgCompartment(JSContext *cx, JSObject *obj, const Value &v, - const char *methodname, const char *propname) -{ - if (v.isObject() && v.toObject().compartment() != obj->compartment()) { - JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEBUG_COMPARTMENT_MISMATCH, - methodname, propname); - return false; - } - return true; -} - -/* - * Convert Debugger.Objects in desc to debuggee values. - * Reject non-callable getters and setters. - */ -bool -PropDesc::unwrapDebuggerObjectsInto(JSContext *cx, Debugger *dbg, JSObject *obj, - PropDesc *unwrapped) const -{ - MOZ_ASSERT(!isUndefined()); - - *unwrapped = *this; - - if (unwrapped->hasValue()) { - if (!dbg->unwrapDebuggeeValue(cx, &unwrapped->value_) || - !CheckArgCompartment(cx, obj, unwrapped->value_, "defineProperty", "value")) - { - return false; - } - } - - if (unwrapped->hasGet()) { - if (!dbg->unwrapDebuggeeValue(cx, &unwrapped->get_) || - !CheckArgCompartment(cx, obj, unwrapped->get_, "defineProperty", "get")) - { - return false; - } - } - - if (unwrapped->hasSet()) { - if (!dbg->unwrapDebuggeeValue(cx, &unwrapped->set_) || - !CheckArgCompartment(cx, obj, unwrapped->set_, "defineProperty", "set")) - { - return false; - } - } - - return true; -} - -/* - * Rewrap *idp and the fields of *desc for the current compartment. Also: - * defining a property on a proxy requires pd_ to contain a descriptor object, - * so reconstitute desc->pd_ if needed. - */ -bool -PropDesc::wrapInto(JSContext *cx, JSObject *obj, const jsid &id, jsid *wrappedId, - PropDesc *desc) const -{ - MOZ_ASSERT(!isUndefined()); - - JSCompartment *comp = cx->compartment; - - *wrappedId = id; - if (!comp->wrapId(cx, wrappedId)) - return false; - - *desc = *this; - if (!comp->wrap(cx, &desc->value_)) - return false; - if (!comp->wrap(cx, &desc->get_)) - return false; - if (!comp->wrap(cx, &desc->set_)) - return false; - return !obj->isProxy() || desc->makeObject(cx); -} - static ObjectElements emptyElementsHeader(0, 0); /* Objects with no elements share one empty set of elements. */ @@ -304,17 +183,17 @@ DenseElementsHeader::defineElement(JSContext *cx, ObjectImpl *obj, uint32_t inde { MOZ_ASSERT(this == &obj->elementsHeader()); - MOZ_ASSERT_IF(desc.hasGet() || desc.hasSet(), !desc.hasValue() && !desc.hasWritable()); - MOZ_ASSERT_IF(desc.hasValue() || desc.hasWritable(), !desc.hasGet() && !desc.hasSet()); + MOZ_ASSERT_IF(desc.hasGet || desc.hasSet, !desc.hasValue && !desc.hasWritable); + MOZ_ASSERT_IF(desc.hasValue || desc.hasWritable, !desc.hasGet && !desc.hasSet); /* * If desc is an accessor descriptor or a data descriptor with atypical * attributes, convert to sparse and retry. */ - if (desc.hasGet() || desc.hasSet() || - (desc.hasEnumerable() && !desc.enumerable()) || - (desc.hasConfigurable() && !desc.configurable()) || - (desc.hasWritable() && !desc.writable())) + if (desc.hasGet || desc.hasSet || + (desc.hasEnumerable && !desc.enumerable()) || + (desc.hasConfigurable && !desc.configurable()) || + (desc.hasWritable && !desc.writable())) { if (!obj->makeElementsSparse(cx)) return false; @@ -367,7 +246,7 @@ DenseElementsHeader::defineElement(JSContext *cx, ObjectImpl *obj, uint32_t inde /* But if we were able to ensure the element's existence, we're good. */ MOZ_ASSERT(res == ObjectImpl::Succeeded); - obj->elements[index].set(obj->asObjectPtr(), index, desc.value()); + obj->elements[index].set(obj->asObjectPtr(), index, desc.value); *succeeded = true; return true; } diff --git a/js/src/vm/ObjectImpl.h b/js/src/vm/ObjectImpl.h index d29190b3897..dfed5291a10 100644 --- a/js/src/vm/ObjectImpl.h +++ b/js/src/vm/ObjectImpl.h @@ -19,7 +19,6 @@ namespace js { -class Debugger; class ObjectImpl; class AutoPropDescArrayRooter; @@ -41,32 +40,26 @@ CastAsStrictPropertyOp(JSObject *object) * structure. */ struct PropDesc { - private: /* * Original object from which this descriptor derives, passed through for - * the benefit of proxies. FIXME: Remove this when direct proxies happen. + * the benefit of proxies. */ - Value pd_; + Value pd; - Value value_, get_, set_; + Value value, get, set; /* Property descriptor boolean fields. */ uint8_t attrs; /* Bits indicating which values are set. */ - bool hasGet_ : 1; - bool hasSet_ : 1; - bool hasValue_ : 1; - bool hasWritable_ : 1; - bool hasEnumerable_ : 1; - bool hasConfigurable_ : 1; + bool hasGet : 1; + bool hasSet : 1; + bool hasValue : 1; + bool hasWritable : 1; + bool hasEnumerable : 1; + bool hasConfigurable : 1; - /* Or maybe this represents a property's absence, and it's undefined. */ - bool isUndefined_ : 1; - - public: friend class AutoPropDescArrayRooter; - friend void JS::AutoGCRooter::trace(JSTracer *trc); PropDesc(); @@ -94,91 +87,52 @@ struct PropDesc { void initFromPropertyDescriptor(const PropertyDescriptor &desc); bool makeObject(JSContext *cx); - void setUndefined() { isUndefined_ = true; } - - bool isUndefined() const { return isUndefined_; } - - bool hasGet() const { MOZ_ASSERT(!isUndefined()); return hasGet_; } - bool hasSet() const { MOZ_ASSERT(!isUndefined()); return hasSet_; } - bool hasValue() const { MOZ_ASSERT(!isUndefined()); return hasValue_; } - bool hasWritable() const { MOZ_ASSERT(!isUndefined()); return hasWritable_; } - bool hasEnumerable() const { MOZ_ASSERT(!isUndefined()); return hasEnumerable_; } - bool hasConfigurable() const { MOZ_ASSERT(!isUndefined()); return hasConfigurable_; } - - Value pd() const { MOZ_ASSERT(!isUndefined()); return pd_; } - void clearPd() { pd_ = UndefinedValue(); } - - uint8_t attributes() const { MOZ_ASSERT(!isUndefined()); return attrs; } - /* 8.10.1 IsAccessorDescriptor(desc) */ bool isAccessorDescriptor() const { - return !isUndefined() && (hasGet() || hasSet()); + return hasGet || hasSet; } /* 8.10.2 IsDataDescriptor(desc) */ bool isDataDescriptor() const { - return !isUndefined() && (hasValue() || hasWritable()); + return hasValue || hasWritable; } /* 8.10.3 IsGenericDescriptor(desc) */ bool isGenericDescriptor() const { - return !isUndefined() && !isAccessorDescriptor() && !isDataDescriptor(); + return !isAccessorDescriptor() && !isDataDescriptor(); } bool configurable() const { - MOZ_ASSERT(!isUndefined()); - MOZ_ASSERT(hasConfigurable()); return (attrs & JSPROP_PERMANENT) == 0; } bool enumerable() const { - MOZ_ASSERT(!isUndefined()); - MOZ_ASSERT(hasEnumerable()); return (attrs & JSPROP_ENUMERATE) != 0; } bool writable() const { - MOZ_ASSERT(!isUndefined()); - MOZ_ASSERT(hasWritable()); return (attrs & JSPROP_READONLY) == 0; } - const Value & value() const { - MOZ_ASSERT(hasValue()); - return value_; + JSObject* getterObject() const { + return get.isUndefined() ? NULL : &get.toObject(); + } + JSObject* setterObject() const { + return set.isUndefined() ? NULL : &set.toObject(); } - JSObject * getterObject() const { - MOZ_ASSERT(!isUndefined()); - MOZ_ASSERT(hasGet()); - return get_.isUndefined() ? NULL : &get_.toObject(); + const Value &getterValue() const { + return get; } - JSObject * setterObject() const { - MOZ_ASSERT(!isUndefined()); - MOZ_ASSERT(hasSet()); - return set_.isUndefined() ? NULL : &set_.toObject(); + const Value &setterValue() const { + return set; } - const Value & getterValue() const { - MOZ_ASSERT(!isUndefined()); - MOZ_ASSERT(hasGet()); - return get_; - } - const Value & setterValue() const { - MOZ_ASSERT(!isUndefined()); - MOZ_ASSERT(hasSet()); - return set_; - } - - /* - * Unfortunately the values produced by these methods are used such that - * we can't assert anything here. :-( - */ PropertyOp getter() const { - return CastAsPropertyOp(get_.isUndefined() ? NULL : &get_.toObject()); + return CastAsPropertyOp(getterObject()); } StrictPropertyOp setter() const { - return CastAsStrictPropertyOp(set_.isUndefined() ? NULL : &set_.toObject()); + return CastAsStrictPropertyOp(setterObject()); } /* @@ -186,14 +140,8 @@ struct PropDesc { * nor undefined. These methods do exactly the type checks that are skipped * by passing false as the checkAccessors parameter of initialize. */ - bool checkGetter(JSContext *cx); - bool checkSetter(JSContext *cx); - - bool unwrapDebuggerObjectsInto(JSContext *cx, Debugger *dbg, JSObject *obj, - PropDesc *unwrapped) const; - - bool wrapInto(JSContext *cx, JSObject *obj, const jsid &id, jsid *wrappedId, - PropDesc *wrappedDesc) const; + inline bool checkGetter(JSContext *cx); + inline bool checkSetter(JSContext *cx); }; class DenseElementsHeader; @@ -616,19 +564,18 @@ ElementsHeader::asArrayBufferElements() return *static_cast(this); } -class ArrayBufferObject; - /* * Header structure for object element arrays. This structure is immediately * followed by an array of elements, with the elements member in an object * pointing to the beginning of that array (the end of this structure). * See below for usage of this structure. */ +class ArrayBufferObject; class ObjectElements { friend struct ::JSObject; friend class ObjectImpl; - friend class ArrayBufferObject; + friend struct js::ArrayBufferObject; /* Number of allocated slots. */ uint32_t capacity; diff --git a/js/src/vm/Xdr.h b/js/src/vm/Xdr.h index 78f3a6be44f..1ca4fce95c8 100644 --- a/js/src/vm/Xdr.h +++ b/js/src/vm/Xdr.h @@ -44,8 +44,6 @@ #include "jsprvtd.h" #include "jsnum.h" -#include "vm/NumericConversions.h" - namespace js { /* @@ -214,47 +212,28 @@ class XDRState { return true; } - bool codeUint64(uint64_t *n) { + bool codeDouble(double *dp) { + jsdpun tmp; if (mode == XDR_ENCODE) { - uint8_t *ptr = buf.write(sizeof(*n)); + uint8_t *ptr = buf.write(sizeof tmp); if (!ptr) return false; - ptr[0] = (*n >> 0) & 0xFF; - ptr[1] = (*n >> 8) & 0xFF; - ptr[2] = (*n >> 16) & 0xFF; - ptr[3] = (*n >> 24) & 0xFF; - ptr[4] = (*n >> 32) & 0xFF; - ptr[5] = (*n >> 40) & 0xFF; - ptr[6] = (*n >> 48) & 0xFF; - ptr[7] = (*n >> 56) & 0xFF; + tmp.d = *dp; + tmp.s.lo = NormalizeByteOrder32(tmp.s.lo); + tmp.s.hi = NormalizeByteOrder32(tmp.s.hi); + memcpy(ptr, &tmp.s.lo, sizeof tmp.s.lo); + memcpy(ptr + sizeof tmp.s.lo, &tmp.s.hi, sizeof tmp.s.hi); } else { - const uint8_t *ptr = buf.read(sizeof(*n)); - *n = (uint64_t(ptr[0]) << 0) | - (uint64_t(ptr[1]) << 8) | - (uint64_t(ptr[2]) << 16) | - (uint64_t(ptr[3]) << 24) | - (uint64_t(ptr[4]) << 32) | - (uint64_t(ptr[5]) << 40) | - (uint64_t(ptr[6]) << 48) | - (uint64_t(ptr[7]) << 56); + const uint8_t *ptr = buf.read(sizeof tmp); + memcpy(&tmp.s.lo, ptr, sizeof tmp.s.lo); + memcpy(&tmp.s.hi, ptr + sizeof tmp.s.lo, sizeof tmp.s.hi); + tmp.s.lo = NormalizeByteOrder32(tmp.s.lo); + tmp.s.hi = NormalizeByteOrder32(tmp.s.hi); + *dp = tmp.d; } return true; } - bool codeDouble(double *dp) { - union DoublePun { - double d; - uint64_t u; - } pun; - if (mode == XDR_ENCODE) - pun.d = *dp; - if (!codeUint64(&pun.u)) - return false; - if (mode == XDR_DECODE) - *dp = pun.d; - return true; - } - bool codeBytes(void *bytes, size_t len) { if (mode == XDR_ENCODE) { uint8_t *ptr = buf.write(len); From 035e6ba78faaec9ea8e03850269024306df62f17 Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Wed, 25 Apr 2012 16:43:18 +0300 Subject: [PATCH 181/182] Bug 747675, try to decrease max forgetSkippable times, r=mccr8 --HG-- extra : rebase_source : 1378eaedd2c24ec8ccb37506d71858087925bf10 --- content/base/src/nsCCUncollectableMarker.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/content/base/src/nsCCUncollectableMarker.cpp b/content/base/src/nsCCUncollectableMarker.cpp index 2b8d26e74a0..7b98ee210df 100644 --- a/content/base/src/nsCCUncollectableMarker.cpp +++ b/content/base/src/nsCCUncollectableMarker.cpp @@ -362,12 +362,6 @@ nsCCUncollectableMarker::Observe(nsISupports* aSubject, const char* aTopic, } } - if (cleanupJS) { - nsContentUtils::UnmarkGrayJSListenersInCCGenerationDocuments(sGeneration); - MarkMessageManagers(); - xpc_UnmarkSkippableJSHolders(); - } - #ifdef MOZ_XUL nsXULPrototypeCache* xulCache = nsXULPrototypeCache::GetInstance(); if (xulCache) { @@ -375,6 +369,18 @@ nsCCUncollectableMarker::Observe(nsISupports* aSubject, const char* aTopic, } #endif + static bool previousWasJSCleanup = false; + if (cleanupJS) { + nsContentUtils::UnmarkGrayJSListenersInCCGenerationDocuments(sGeneration); + MarkMessageManagers(); + previousWasJSCleanup = true; + } else if (previousWasJSCleanup) { + previousWasJSCleanup = false; + if (!prepareForCC) { + xpc_UnmarkSkippableJSHolders(); + } + } + return NS_OK; } From 083b3ec44032e1649f23c0c8b8c8742b25389fd4 Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Wed, 25 Apr 2012 16:47:30 +0300 Subject: [PATCH 182/182] Bug 740063 - Add nsINode::AsDOMNode(), r=jst --HG-- extra : rebase_source : a838243c11e212ec419df1dd1a219e955c4edc2d --- content/base/public/nsINode.h | 6 ++- content/base/src/nsCommentNode.cpp | 2 + content/base/src/nsDOMAttribute.h | 2 + content/base/src/nsDOMDocumentType.h | 2 + content/base/src/nsDocument.h | 1 + content/base/src/nsDocumentFragment.cpp | 2 + content/base/src/nsTextNode.h | 2 + .../html/content/public/nsHTMLAudioElement.h | 2 + .../html/content/public/nsHTMLCanvasElement.h | 2 + .../html/content/public/nsHTMLVideoElement.h | 2 + .../html/content/src/nsHTMLAnchorElement.cpp | 2 + .../html/content/src/nsHTMLAreaElement.cpp | 2 + content/html/content/src/nsHTMLBRElement.cpp | 1 + .../html/content/src/nsHTMLBodyElement.cpp | 1 + .../html/content/src/nsHTMLButtonElement.cpp | 2 +- .../content/src/nsHTMLDataListElement.cpp | 2 +- content/html/content/src/nsHTMLDivElement.cpp | 1 + content/html/content/src/nsHTMLElement.cpp | 2 + .../html/content/src/nsHTMLFieldSetElement.h | 1 + .../html/content/src/nsHTMLFontElement.cpp | 1 + content/html/content/src/nsHTMLFormElement.h | 2 + .../html/content/src/nsHTMLFrameElement.cpp | 1 + .../html/content/src/nsHTMLFrameSetElement.h | 1 + content/html/content/src/nsHTMLHRElement.cpp | 1 + .../html/content/src/nsHTMLHeadingElement.cpp | 1 + .../html/content/src/nsHTMLIFrameElement.cpp | 1 + .../html/content/src/nsHTMLImageElement.cpp | 1 + content/html/content/src/nsHTMLInputElement.h | 2 + content/html/content/src/nsHTMLLIElement.cpp | 1 + content/html/content/src/nsHTMLLabelElement.h | 2 + .../html/content/src/nsHTMLLegendElement.h | 2 + .../html/content/src/nsHTMLLinkElement.cpp | 1 + content/html/content/src/nsHTMLMapElement.cpp | 2 + content/html/content/src/nsHTMLMenuElement.h | 2 + .../html/content/src/nsHTMLMenuItemElement.h | 2 + .../html/content/src/nsHTMLMetaElement.cpp | 2 + content/html/content/src/nsHTMLModElement.cpp | 2 + .../html/content/src/nsHTMLOListElement.cpp | 5 ++ .../html/content/src/nsHTMLObjectElement.cpp | 2 + .../content/src/nsHTMLOptGroupElement.cpp | 2 + .../html/content/src/nsHTMLOptionElement.h | 2 + .../html/content/src/nsHTMLOutputElement.cpp | 2 + .../content/src/nsHTMLParagraphElement.cpp | 2 + content/html/content/src/nsHTMLPreElement.cpp | 2 + .../content/src/nsHTMLProgressElement.cpp | 2 + .../html/content/src/nsHTMLScriptElement.cpp | 2 + .../html/content/src/nsHTMLSelectElement.h | 2 + .../html/content/src/nsHTMLSharedElement.cpp | 5 ++ .../content/src/nsHTMLSharedObjectElement.cpp | 5 ++ .../html/content/src/nsHTMLSourceElement.cpp | 2 + .../html/content/src/nsHTMLSpanElement.cpp | 2 + .../html/content/src/nsHTMLStyleElement.cpp | 2 + .../content/src/nsHTMLTableCaptionElement.cpp | 2 + .../content/src/nsHTMLTableCellElement.cpp | 2 + .../content/src/nsHTMLTableColElement.cpp | 2 + content/html/content/src/nsHTMLTableElement.h | 1 + .../content/src/nsHTMLTableRowElement.cpp | 2 + .../content/src/nsHTMLTableSectionElement.cpp | 2 + .../content/src/nsHTMLTextAreaElement.cpp | 2 + .../html/content/src/nsHTMLTitleElement.cpp | 2 + .../html/content/src/nsHTMLUnknownElement.cpp | 2 + content/mathml/content/src/nsMathMLElement.h | 2 + content/svg/content/src/nsSVGAElement.h | 2 + .../svg/content/src/nsSVGAltGlyphElement.cpp | 2 + .../svg/content/src/nsSVGAnimateElement.cpp | 2 + .../content/src/nsSVGAnimateMotionElement.h | 2 + .../src/nsSVGAnimateTransformElement.cpp | 2 + .../svg/content/src/nsSVGCircleElement.cpp | 2 + .../svg/content/src/nsSVGClipPathElement.h | 2 + content/svg/content/src/nsSVGDefsElement.cpp | 2 + content/svg/content/src/nsSVGDescElement.cpp | 2 + .../svg/content/src/nsSVGEllipseElement.cpp | 2 + content/svg/content/src/nsSVGFilterElement.h | 2 + content/svg/content/src/nsSVGFilters.cpp | 46 +++++++++++++++++++ content/svg/content/src/nsSVGFilters.h | 2 + .../content/src/nsSVGForeignObjectElement.h | 2 + content/svg/content/src/nsSVGGElement.cpp | 2 + .../svg/content/src/nsSVGGradientElement.h | 4 ++ content/svg/content/src/nsSVGImageElement.h | 2 + content/svg/content/src/nsSVGLineElement.cpp | 2 + content/svg/content/src/nsSVGMarkerElement.h | 2 + content/svg/content/src/nsSVGMaskElement.h | 2 + .../svg/content/src/nsSVGMetadataElement.cpp | 2 + content/svg/content/src/nsSVGMpathElement.h | 2 + content/svg/content/src/nsSVGPathElement.h | 2 + content/svg/content/src/nsSVGPatternElement.h | 2 + .../svg/content/src/nsSVGPolygonElement.cpp | 2 + .../svg/content/src/nsSVGPolylineElement.cpp | 1 + content/svg/content/src/nsSVGRectElement.cpp | 2 + content/svg/content/src/nsSVGSVGElement.h | 2 + .../svg/content/src/nsSVGScriptElement.cpp | 2 + content/svg/content/src/nsSVGSetElement.cpp | 2 + content/svg/content/src/nsSVGStopElement.cpp | 2 + content/svg/content/src/nsSVGStyleElement.cpp | 2 + content/svg/content/src/nsSVGSwitchElement.h | 2 + .../svg/content/src/nsSVGSymbolElement.cpp | 2 + content/svg/content/src/nsSVGTSpanElement.cpp | 2 + content/svg/content/src/nsSVGTextElement.cpp | 2 + .../svg/content/src/nsSVGTextPathElement.h | 2 + content/svg/content/src/nsSVGTitleElement.cpp | 2 + .../svg/content/src/nsSVGUnknownElement.cpp | 2 + content/svg/content/src/nsSVGUseElement.h | 2 + content/xml/content/src/nsXMLCDATASection.cpp | 2 + content/xml/content/src/nsXMLElement.h | 2 + .../content/src/nsXMLProcessingInstruction.h | 2 + content/xul/content/src/nsXULElement.h | 2 + 106 files changed, 251 insertions(+), 4 deletions(-) diff --git a/content/base/public/nsINode.h b/content/base/public/nsINode.h index 05521396ce0..002f300e08c 100644 --- a/content/base/public/nsINode.h +++ b/content/base/public/nsINode.h @@ -275,8 +275,8 @@ private: // IID for the nsINode interface #define NS_INODE_IID \ -{ 0x772e7e52, 0xfadf, 0x4962, \ - { 0x8d, 0x96, 0x58, 0xfe, 0x75, 0x68, 0xaf, 0xa8 } } +{ 0xf73e3890, 0xe4ab, 0x453e, \ + { 0x8c, 0x78, 0x2d, 0x1f, 0xa4, 0x0b, 0x48, 0x00 } } /** * An internal interface that abstracts some DOMNode-related parts that both @@ -406,6 +406,8 @@ public: */ mozilla::dom::Element* AsElement(); + virtual nsIDOMNode* AsDOMNode() = 0; + /** * Return if this node has any children. */ diff --git a/content/base/src/nsCommentNode.cpp b/content/base/src/nsCommentNode.cpp index 3193ac7c43a..e1a707114b6 100644 --- a/content/base/src/nsCommentNode.cpp +++ b/content/base/src/nsCommentNode.cpp @@ -72,6 +72,8 @@ public: bool aCloneText) const; virtual nsXPCClassInfo* GetClassInfo(); + + virtual nsIDOMNode* AsDOMNode() { return this; } #ifdef DEBUG virtual void List(FILE* out, PRInt32 aIndent) const; virtual void DumpContent(FILE* out = stdout, PRInt32 aIndent = 0, diff --git a/content/base/src/nsDOMAttribute.h b/content/base/src/nsDOMAttribute.h index 2da6ed4ad75..41240de1705 100644 --- a/content/base/src/nsDOMAttribute.h +++ b/content/base/src/nsDOMAttribute.h @@ -100,6 +100,8 @@ public: nsIAttribute) virtual nsXPCClassInfo* GetClassInfo(); + + virtual nsIDOMNode* AsDOMNode() { return this; } protected: virtual mozilla::dom::Element* GetNameSpaceElement() { diff --git a/content/base/src/nsDOMDocumentType.h b/content/base/src/nsDOMDocumentType.h index f9d6ba3c2e5..7665722dfce 100644 --- a/content/base/src/nsDOMDocumentType.h +++ b/content/base/src/nsDOMDocumentType.h @@ -106,6 +106,8 @@ public: bool aCloneText) const; virtual nsXPCClassInfo* GetClassInfo(); + + virtual nsIDOMNode* AsDOMNode() { return this; } protected: nsString mPublicId; nsString mSystemId; diff --git a/content/base/src/nsDocument.h b/content/base/src/nsDocument.h index 5a8fadf6baa..c33b7742c7a 100644 --- a/content/base/src/nsDocument.h +++ b/content/base/src/nsDocument.h @@ -999,6 +999,7 @@ public: virtual void DocSizeOfExcludingThis(nsWindowSizes* aWindowSizes) const; // DocSizeOfIncludingThis is inherited from nsIDocument. + virtual nsIDOMNode* AsDOMNode() { return this; } protected: friend class nsNodeUtils; diff --git a/content/base/src/nsDocumentFragment.cpp b/content/base/src/nsDocumentFragment.cpp index 782ced4a74f..514f967e8bc 100644 --- a/content/base/src/nsDocumentFragment.cpp +++ b/content/base/src/nsDocumentFragment.cpp @@ -103,6 +103,8 @@ public: virtual nsXPCClassInfo* GetClassInfo(); + virtual nsIDOMNode* AsDOMNode() { return this; } + virtual nsIAtom* DoGetID() const; virtual nsIAtom *GetIDAttributeName() const; diff --git a/content/base/src/nsTextNode.h b/content/base/src/nsTextNode.h index c0ef574dbf3..2f59f8e457b 100644 --- a/content/base/src/nsTextNode.h +++ b/content/base/src/nsTextNode.h @@ -75,6 +75,8 @@ public: nsresult AppendTextForNormalize(const PRUnichar* aBuffer, PRUint32 aLength, bool aNotify, nsIContent* aNextSibling); + virtual nsIDOMNode* AsDOMNode() { return this; } + #ifdef DEBUG virtual void List(FILE* out, PRInt32 aIndent) const; virtual void DumpContent(FILE* out, PRInt32 aIndent, bool aDumpAll) const; diff --git a/content/html/content/public/nsHTMLAudioElement.h b/content/html/content/public/nsHTMLAudioElement.h index 76e80cf5bb2..386f8a2a468 100644 --- a/content/html/content/public/nsHTMLAudioElement.h +++ b/content/html/content/public/nsHTMLAudioElement.h @@ -79,6 +79,8 @@ public: virtual nsresult SetAcceptHeader(nsIHttpChannel* aChannel); virtual nsXPCClassInfo* GetClassInfo(); + + virtual nsIDOMNode* AsDOMNode() { return this; } }; #endif diff --git a/content/html/content/public/nsHTMLCanvasElement.h b/content/html/content/public/nsHTMLCanvasElement.h index 1b748b71ce0..9368c4bb980 100644 --- a/content/html/content/public/nsHTMLCanvasElement.h +++ b/content/html/content/public/nsHTMLCanvasElement.h @@ -184,6 +184,8 @@ public: void MarkContextClean(); virtual nsXPCClassInfo* GetClassInfo(); + + virtual nsIDOMNode* AsDOMNode() { return this; } protected: nsIntSize GetWidthHeight(); diff --git a/content/html/content/public/nsHTMLVideoElement.h b/content/html/content/public/nsHTMLVideoElement.h index bd6acb68585..460a4e7ab50 100644 --- a/content/html/content/public/nsHTMLVideoElement.h +++ b/content/html/content/public/nsHTMLVideoElement.h @@ -90,6 +90,8 @@ public: virtual nsresult SetAcceptHeader(nsIHttpChannel* aChannel); virtual nsXPCClassInfo* GetClassInfo(); + + virtual nsIDOMNode* AsDOMNode() { return this; } }; #endif diff --git a/content/html/content/src/nsHTMLAnchorElement.cpp b/content/html/content/src/nsHTMLAnchorElement.cpp index 3dee7b25577..0e41fb12a68 100644 --- a/content/html/content/src/nsHTMLAnchorElement.cpp +++ b/content/html/content/src/nsHTMLAnchorElement.cpp @@ -137,6 +137,8 @@ public: virtual nsEventStates IntrinsicState() const; virtual nsXPCClassInfo* GetClassInfo(); + + virtual nsIDOMNode* AsDOMNode() { return this; } virtual void OnDNSPrefetchDeferred(); virtual void OnDNSPrefetchRequested(); diff --git a/content/html/content/src/nsHTMLAreaElement.cpp b/content/html/content/src/nsHTMLAreaElement.cpp index bf174b510a9..c448450cb9c 100644 --- a/content/html/content/src/nsHTMLAreaElement.cpp +++ b/content/html/content/src/nsHTMLAreaElement.cpp @@ -125,6 +125,8 @@ public: virtual nsEventStates IntrinsicState() const; virtual nsXPCClassInfo* GetClassInfo(); + + virtual nsIDOMNode* AsDOMNode() { return this; } }; diff --git a/content/html/content/src/nsHTMLBRElement.cpp b/content/html/content/src/nsHTMLBRElement.cpp index 1b0234473a3..660dfcf558b 100644 --- a/content/html/content/src/nsHTMLBRElement.cpp +++ b/content/html/content/src/nsHTMLBRElement.cpp @@ -77,6 +77,7 @@ public: virtual nsMapRuleToAttributesFunc GetAttributeMappingFunction() const; virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const; virtual nsXPCClassInfo* GetClassInfo(); + virtual nsIDOMNode* AsDOMNode() { return this; } }; diff --git a/content/html/content/src/nsHTMLBodyElement.cpp b/content/html/content/src/nsHTMLBodyElement.cpp index a1055c64014..909b058f4ad 100644 --- a/content/html/content/src/nsHTMLBodyElement.cpp +++ b/content/html/content/src/nsHTMLBodyElement.cpp @@ -132,6 +132,7 @@ public: virtual already_AddRefed GetAssociatedEditor(); virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const; virtual nsXPCClassInfo* GetClassInfo(); + virtual nsIDOMNode* AsDOMNode() { return this; } private: nsresult GetColorHelper(nsIAtom* aAtom, nsAString& aColor); diff --git a/content/html/content/src/nsHTMLButtonElement.cpp b/content/html/content/src/nsHTMLButtonElement.cpp index 4f49dd868a4..12e7b1576ba 100644 --- a/content/html/content/src/nsHTMLButtonElement.cpp +++ b/content/html/content/src/nsHTMLButtonElement.cpp @@ -161,7 +161,7 @@ public: virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const; virtual void DoneCreatingElement(); virtual nsXPCClassInfo* GetClassInfo(); - + virtual nsIDOMNode* AsDOMNode() { return this; } protected: PRUint8 mType; bool mDisabledChanged; diff --git a/content/html/content/src/nsHTMLDataListElement.cpp b/content/html/content/src/nsHTMLDataListElement.cpp index cf49d61b3ee..a4ad1e18232 100644 --- a/content/html/content/src/nsHTMLDataListElement.cpp +++ b/content/html/content/src/nsHTMLDataListElement.cpp @@ -74,7 +74,7 @@ public: nsGenericHTMLElement) virtual nsXPCClassInfo* GetClassInfo(); - + virtual nsIDOMNode* AsDOMNode() { return this; } protected: //