summaryrefslogtreecommitdiffstats
path: root/layout
diff options
context:
space:
mode:
Diffstat (limited to 'layout')
-rw-r--r--layout/base/MaskLayerImageCache.h1
-rw-r--r--layout/base/MobileViewportManager.h3
-rw-r--r--layout/base/PositionedEventTargeting.cpp1
-rw-r--r--layout/base/RestyleManager.cpp7
-rw-r--r--layout/base/RestyleManager.h6
-rw-r--r--layout/base/RestyleManagerBase.cpp18
-rw-r--r--layout/base/ServoRestyleManager.cpp1
-rw-r--r--layout/base/TouchManager.cpp2
-rw-r--r--layout/base/moz.build11
-rw-r--r--layout/base/nsCSSRendering.cpp11
-rw-r--r--layout/base/nsDisplayList.cpp65
-rw-r--r--layout/base/nsDisplayList.h75
-rw-r--r--layout/base/nsDocumentViewer.cpp2
-rw-r--r--layout/base/nsFrameTraversal.cpp1
-rw-r--r--layout/base/nsLayoutUtils.cpp7
-rw-r--r--layout/base/nsPresShell.cpp10
-rw-r--r--layout/build/moz.build7
-rw-r--r--layout/build/nsLayoutModule.cpp31
-rw-r--r--layout/build/nsLayoutStatics.cpp2
-rw-r--r--layout/forms/nsButtonFrameRenderer.cpp4
-rw-r--r--layout/forms/nsComboboxControlFrame.cpp13
-rw-r--r--layout/forms/nsComboboxControlFrame.h1
-rw-r--r--layout/forms/nsFieldSetFrame.cpp15
-rw-r--r--layout/forms/nsFieldSetFrame.h1
-rw-r--r--layout/forms/nsFileControlFrame.cpp3
-rw-r--r--layout/forms/nsFileControlFrame.h1
-rw-r--r--layout/forms/nsFormControlFrame.h1
-rw-r--r--layout/forms/nsGfxCheckboxControlFrame.cpp3
-rw-r--r--layout/forms/nsGfxCheckboxControlFrame.h1
-rw-r--r--layout/forms/nsGfxRadioControlFrame.cpp3
-rw-r--r--layout/forms/nsGfxRadioControlFrame.h1
-rw-r--r--layout/forms/nsHTMLButtonControlFrame.cpp5
-rw-r--r--layout/forms/nsHTMLButtonControlFrame.h1
-rw-r--r--layout/forms/nsListControlFrame.cpp3
-rw-r--r--layout/forms/nsListControlFrame.h1
-rw-r--r--layout/forms/nsProgressFrame.cpp3
-rw-r--r--layout/forms/nsProgressFrame.h1
-rw-r--r--layout/forms/nsRangeFrame.cpp5
-rw-r--r--layout/forms/nsRangeFrame.h1
-rw-r--r--layout/forms/nsSelectsAreaFrame.cpp10
-rw-r--r--layout/forms/nsSelectsAreaFrame.h2
-rw-r--r--layout/forms/nsTextControlFrame.cpp3
-rw-r--r--layout/forms/nsTextControlFrame.h1
-rw-r--r--layout/generic/CSSAlignUtils.h1
-rw-r--r--layout/generic/ReflowOutput.cpp2
-rw-r--r--layout/generic/RubyUtils.h1
-rw-r--r--layout/generic/ScrollSnap.h2
-rw-r--r--layout/generic/moz.build11
-rw-r--r--layout/generic/nsAbsoluteContainingBlock.cpp1
-rw-r--r--layout/generic/nsBRFrame.cpp1
-rw-r--r--layout/generic/nsBackdropFrame.cpp1
-rw-r--r--layout/generic/nsBackdropFrame.h1
-rw-r--r--layout/generic/nsBlockFrame.cpp31
-rw-r--r--layout/generic/nsBlockFrame.h1
-rw-r--r--layout/generic/nsBulletFrame.cpp1
-rw-r--r--layout/generic/nsBulletFrame.h1
-rw-r--r--layout/generic/nsCanvasFrame.cpp7
-rw-r--r--layout/generic/nsCanvasFrame.h1
-rw-r--r--layout/generic/nsColumnSetFrame.cpp3
-rw-r--r--layout/generic/nsColumnSetFrame.h1
-rw-r--r--layout/generic/nsContainerFrame.cpp11
-rw-r--r--layout/generic/nsContainerFrame.h7
-rw-r--r--layout/generic/nsFirstLetterFrame.cpp3
-rw-r--r--layout/generic/nsFirstLetterFrame.h1
-rw-r--r--layout/generic/nsFlexContainerFrame.cpp3
-rw-r--r--layout/generic/nsFlexContainerFrame.h1
-rw-r--r--layout/generic/nsFrame.cpp205
-rw-r--r--layout/generic/nsFrameSetFrame.cpp7
-rw-r--r--layout/generic/nsFrameSetFrame.h1
-rw-r--r--layout/generic/nsGfxScrollFrame.cpp62
-rw-r--r--layout/generic/nsGfxScrollFrame.h8
-rw-r--r--layout/generic/nsGridContainerFrame.cpp6
-rw-r--r--layout/generic/nsGridContainerFrame.h1
-rw-r--r--layout/generic/nsHTMLCanvasFrame.cpp1
-rw-r--r--layout/generic/nsHTMLCanvasFrame.h1
-rw-r--r--layout/generic/nsIFrame.h13
-rw-r--r--layout/generic/nsImageFrame.cpp139
-rw-r--r--layout/generic/nsImageFrame.h3
-rw-r--r--layout/generic/nsInlineFrame.cpp3
-rw-r--r--layout/generic/nsInlineFrame.h1
-rw-r--r--layout/generic/nsLeafFrame.h1
-rw-r--r--layout/generic/nsPageFrame.cpp20
-rw-r--r--layout/generic/nsPageFrame.h1
-rw-r--r--layout/generic/nsPlaceholderFrame.cpp1
-rw-r--r--layout/generic/nsPlaceholderFrame.h1
-rw-r--r--layout/generic/nsPluginFrame.cpp1
-rw-r--r--layout/generic/nsPluginFrame.h1
-rw-r--r--layout/generic/nsRubyBaseContainerFrame.cpp1
-rw-r--r--layout/generic/nsRubyTextFrame.cpp3
-rw-r--r--layout/generic/nsRubyTextFrame.h1
-rw-r--r--layout/generic/nsSimplePageSequenceFrame.cpp10
-rw-r--r--layout/generic/nsSimplePageSequenceFrame.h1
-rw-r--r--layout/generic/nsSubDocumentFrame.cpp34
-rw-r--r--layout/generic/nsSubDocumentFrame.h1
-rw-r--r--layout/generic/nsTextFrame.cpp1
-rw-r--r--layout/generic/nsTextFrame.h1
-rw-r--r--layout/generic/nsTextFrameUtils.cpp2
-rw-r--r--layout/generic/nsTextRunTransformations.cpp1
-rw-r--r--layout/generic/nsTextRunTransformations.h2
-rw-r--r--layout/generic/nsVideoFrame.cpp18
-rw-r--r--layout/generic/nsVideoFrame.h1
-rw-r--r--layout/generic/nsViewportFrame.cpp10
-rw-r--r--layout/generic/nsViewportFrame.h1
-rw-r--r--layout/ipc/RenderFrameParent.cpp1
-rw-r--r--layout/ipc/RenderFrameParent.h1
-rw-r--r--layout/mathml/nsMathMLChar.cpp3
-rw-r--r--layout/mathml/nsMathMLContainerFrame.cpp4
-rw-r--r--layout/mathml/nsMathMLContainerFrame.h1
-rw-r--r--layout/mathml/nsMathMLSelectedFrame.cpp5
-rw-r--r--layout/mathml/nsMathMLSelectedFrame.h1
-rw-r--r--layout/mathml/nsMathMLmencloseFrame.cpp3
-rw-r--r--layout/mathml/nsMathMLmencloseFrame.h1
-rw-r--r--layout/mathml/nsMathMLmfencedFrame.cpp3
-rw-r--r--layout/mathml/nsMathMLmfencedFrame.h1
-rw-r--r--layout/mathml/nsMathMLmfracFrame.cpp3
-rw-r--r--layout/mathml/nsMathMLmfracFrame.h1
-rw-r--r--layout/mathml/nsMathMLmoFrame.cpp3
-rw-r--r--layout/mathml/nsMathMLmoFrame.h1
-rw-r--r--layout/mathml/nsMathMLmrootFrame.cpp3
-rw-r--r--layout/mathml/nsMathMLmrootFrame.h1
-rw-r--r--layout/printing/ipc/RemotePrintJobParent.cpp1
-rw-r--r--layout/printing/ipc/RemotePrintJobParent.h2
-rw-r--r--layout/printing/moz.build3
-rw-r--r--layout/printing/nsPrintData.cpp2
-rw-r--r--layout/printing/nsPrintEngine.cpp3
-rw-r--r--layout/printing/nsPrintObject.cpp4
-rw-r--r--layout/reftests/backgrounds/really-big-background.html2
-rw-r--r--layout/reftests/bugs/521602.html3
-rw-r--r--layout/reftests/position-relative/1409114-1-ref.html12
-rw-r--r--layout/reftests/position-relative/1409114-1.html11
-rw-r--r--layout/reftests/position-relative/1409114-2.html13
-rw-r--r--layout/reftests/position-relative/1409114-3.html13
-rw-r--r--layout/reftests/position-relative/reftest.list3
-rw-r--r--layout/reftests/table-background/border-collapse-opacity-table-column-group-ref.html6
-rw-r--r--layout/reftests/table-background/border-collapse-opacity-table-column-ref.html6
-rw-r--r--layout/reftests/table-background/border-separate-opacity-table-column-group-ref.html6
-rw-r--r--layout/reftests/table-background/border-separate-opacity-table-column-ref.html6
-rw-r--r--layout/reftests/table-background/reftest.list3
-rw-r--r--layout/reftests/table-background/table-col-overlapping-ref.html28
-rw-r--r--layout/reftests/table-background/table-col-overlapping.html28
-rw-r--r--layout/reftests/table-background/table-col-span-1-ref.html15
-rw-r--r--layout/reftests/table-background/table-col-span-1.html15
-rw-r--r--layout/reftests/table-bordercollapse/bug1375518-2.html22
-rw-r--r--layout/reftests/table-bordercollapse/bug1375518-3.html22
-rw-r--r--layout/reftests/table-bordercollapse/bug1375518-4-ref.html44
-rw-r--r--layout/reftests/table-bordercollapse/bug1375518-4.html44
-rw-r--r--layout/reftests/table-bordercollapse/bug1375518-5-ref.html44
-rw-r--r--layout/reftests/table-bordercollapse/bug1375518-5.html44
-rw-r--r--layout/reftests/table-bordercollapse/bug1375518-ref.html17
-rw-r--r--layout/reftests/table-bordercollapse/bug1375518.html24
-rw-r--r--layout/reftests/table-bordercollapse/bug1394226-notref.html63
-rw-r--r--layout/reftests/table-bordercollapse/bug1394226-ref.html47
-rw-r--r--layout/reftests/table-bordercollapse/bug1394226.html47
-rw-r--r--layout/reftests/table-bordercollapse/reftest.list7
-rw-r--r--layout/style/CSSLexer.h1
-rw-r--r--layout/style/CSSStyleSheet.cpp1
-rw-r--r--layout/style/Declaration.cpp1
-rw-r--r--layout/style/RuleProcessorCache.cpp1
-rw-r--r--layout/style/ServoStyleSet.cpp1
-rw-r--r--layout/style/ServoStyleSheet.cpp4
-rw-r--r--layout/style/StyleRule.cpp1
-rw-r--r--layout/style/StyleSheet.cpp5
-rw-r--r--layout/style/moz.build12
-rw-r--r--layout/style/nsAnimationManager.cpp2
-rw-r--r--layout/style/nsCSSProps.h4
-rw-r--r--layout/style/nsCSSPseudoClassList.h2
-rw-r--r--layout/style/nsCSSPseudoClasses.cpp1
-rw-r--r--layout/style/nsCSSPseudoClasses.h2
-rw-r--r--layout/style/nsCSSScanner.cpp2
-rw-r--r--layout/style/nsCSSValue.cpp7
-rw-r--r--layout/style/nsComputedDOMStyle.cpp2
-rw-r--r--layout/style/nsDOMCSSAttrDeclaration.cpp5
-rw-r--r--layout/style/nsMediaFeatures.cpp1
-rw-r--r--layout/style/nsStyleContext.cpp3
-rw-r--r--layout/style/nsStyleStruct.cpp1
-rw-r--r--layout/style/nsStyleUtil.cpp1
-rw-r--r--layout/style/res/html.css1
-rw-r--r--layout/svg/SVGFEUnstyledLeafFrame.cpp1
-rw-r--r--layout/svg/SVGTextFrame.cpp2
-rw-r--r--layout/svg/SVGTextFrame.h1
-rw-r--r--layout/svg/moz.build2
-rw-r--r--layout/svg/nsFilterInstance.cpp1
-rw-r--r--layout/svg/nsISVGChildFrame.h1
-rw-r--r--layout/svg/nsSVGClipPathFrame.h1
-rw-r--r--layout/svg/nsSVGContainerFrame.cpp4
-rw-r--r--layout/svg/nsSVGContainerFrame.h2
-rw-r--r--layout/svg/nsSVGFilterFrame.h1
-rw-r--r--layout/svg/nsSVGFilterInstance.cpp1
-rw-r--r--layout/svg/nsSVGForeignObjectFrame.cpp3
-rw-r--r--layout/svg/nsSVGForeignObjectFrame.h1
-rw-r--r--layout/svg/nsSVGIntegrationUtils.h1
-rw-r--r--layout/svg/nsSVGMarkerFrame.cpp1
-rw-r--r--layout/svg/nsSVGMarkerFrame.h1
-rw-r--r--layout/svg/nsSVGMaskFrame.h1
-rw-r--r--layout/svg/nsSVGOuterSVGFrame.cpp6
-rw-r--r--layout/svg/nsSVGOuterSVGFrame.h1
-rw-r--r--layout/svg/nsSVGPaintServerFrame.h1
-rw-r--r--layout/svg/nsSVGPathGeometryFrame.cpp1
-rw-r--r--layout/svg/nsSVGPathGeometryFrame.h1
-rw-r--r--layout/svg/nsSVGStopFrame.cpp1
-rw-r--r--layout/svg/nsSVGSwitchFrame.cpp5
-rw-r--r--layout/svg/nsSVGUtils.cpp1
-rw-r--r--layout/tables/FixedTableLayoutStrategy.cpp4
-rw-r--r--layout/tables/SpanningCellSorter.cpp2
-rw-r--r--layout/tables/crashtests/crashtests.list2
-rw-r--r--layout/tables/moz.build2
-rw-r--r--layout/tables/nsTableCellFrame.cpp66
-rw-r--r--layout/tables/nsTableCellFrame.h5
-rw-r--r--layout/tables/nsTableColFrame.cpp9
-rw-r--r--layout/tables/nsTableColFrame.h1
-rw-r--r--layout/tables/nsTableColGroupFrame.cpp9
-rw-r--r--layout/tables/nsTableColGroupFrame.h1
-rw-r--r--layout/tables/nsTableFrame.cpp295
-rw-r--r--layout/tables/nsTableFrame.h97
-rw-r--r--layout/tables/nsTableRowFrame.cpp58
-rw-r--r--layout/tables/nsTableRowFrame.h6
-rw-r--r--layout/tables/nsTableRowGroupFrame.cpp50
-rw-r--r--layout/tables/nsTableRowGroupFrame.h1
-rw-r--r--layout/tables/nsTableWrapperFrame.cpp20
-rw-r--r--layout/tables/nsTableWrapperFrame.h2
-rw-r--r--layout/xul/ContainerBoxObject.h1
-rw-r--r--layout/xul/grid/moz.build2
-rw-r--r--layout/xul/moz.build4
-rw-r--r--layout/xul/nsBoxFrame.cpp8
-rw-r--r--layout/xul/nsBoxFrame.h2
-rw-r--r--layout/xul/nsButtonBoxFrame.cpp4
-rw-r--r--layout/xul/nsButtonBoxFrame.h1
-rw-r--r--layout/xul/nsDeckFrame.cpp6
-rw-r--r--layout/xul/nsDeckFrame.h2
-rw-r--r--layout/xul/nsGroupBoxFrame.cpp7
-rw-r--r--layout/xul/nsImageBoxFrame.cpp3
-rw-r--r--layout/xul/nsImageBoxFrame.h1
-rw-r--r--layout/xul/nsLeafBoxFrame.cpp1
-rw-r--r--layout/xul/nsLeafBoxFrame.h1
-rw-r--r--layout/xul/nsListItemFrame.cpp3
-rw-r--r--layout/xul/nsListItemFrame.h1
-rw-r--r--layout/xul/nsMenuBarListener.cpp1
-rw-r--r--layout/xul/nsMenuFrame.cpp8
-rw-r--r--layout/xul/nsMenuFrame.h1
-rw-r--r--layout/xul/nsMenuPopupFrame.cpp3
-rw-r--r--layout/xul/nsResizerFrame.h3
-rw-r--r--layout/xul/nsRootBoxFrame.cpp8
-rw-r--r--layout/xul/nsSliderFrame.cpp10
-rw-r--r--layout/xul/nsSliderFrame.h2
-rw-r--r--layout/xul/nsSplitterFrame.cpp3
-rw-r--r--layout/xul/nsSplitterFrame.h1
-rw-r--r--layout/xul/nsStackFrame.cpp4
-rw-r--r--layout/xul/nsStackFrame.h1
-rw-r--r--layout/xul/nsTextBoxFrame.cpp3
-rw-r--r--layout/xul/nsTextBoxFrame.h1
-rw-r--r--layout/xul/nsTitleBarFrame.cpp3
-rw-r--r--layout/xul/nsTitleBarFrame.h1
-rw-r--r--layout/xul/tree/moz.build2
-rw-r--r--layout/xul/tree/nsTreeBodyFrame.cpp3
-rw-r--r--layout/xul/tree/nsTreeBodyFrame.h1
-rw-r--r--layout/xul/tree/nsTreeColFrame.cpp7
-rw-r--r--layout/xul/tree/nsTreeColFrame.h1
257 files changed, 1494 insertions, 1001 deletions
diff --git a/layout/base/MaskLayerImageCache.h b/layout/base/MaskLayerImageCache.h
index b18fe5aa1..61881de83 100644
--- a/layout/base/MaskLayerImageCache.h
+++ b/layout/base/MaskLayerImageCache.h
@@ -10,6 +10,7 @@
#include "nsAutoPtr.h"
#include "nsPresContext.h"
#include "mozilla/gfx/Matrix.h"
+#include "mozilla/layers/ShadowLayers.h"
namespace mozilla {
diff --git a/layout/base/MobileViewportManager.h b/layout/base/MobileViewportManager.h
index 63128b281..6324a8645 100644
--- a/layout/base/MobileViewportManager.h
+++ b/layout/base/MobileViewportManager.h
@@ -7,8 +7,11 @@
#define MobileViewportManager_h_
#include "mozilla/Maybe.h"
+#include "nsIDocument.h"
#include "nsIDOMEventListener.h"
+#include "nsIDOMEventTarget.h"
#include "nsIObserver.h"
+#include "nsViewportInfo.h"
#include "Units.h"
class nsIDOMEventTarget;
diff --git a/layout/base/PositionedEventTargeting.cpp b/layout/base/PositionedEventTargeting.cpp
index 8374ab9d2..668ff2938 100644
--- a/layout/base/PositionedEventTargeting.cpp
+++ b/layout/base/PositionedEventTargeting.cpp
@@ -8,6 +8,7 @@
#include "mozilla/EventStates.h"
#include "mozilla/MouseEvents.h"
#include "mozilla/Preferences.h"
+#include "nsIContentInlines.h"
#include "nsLayoutUtils.h"
#include "nsGkAtoms.h"
#include "nsFontMetrics.h"
diff --git a/layout/base/RestyleManager.cpp b/layout/base/RestyleManager.cpp
index 124b5535e..a5a4e1237 100644
--- a/layout/base/RestyleManager.cpp
+++ b/layout/base/RestyleManager.cpp
@@ -239,11 +239,6 @@ RestyleManager::AnimationsWithDestroyedFrame::StopAnimationsWithoutFrame(
}
}
-static inline dom::Element*
-ElementForStyleContext(nsIContent* aParentContent,
- nsIFrame* aFrame,
- CSSPseudoElementType aPseudoType);
-
// Forwarded nsIDocumentObserver method, to handle restyling (and
// passing the notification to the frame).
nsresult
@@ -1008,7 +1003,7 @@ RestyleManager::TryInitiatingTransition(nsPresContext* aPresContext,
return *aNewStyleContext != sc;
}
-static dom::Element*
+dom::Element*
ElementForStyleContext(nsIContent* aParentContent,
nsIFrame* aFrame,
CSSPseudoElementType aPseudoType)
diff --git a/layout/base/RestyleManager.h b/layout/base/RestyleManager.h
index e22fe9058..4886d77bc 100644
--- a/layout/base/RestyleManager.h
+++ b/layout/base/RestyleManager.h
@@ -191,6 +191,7 @@ public:
MOZ_ASSERT(false, "unexpected aPseudoType");
return nullptr;
}
+
private:
RestyleManager* mRestyleManager;
AutoRestore<ReframingStyleContexts*> mRestorePointer;
@@ -880,6 +881,11 @@ private:
AutoTArray<mozilla::dom::Element*, 4> mAncestors;
};
+dom::Element*
+ElementForStyleContext(nsIContent* aParentContent,
+ nsIFrame* aFrame,
+ CSSPseudoElementType aPseudoType);
+
} // namespace mozilla
#endif /* mozilla_RestyleManager_h */
diff --git a/layout/base/RestyleManagerBase.cpp b/layout/base/RestyleManagerBase.cpp
index 6ef048a19..e2145934b 100644
--- a/layout/base/RestyleManagerBase.cpp
+++ b/layout/base/RestyleManagerBase.cpp
@@ -5,8 +5,26 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/RestyleManagerBase.h"
+#include "mozilla/RestyleManager.h"
#include "mozilla/StyleSetHandle.h"
+#include "mozilla/StyleSetHandleInlines.h" // for Ptr::HasStateDependentStyle
+#include "ActiveLayerTracker.h"
+#include "nsCSSFrameConstructor.h"
+#include "nsCSSRendering.h"
#include "nsIFrame.h"
+#include "nsIFrameInlines.h" // for IsAbsPosContainingBlock
+#include "nsPlaceholderFrame.h"
+#include "nsStyleChangeList.h"
+#include "nsStyleStructInlines.h" // for HasTransform
+#include "nsSVGEffects.h"
+#include "nsSVGIntegrationUtils.h"
+#include "nsSVGUtils.h"
+#include "nsViewportFrame.h"
+#include "StickyScrollContainer.h"
+#include "SVGTextFrame.h"
+
+using namespace mozilla;
+using namespace mozilla::layers;
namespace mozilla {
diff --git a/layout/base/ServoRestyleManager.cpp b/layout/base/ServoRestyleManager.cpp
index 42ca23bb1..82c81ea46 100644
--- a/layout/base/ServoRestyleManager.cpp
+++ b/layout/base/ServoRestyleManager.cpp
@@ -9,6 +9,7 @@
#include "mozilla/ServoStyleSet.h"
#include "mozilla/dom/ChildIterator.h"
#include "nsContentUtils.h"
+#include "nsCSSFrameConstructor.h"
#include "nsPrintfCString.h"
#include "nsStyleChangeList.h"
diff --git a/layout/base/TouchManager.cpp b/layout/base/TouchManager.cpp
index 5167ca588..e7972d5af 100644
--- a/layout/base/TouchManager.cpp
+++ b/layout/base/TouchManager.cpp
@@ -12,6 +12,8 @@
#include "nsPresShell.h"
#include "nsView.h"
+using namespace mozilla::dom;
+
namespace mozilla {
nsDataHashtable<nsUint32HashKey, TouchManager::TouchInfo>* TouchManager::sCaptureTouchList;
diff --git a/layout/base/moz.build b/layout/base/moz.build
index afc683665..f115280ce 100644
--- a/layout/base/moz.build
+++ b/layout/base/moz.build
@@ -119,7 +119,7 @@ EXPORTS.mozilla += [
'StaticPresData.h',
]
-UNIFIED_SOURCES += [
+SOURCES += [
'AccessibleCaret.cpp',
'AccessibleCaretEventHub.cpp',
'AccessibleCaretManager.cpp',
@@ -151,9 +151,11 @@ UNIFIED_SOURCES += [
'nsLayoutDebugger.cpp',
'nsLayoutHistoryState.cpp',
'nsLayoutUtils.cpp',
+ 'nsPresArena.cpp',
'nsPresContext.cpp',
'nsPresShell.cpp',
'nsQuoteList.cpp',
+ 'nsRefreshDriver.cpp',
'nsStyleChangeList.cpp',
'nsStyleSheetService.cpp',
'PaintTracker.cpp',
@@ -169,13 +171,6 @@ UNIFIED_SOURCES += [
'ZoomConstraintsClient.cpp',
]
-# nsPresArena.cpp needs to be built separately because it uses plarena.h.
-# nsRefreshDriver.cpp needs to be built separately because of name clashes in the OS X headers
-SOURCES += [
- 'nsPresArena.cpp',
- 'nsRefreshDriver.cpp',
-]
-
if CONFIG['ENABLE_TESTS']:
DIRS += ['gtest']
diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp
index 119c6c8a2..9a827546f 100644
--- a/layout/base/nsCSSRendering.cpp
+++ b/layout/base/nsCSSRendering.cpp
@@ -1903,8 +1903,15 @@ nsCSSRendering::GetImageLayerClip(const nsStyleImageLayers::Layer& aLayer,
nsRect clipBorderArea =
::BoxDecorationRectForBorder(aForFrame, aBorderArea, skipSides, &aBorder);
- bool haveRoundedCorners = GetRadii(aForFrame, aBorder, aBorderArea,
- clipBorderArea, aClipState->mRadii);
+ bool haveRoundedCorners = false;
+ nsIAtom* fType = aForFrame->GetType();
+ if (fType != nsGkAtoms::tableColGroupFrame &&
+ fType != nsGkAtoms::tableColFrame &&
+ fType != nsGkAtoms::tableRowFrame &&
+ fType != nsGkAtoms::tableRowGroupFrame) {
+ haveRoundedCorners = GetRadii(aForFrame, aBorder, aBorderArea,
+ clipBorderArea, aClipState->mRadii);
+ }
bool isSolidBorder =
aWillPaintBorder && IsOpaqueBorder(aBorder);
diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp
index 8a34d108f..73e991246 100644
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -721,7 +721,6 @@ nsDisplayListBuilder::nsDisplayListBuilder(nsIFrame* aReferenceFrame,
: mReferenceFrame(aReferenceFrame),
mIgnoreScrollFrame(nullptr),
mLayerEventRegions(nullptr),
- mCurrentTableItem(nullptr),
mCurrentFrame(aReferenceFrame),
mCurrentReferenceFrame(aReferenceFrame),
mCurrentAGR(&mRootAGR),
@@ -731,6 +730,7 @@ nsDisplayListBuilder::nsDisplayListBuilder(nsIFrame* aReferenceFrame,
mGlassDisplayItem(nullptr),
mScrollInfoItemsForHoisting(nullptr),
mMode(aMode),
+ mTableBackgroundSet(nullptr),
mCurrentScrollParentId(FrameMetrics::NULL_SCROLL_ID),
mCurrentScrollbarTarget(FrameMetrics::NULL_SCROLL_ID),
mCurrentScrollbarFlags(0),
@@ -864,10 +864,9 @@ nsDisplayListBuilder::FindAnimatedGeometryRootFor(nsDisplayItem* aItem)
void nsDisplayListBuilder::MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame,
- nsIFrame* aFrame,
- const nsRect& aDirtyRect)
+ nsIFrame* aFrame)
{
- nsRect dirtyRectRelativeToDirtyFrame = aDirtyRect;
+ nsRect dirtyRectRelativeToDirtyFrame = GetDirtyRect();
if (nsLayoutUtils::IsFixedPosFrameInDisplayPort(aFrame) &&
IsPaintingToWindow()) {
NS_ASSERTION(aDirtyFrame == aFrame->GetParent(), "Dirty frame should be viewport frame");
@@ -882,6 +881,7 @@ void nsDisplayListBuilder::MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame,
dirtyRectRelativeToDirtyFrame.SizeTo(aDirtyFrame->GetSize());
}
}
+
nsRect dirty = dirtyRectRelativeToDirtyFrame - aFrame->GetOffsetTo(aDirtyFrame);
nsRect overflowRect = aFrame->GetVisualOverflowRect();
@@ -925,7 +925,6 @@ nsDisplayListBuilder::~nsDisplayListBuilder() {
"All frames should have been unmarked");
NS_ASSERTION(mPresShellStates.Length() == 0,
"All presshells should have been exited");
- NS_ASSERTION(!mCurrentTableItem, "No table item should be active");
nsCSSRendering::EndFrameTreesLocked();
@@ -1008,8 +1007,22 @@ nsDisplayListBuilder::EnterPresShell(nsIFrame* aReferenceFrame,
}
state->mInsidePointerEventsNoneDoc = pointerEventsNone;
- if (!buildCaret)
+ state->mPresShellIgnoreScrollFrame =
+ state->mPresShell->IgnoringViewportScrolling()
+ ? state->mPresShell->GetRootScrollFrame()
+ : nullptr;
+
+ nsPresContext* pc = aReferenceFrame->PresContext();
+ nsCOMPtr<nsIDocShell> docShell = pc->GetDocShell();
+ if (docShell) {
+ docShell->GetWindowDraggingAllowed(&mWindowDraggingAllowed);
+ }
+
+ mIsInChromePresContext = pc->IsChrome();
+
+ if (!buildCaret) {
return;
+ }
RefPtr<nsCaret> caret = state->mPresShell->GetCaret();
state->mCaretFrame = caret->GetPaintGeometry(&state->mCaretRect);
@@ -1017,13 +1030,6 @@ nsDisplayListBuilder::EnterPresShell(nsIFrame* aReferenceFrame,
mFramesMarkedForDisplay.AppendElement(state->mCaretFrame);
MarkFrameForDisplay(state->mCaretFrame, nullptr);
}
-
- nsPresContext* pc = aReferenceFrame->PresContext();
- nsCOMPtr<nsIDocShell> docShell = pc->GetDocShell();
- if (docShell) {
- docShell->GetWindowDraggingAllowed(&mWindowDraggingAllowed);
- }
- mIsInChromePresContext = pc->IsChrome();
}
// A non-blank paint is a paint that does not just contain the canvas background.
@@ -1094,8 +1100,7 @@ nsDisplayListBuilder::ResetMarkedFramesForDisplayList()
void
nsDisplayListBuilder::MarkFramesForDisplayList(nsIFrame* aDirtyFrame,
- const nsFrameList& aFrames,
- const nsRect& aDirtyRect) {
+ const nsFrameList& aFrames) {
for (nsIFrame* e : aFrames) {
// Skip the AccessibleCaret frame when building no caret.
if (!IsBuildingCaret()) {
@@ -1107,9 +1112,8 @@ nsDisplayListBuilder::MarkFramesForDisplayList(nsIFrame* aDirtyFrame,
}
}
}
-
mFramesMarkedForDisplay.AppendElement(e);
- MarkOutOfFlowFrameForDisplay(aDirtyFrame, e, aDirtyRect);
+ MarkOutOfFlowFrameForDisplay(aDirtyFrame, e);
}
}
@@ -2573,8 +2577,7 @@ static nsStyleContext* GetBackgroundStyleContext(nsIFrame* aFrame)
/* static */ void
SetBackgroundClipRegion(DisplayListClipState::AutoSaveRestore& aClipState,
- nsIFrame* aFrame, const nsPoint& aToReferenceFrame,
- const nsStyleImageLayers::Layer& aLayer,
+ nsIFrame* aFrame, const nsStyleImageLayers::Layer& aLayer,
const nsRect& aBackgroundRect,
bool aWillPaintBorder)
{
@@ -2626,7 +2629,6 @@ SpecialCutoutRegionCase(nsDisplayListBuilder* aBuilder,
return true;
}
-
/*static*/ bool
nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame,
@@ -2635,14 +2637,16 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil
bool aAllowWillPaintBorderOptimization,
nsStyleContext* aStyleContext,
const nsRect& aBackgroundOriginRect,
- nsIFrame* aSecondaryReferenceFrame)
+ nsIFrame* aSecondaryReferenceFrame,
+ Maybe<nsDisplayListBuilder::AutoBuildingDisplayList>*
+ aAutoBuildingDisplayList)
{
nsStyleContext* bgSC = aStyleContext;
const nsStyleBackground* bg = nullptr;
- nsRect bgRect = aBackgroundRect + aBuilder->ToReferenceFrame(aFrame);
+ nsRect bgRect = aBackgroundRect;
nsRect bgOriginRect = bgRect;
if (!aBackgroundOriginRect.IsEmpty()) {
- bgOriginRect = aBackgroundOriginRect + aBuilder->ToReferenceFrame(aFrame);
+ bgOriginRect = aBackgroundOriginRect;
}
nsPresContext* presContext = aFrame->PresContext();
bool isThemed = aFrame->IsThemed();
@@ -2678,8 +2682,6 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil
!isThemed && !hasInsetShadow &&
borderStyle->HasBorder();
- nsPoint toRef = aBuilder->ToReferenceFrame(aFrame);
-
// An auxiliary list is necessary in case we have background blending; if that
// is the case, background items need to be wrapped by a blend container to
// isolate blending to the background
@@ -2688,6 +2690,9 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil
// to create an item for hit testing.
if ((drawBackgroundColor && color != NS_RGBA(0,0,0,0)) ||
aBuilder->IsForEventDelivery()) {
+ if (aAutoBuildingDisplayList && !*aAutoBuildingDisplayList) {
+ aAutoBuildingDisplayList->emplace(aBuilder, aFrame);
+ }
DisplayListClipState::AutoSaveRestore clipState(aBuilder);
if (bg && !aBuilder->IsForEventDelivery()) {
// Disable the will-paint-border optimization for background
@@ -2699,7 +2704,7 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil
// artifacts along the rounded corners.
bool useWillPaintBorderOptimization = willPaintBorder &&
nsLayoutUtils::HasNonZeroCorner(borderStyle->mBorderRadius);
- SetBackgroundClipRegion(clipState, aFrame, toRef,
+ SetBackgroundClipRegion(clipState, aFrame,
bg->BottomLayer(), bgRect,
useWillPaintBorderOptimization);
}
@@ -2752,6 +2757,10 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil
continue;
}
+ if (aAutoBuildingDisplayList && !*aAutoBuildingDisplayList) {
+ aAutoBuildingDisplayList->emplace(aBuilder, aFrame);
+ }
+
if (bg->mImage.mLayers[i].mBlendMode != NS_STYLE_BLEND_NORMAL) {
needBlendContainer = true;
}
@@ -2759,8 +2768,8 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil
DisplayListClipState::AutoSaveRestore clipState(aBuilder);
if (!aBuilder->IsForEventDelivery()) {
const nsStyleImageLayers::Layer& layer = bg->mImage.mLayers[i];
- SetBackgroundClipRegion(clipState, aFrame, toRef,
- layer, bgRect, willPaintBorder);
+ SetBackgroundClipRegion(clipState, aFrame, layer, bgRect,
+ willPaintBorder);
}
nsDisplayList thisItemList;
diff --git a/layout/base/nsDisplayList.h b/layout/base/nsDisplayList.h
index 9cee7b517..9eac132fa 100644
--- a/layout/base/nsDisplayList.h
+++ b/layout/base/nsDisplayList.h
@@ -48,6 +48,7 @@ class nsISelection;
class nsIScrollableFrame;
class nsDisplayLayerEventRegions;
class nsDisplayScrollInfoLayer;
+class nsDisplayTableBackgroundSet;
class nsCaret;
namespace mozilla {
@@ -444,6 +445,10 @@ public:
* BuildDisplayList on right now).
*/
const nsRect& GetDirtyRect() { return mDirtyRect; }
+
+ void SetDirtyRect(const nsRect& aDirtyRect) { mDirtyRect = aDirtyRect; }
+ void IntersectDirtyRect(const nsRect& aDirtyRect) { mDirtyRect.IntersectRect(mDirtyRect, aDirtyRect); }
+
const nsIFrame* GetCurrentFrame() { return mCurrentFrame; }
const nsIFrame* GetCurrentReferenceFrame() { return mCurrentReferenceFrame; }
const nsPoint& GetCurrentFrameOffsetToReferenceFrame() { return mCurrentOffsetToReferenceFrame; }
@@ -493,11 +498,10 @@ public:
/**
* Display the caret if needed.
*/
- void DisplayCaret(nsIFrame* aFrame, const nsRect& aDirtyRect,
- nsDisplayList* aList) {
+ void DisplayCaret(nsIFrame* aFrame, nsDisplayList* aList) {
nsIFrame* frame = GetCaretFrame();
if (aFrame == frame) {
- frame->DisplayCaret(this, aDirtyRect, aList);
+ frame->DisplayCaret(this, aList);
}
}
/**
@@ -517,6 +521,14 @@ public:
* Get the caret associated with the current presshell.
*/
nsCaret* GetCaret();
+
+ /**
+ * Returns the root scroll frame for the current PresShell, if the PresShell
+ * is ignoring viewport scrolling.
+ */
+ nsIFrame* GetPresShellIgnoreScrollFrame() {
+ return CurrentPresShellState()->mPresShellIgnoreScrollFrame;
+ }
/**
* Notify the display list builder that we're entering a presshell.
* aReferenceFrame should be a frame in the new presshell.
@@ -577,6 +589,16 @@ public:
mSyncDecodeImages = aSyncDecodeImages;
}
+ nsDisplayTableBackgroundSet* SetTableBackgroundSet(
+ nsDisplayTableBackgroundSet* aTableSet) {
+ nsDisplayTableBackgroundSet* old = mTableBackgroundSet;
+ mTableBackgroundSet = aTableSet;
+ return old;
+ }
+ nsDisplayTableBackgroundSet* GetTableBackgroundSet() const {
+ return mTableBackgroundSet;
+ }
+
/**
* Helper method to generate background painting flags based on the
* information available in the display list builder. Currently only
@@ -602,8 +624,7 @@ public:
* destroyed.
*/
void MarkFramesForDisplayList(nsIFrame* aDirtyFrame,
- const nsFrameList& aFrames,
- const nsRect& aDirtyRect);
+ const nsFrameList& aFrames);
/**
* Mark all child frames that Preserve3D() as needing display.
* Because these frames include transforms set on their parent, dirty rects
@@ -700,8 +721,12 @@ public:
friend class AutoBuildingDisplayList;
class AutoBuildingDisplayList {
public:
- AutoBuildingDisplayList(nsDisplayListBuilder* aBuilder,
- nsIFrame* aForChild,
+
+ AutoBuildingDisplayList(nsDisplayListBuilder* aBuilder, nsIFrame* aForChild)
+ : AutoBuildingDisplayList(
+ aBuilder, aForChild, aBuilder->GetDirtyRect(), aForChild->IsTransformed()){}
+
+ AutoBuildingDisplayList(nsDisplayListBuilder* aBuilder, nsIFrame* aForChild,
const nsRect& aDirtyRect, bool aIsRoot)
: mBuilder(aBuilder),
mPrevFrame(aBuilder->mCurrentFrame),
@@ -803,10 +828,11 @@ public:
friend class AutoSaveRestorePerspectiveIndex;
class AutoSaveRestorePerspectiveIndex {
public:
- AutoSaveRestorePerspectiveIndex(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame)
+ AutoSaveRestorePerspectiveIndex(nsDisplayListBuilder* aBuilder,
+ const bool aChildrenHavePerspective)
: mBuilder(nullptr)
{
- if (aFrame->ChildrenHavePerspective()) {
+ if (aChildrenHavePerspective) {
mBuilder = aBuilder;
mCachedItemIndex = aBuilder->mPerspectiveItemIndex;
aBuilder->mPerspectiveItemIndex = 0;
@@ -981,10 +1007,6 @@ public:
return mPreserves3DCtx.mAccumulatedRectLevels;
}
- // Helpers for tables
- nsDisplayTableItem* GetCurrentTableItem() { return mCurrentTableItem; }
- void SetCurrentTableItem(nsDisplayTableItem* aTableItem) { mCurrentTableItem = aTableItem; }
-
struct OutOfFlowDisplayData {
OutOfFlowDisplayData(const DisplayItemClip* aContainingBlockClip,
const DisplayItemScrollClip* aContainingBlockScrollClip,
@@ -1120,11 +1142,11 @@ public:
Preserves3DContext mSavedCtx;
};
- const nsRect GetPreserves3DDirtyRect(const nsIFrame *aFrame) const {
+ const nsRect GetPreserves3DRects() const {
return mPreserves3DCtx.mDirtyRect;
}
- void SetPreserves3DDirtyRect(const nsRect &aDirtyRect) {
- mPreserves3DCtx.mDirtyRect = aDirtyRect;
+ void SavePreserves3DRects() {
+ mPreserves3DCtx.mDirtyRect = mDirtyRect;
}
bool IsBuildingInvisibleItems() const { return mBuildingInvisibleItems; }
@@ -1133,8 +1155,7 @@ public:
}
private:
- void MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame, nsIFrame* aFrame,
- const nsRect& aDirtyRect);
+ void MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame, nsIFrame* aFrame);
/**
* Returns whether a frame acts as an animated geometry root, optionally
@@ -1178,6 +1199,7 @@ private:
// in the document, and is set when we enter a subdocument for a pointer-
// events:none frame.
bool mInsidePointerEventsNoneDoc;
+ nsIFrame* mPresShellIgnoreScrollFrame;
};
PresShellState* CurrentPresShellState() {
@@ -1202,7 +1224,6 @@ private:
AutoTArray<PresShellState,8> mPresShellStates;
AutoTArray<nsIFrame*,400> mFramesMarkedForDisplay;
AutoTArray<ThemeGeometry,2> mThemeGeometries;
- nsDisplayTableItem* mCurrentTableItem;
DisplayListClipState mClipState;
// mCurrentFrame is the frame that we're currently calling (or about to call)
// BuildDisplayList on.
@@ -1245,6 +1266,7 @@ private:
nsTArray<DisplayItemScrollClip*> mScrollClipsToDestroy;
nsTArray<DisplayItemClip*> mDisplayItemClipsToDestroy;
nsDisplayListBuilderMode mMode;
+ nsDisplayTableBackgroundSet* mTableBackgroundSet;
ViewID mCurrentScrollParentId;
ViewID mCurrentScrollbarTarget;
uint32_t mCurrentScrollbarFlags;
@@ -2287,12 +2309,13 @@ protected:
* to the object, and all distinct.
*/
struct nsDisplayListCollection : public nsDisplayListSet {
- nsDisplayListCollection() :
- nsDisplayListSet(&mLists[0], &mLists[1], &mLists[2], &mLists[3], &mLists[4],
- &mLists[5]) {}
- explicit nsDisplayListCollection(nsDisplayList* aBorderBackground) :
- nsDisplayListSet(aBorderBackground, &mLists[1], &mLists[2], &mLists[3], &mLists[4],
+ explicit nsDisplayListCollection(nsDisplayListBuilder* aBuilder)
+ : nsDisplayListSet(&mLists[0], &mLists[1], &mLists[2], &mLists[3], &mLists[4],
&mLists[5]) {}
+ explicit nsDisplayListCollection(nsDisplayListBuilder* aBuilder,
+ nsDisplayList* aBorderBackground)
+ : nsDisplayListSet(aBorderBackground, &mLists[1], &mLists[2], &mLists[3], &mLists[4],
+ &mLists[5]) {}
/**
* Sort all lists by content order.
@@ -2739,7 +2762,9 @@ public:
bool aAllowWillPaintBorderOptimization = true,
nsStyleContext* aStyleContext = nullptr,
const nsRect& aBackgroundOriginRect = nsRect(),
- nsIFrame* aSecondaryReferenceFrame = nullptr);
+ nsIFrame* aSecondaryReferenceFrame = nullptr,
+ mozilla::Maybe<nsDisplayListBuilder::AutoBuildingDisplayList>*
+ aAutoBuildingDisplayList = nullptr);
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
diff --git a/layout/base/nsDocumentViewer.cpp b/layout/base/nsDocumentViewer.cpp
index 8baf1a464..df0f1266d 100644
--- a/layout/base/nsDocumentViewer.cpp
+++ b/layout/base/nsDocumentViewer.cpp
@@ -544,10 +544,12 @@ nsDocumentViewer::~nsDocumentViewer()
mDocument->Destroy();
}
+#ifdef NS_PRINTING
if (mPrintEngine) {
mPrintEngine->Destroy();
mPrintEngine = nullptr;
}
+#endif
MOZ_RELEASE_ASSERT(mDestroyRefCount == 0);
NS_ASSERTION(!mPresShell && !mPresContext,
diff --git a/layout/base/nsFrameTraversal.cpp b/layout/base/nsFrameTraversal.cpp
index 40fb5ff30..ab07d07df 100644
--- a/layout/base/nsFrameTraversal.cpp
+++ b/layout/base/nsFrameTraversal.cpp
@@ -10,6 +10,7 @@
#include "nsPlaceholderFrame.h"
#include "nsContainerFrame.h"
+using namespace mozilla;
class nsFrameIterator : public nsIFrameEnumerator
{
diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp
index 21d20c69f..fb0b42a6c 100644
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -118,6 +118,7 @@
#include "mozilla/StyleSetHandleInlines.h"
#include "RegionBuilder.h"
#include "SVGSVGElement.h"
+#include "nsDocument.h"
#ifdef MOZ_XUL
#include "nsXULPopupManager.h"
@@ -3189,7 +3190,8 @@ nsLayoutUtils::GetFramesForArea(nsIFrame* aFrame, const nsRect& aRect,
}
builder.EnterPresShell(aFrame);
- aFrame->BuildDisplayListForStackingContext(&builder, aRect, &list);
+ builder.SetDirtyRect(aRect);
+ aFrame->BuildDisplayListForStackingContext(&builder, &list);
builder.LeavePresShell(aFrame, nullptr);
#ifdef MOZ_DUMP_PAINTING
@@ -3538,7 +3540,8 @@ nsLayoutUtils::PaintFrame(nsRenderingContext* aRenderingContext, nsIFrame* aFram
PROFILER_LABEL("nsLayoutUtils", "PaintFrame::BuildDisplayList",
js::ProfileEntry::Category::GRAPHICS);
- aFrame->BuildDisplayListForStackingContext(&builder, dirtyRect, &list);
+ builder.SetDirtyRect(dirtyRect);
+ aFrame->BuildDisplayListForStackingContext(&builder, &list);
}
nsIAtom* frameType = aFrame->GetType();
diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp
index 264b52b18..63f512af4 100644
--- a/layout/base/nsPresShell.cpp
+++ b/layout/base/nsPresShell.cpp
@@ -58,6 +58,7 @@
#include "nsNameSpaceManager.h" // for Pref-related rule management (bugs 22963,20760,31816)
#include "nsFrame.h"
#include "FrameLayerBuilder.h"
+#include "FrameMetrics.h" // for ViewID
#include "nsViewManager.h"
#include "nsView.h"
#include "nsCRTGlue.h"
@@ -162,11 +163,12 @@
#endif
-#include "mozilla/layers/CompositorBridgeChild.h"
#include "GeckoProfiler.h"
#include "gfxPlatform.h"
#include "Layers.h"
#include "LayerTreeInvalidation.h"
+#include "ClientLayerManager.h"
+#include "mozilla/layers/CompositorBridgeChild.h"
#include "mozilla/css/ImageLoader.h"
#include "mozilla/dom/DocumentTimeline.h"
#include "mozilla/Preferences.h"
@@ -221,6 +223,8 @@ using namespace mozilla::gfx;
using namespace mozilla::layout;
using PaintFrameFlags = nsLayoutUtils::PaintFrameFlags;
+typedef FrameMetrics::ViewID ViewID;
+
CapturingContentInfo nsIPresShell::gCaptureInfo =
{ false /* mAllowed */, false /* mPointerLock */, false /* mRetargetToElement */,
false /* mPreventDrag */ };
@@ -4894,8 +4898,8 @@ PresShell::CreateRangePaintInfo(nsIDOMRange* aRange,
nsIFrame* frame = aNode->AsContent()->GetPrimaryFrame();
// XXX deal with frame being null due to display:contents
for (; frame; frame = nsLayoutUtils::GetNextContinuationOrIBSplitSibling(frame)) {
- frame->BuildDisplayListForStackingContext(&info->mBuilder,
- frame->GetVisualOverflowRect(), &info->mList);
+ info->mBuilder.SetDirtyRect(frame->GetVisualOverflowRect());
+ frame->BuildDisplayListForStackingContext(&info->mBuilder, &info->mList);
}
};
if (startParent->NodeType() == nsIDOMNode::TEXT_NODE) {
diff --git a/layout/build/moz.build b/layout/build/moz.build
index 360fe3c97..b98e8265a 100644
--- a/layout/build/moz.build
+++ b/layout/build/moz.build
@@ -76,16 +76,9 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
if CONFIG['MOZ_WEBSPEECH']:
LOCAL_INCLUDES += [
- '/dom/media/webspeech/recognition',
'/dom/media/webspeech/synth',
]
-if CONFIG['MOZ_WEBSPEECH_POCKETSPHINX']:
- LOCAL_INCLUDES += [
- '/media/pocketsphinx',
- '/media/sphinxbase',
- ]
-
if CONFIG['MOZ_SECUREELEMENT']:
LOCAL_INCLUDES += [
'/dom/secureelement',
diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp
index 4455da122..8a078194c 100644
--- a/layout/build/nsLayoutModule.cpp
+++ b/layout/build/nsLayoutModule.cpp
@@ -91,12 +91,6 @@
#include "mozilla/OSFileConstants.h"
#include "mozilla/Services.h"
-#ifdef MOZ_WEBSPEECH_TEST_BACKEND
-#include "mozilla/dom/FakeSpeechRecognitionService.h"
-#endif
-#ifdef MOZ_WEBSPEECH_POCKETSPHINX
-#include "mozilla/dom/PocketSphinxSpeechRecognitionService.h"
-#endif
#ifdef MOZ_WEBSPEECH
#include "mozilla/dom/nsSynthVoiceRegistry.h"
#endif
@@ -514,13 +508,6 @@ NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(AudioChannelService, AudioChannelServic
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(WebSocketEventService, WebSocketEventService::GetOrCreate)
-#ifdef MOZ_WEBSPEECH_TEST_BACKEND
-NS_GENERIC_FACTORY_CONSTRUCTOR(FakeSpeechRecognitionService)
-#endif
-#ifdef MOZ_WEBSPEECH_POCKETSPHINX
-NS_GENERIC_FACTORY_CONSTRUCTOR(PocketSphinxSpeechRecognitionService)
-#endif
-
NS_GENERIC_FACTORY_CONSTRUCTOR(nsContentSecurityManager)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsCSPContext)
NS_GENERIC_FACTORY_CONSTRUCTOR(CSPService)
@@ -676,12 +663,6 @@ NS_DEFINE_NAMED_CID(UDPSOCKETCHILD_CID);
NS_DEFINE_NAMED_CID(NS_TIMESERVICE_CID);
NS_DEFINE_NAMED_CID(NS_MEDIASTREAMCONTROLLERSERVICE_CID);
NS_DEFINE_NAMED_CID(NS_MEDIAMANAGERSERVICE_CID);
-#ifdef MOZ_WEBSPEECH_TEST_BACKEND
-NS_DEFINE_NAMED_CID(NS_FAKE_SPEECH_RECOGNITION_SERVICE_CID);
-#endif
-#ifdef MOZ_WEBSPEECH_POCKETSPHINX
-NS_DEFINE_NAMED_CID(NS_POCKETSPHINX_SPEECH_RECOGNITION_SERVICE_CID);
-#endif
#ifdef MOZ_WEBSPEECH
NS_DEFINE_NAMED_CID(NS_SYNTHVOICEREGISTRY_CID);
#endif
@@ -912,12 +893,6 @@ static const mozilla::Module::CIDEntry kLayoutCIDs[] = {
{ &kNS_AUDIOCHANNEL_SERVICE_CID, false, nullptr, AudioChannelServiceConstructor },
{ &kNS_WEBSOCKETEVENT_SERVICE_CID, false, nullptr, WebSocketEventServiceConstructor },
{ &kNS_FOCUSMANAGER_CID, false, nullptr, CreateFocusManager },
-#ifdef MOZ_WEBSPEECH_TEST_BACKEND
- { &kNS_FAKE_SPEECH_RECOGNITION_SERVICE_CID, false, nullptr, FakeSpeechRecognitionServiceConstructor },
-#endif
-#ifdef MOZ_WEBSPEECH_POCKETSPHINX
- { &kNS_POCKETSPHINX_SPEECH_RECOGNITION_SERVICE_CID, false, nullptr, PocketSphinxSpeechRecognitionServiceConstructor },
-#endif
#ifdef MOZ_WEBSPEECH
{ &kNS_SYNTHVOICEREGISTRY_CID, true, nullptr, nsSynthVoiceRegistryConstructor },
#endif
@@ -1038,12 +1013,6 @@ static const mozilla::Module::ContractIDEntry kLayoutContracts[] = {
{ "@mozilla.org/audiochannel/service;1", &kNS_AUDIOCHANNEL_SERVICE_CID },
{ "@mozilla.org/websocketevent/service;1", &kNS_WEBSOCKETEVENT_SERVICE_CID },
{ "@mozilla.org/focus-manager;1", &kNS_FOCUSMANAGER_CID },
-#ifdef MOZ_WEBSPEECH_TEST_BACKEND
- { NS_SPEECH_RECOGNITION_SERVICE_CONTRACTID_PREFIX "fake", &kNS_FAKE_SPEECH_RECOGNITION_SERVICE_CID },
-#endif
-#ifdef MOZ_WEBSPEECH_POCKETSPHINX
- { NS_SPEECH_RECOGNITION_SERVICE_CONTRACTID_PREFIX "pocketsphinx-en-US", &kNS_POCKETSPHINX_SPEECH_RECOGNITION_SERVICE_CID },
-#endif
#ifdef MOZ_WEBSPEECH
{ NS_SYNTHVOICEREGISTRY_CONTRACTID, &kNS_SYNTHVOICEREGISTRY_CID },
#endif
diff --git a/layout/build/nsLayoutStatics.cpp b/layout/build/nsLayoutStatics.cpp
index 124bcbf10..d71513268 100644
--- a/layout/build/nsLayoutStatics.cpp
+++ b/layout/build/nsLayoutStatics.cpp
@@ -273,7 +273,9 @@ nsLayoutStatics::Initialize()
ProcessPriorityManager::Init();
+#ifdef MOZ_PERMISSIONS
nsPermissionManager::ClearOriginDataObserverInit();
+#endif
nsCookieService::AppClearDataObserverInit();
nsApplicationCacheService::AppClearDataObserverInit();
diff --git a/layout/forms/nsButtonFrameRenderer.cpp b/layout/forms/nsButtonFrameRenderer.cpp
index 096031385..5372acb7f 100644
--- a/layout/forms/nsButtonFrameRenderer.cpp
+++ b/layout/forms/nsButtonFrameRenderer.cpp
@@ -263,8 +263,8 @@ nsButtonFrameRenderer::DisplayButton(nsDisplayListBuilder* aBuilder,
nsDisplayButtonBoxShadowOuter(aBuilder, this));
}
- nsRect buttonRect;
- GetButtonRect(mFrame->GetRectRelativeToSelf(), buttonRect);
+ nsRect buttonRect =
+ mFrame->GetRectRelativeToSelf() + aBuilder->ToReferenceFrame(mFrame);
nsDisplayBackgroundImage::AppendBackgroundItemsToTop(
aBuilder, mFrame, buttonRect, aBackground);
diff --git a/layout/forms/nsComboboxControlFrame.cpp b/layout/forms/nsComboboxControlFrame.cpp
index 5a9438939..fd3db997a 100644
--- a/layout/forms/nsComboboxControlFrame.cpp
+++ b/layout/forms/nsComboboxControlFrame.cpp
@@ -1296,7 +1296,6 @@ public:
nsReflowStatus& aStatus) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
protected:
@@ -1337,11 +1336,10 @@ nsComboboxDisplayFrame::Reflow(nsPresContext* aPresContext,
void
nsComboboxDisplayFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- nsDisplayListCollection set;
- nsBlockFrame::BuildDisplayList(aBuilder, aDirtyRect, set);
+ nsDisplayListCollection set(aBuilder);
+ nsBlockFrame::BuildDisplayList(aBuilder, set);
// remove background items if parent frame is themed
if (mComboBox->IsThemed()) {
@@ -1549,13 +1547,8 @@ void nsDisplayComboboxFocus::Paint(nsDisplayListBuilder* aBuilder,
void
nsComboboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
-#ifdef NOISY
- printf("%p paint at (%d, %d, %d, %d)\n", this,
- aDirtyRect.x, aDirtyRect.y, aDirtyRect.width, aDirtyRect.height);
-#endif
if (aBuilder->IsForEventDelivery()) {
// Don't allow children to receive events.
@@ -1564,7 +1557,7 @@ nsComboboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
} else {
// REVIEW: Our in-flow child frames are inline-level so they will paint in our
// content list, so we don't need to mess with layers.
- nsBlockFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsBlockFrame::BuildDisplayList(aBuilder, aLists);
}
// draw a focus indicator only when focus rings should be drawn
diff --git a/layout/forms/nsComboboxControlFrame.h b/layout/forms/nsComboboxControlFrame.h
index 22849e8d1..d83726d81 100644
--- a/layout/forms/nsComboboxControlFrame.h
+++ b/layout/forms/nsComboboxControlFrame.h
@@ -89,7 +89,6 @@ public:
nsEventStatus* aEventStatus) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
void PaintFocus(DrawTarget& aDrawTarget, nsPoint aPt);
diff --git a/layout/forms/nsFieldSetFrame.cpp b/layout/forms/nsFieldSetFrame.cpp
index fc9f0571b..a5177560d 100644
--- a/layout/forms/nsFieldSetFrame.cpp
+++ b/layout/forms/nsFieldSetFrame.cpp
@@ -153,7 +153,6 @@ nsDisplayFieldSetBorderBackground::ComputeInvalidationRegion(nsDisplayListBuilde
void
nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) {
// Paint our background and border in a special way.
// REVIEW: We don't really need to check frame emptiness here; if it's empty,
@@ -166,9 +165,11 @@ nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
nsDisplayBoxShadowOuter(aBuilder, this));
}
+ const nsRect rect =
+ VisualBorderRectRelativeToSelf() + aBuilder->ToReferenceFrame(this);
+
nsDisplayBackgroundImage::AppendBackgroundItemsToTop(
- aBuilder, this, VisualBorderRectRelativeToSelf(),
- aLists.BorderBackground(),
+ aBuilder, this, rect, aLists.BorderBackground(),
/* aAllowWillPaintBorderOptimization = */ false);
aLists.BorderBackground()->AppendNewToTop(new (aBuilder)
@@ -180,10 +181,10 @@ nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
}
if (GetPrevInFlow()) {
- DisplayOverflowContainers(aBuilder, aDirtyRect, aLists);
+ DisplayOverflowContainers(aBuilder, aLists);
}
- nsDisplayListCollection contentDisplayItems;
+ nsDisplayListCollection contentDisplayItems(aBuilder);
if (nsIFrame* inner = GetInner()) {
// Collect the inner frame's display items into their own collection.
// We need to be calling BuildDisplayList on it before the legend in
@@ -191,13 +192,13 @@ nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// legend. However, we want the inner frame's display items to be
// after the legend's display items in z-order, so we need to save them
// and append them later.
- BuildDisplayListForChild(aBuilder, inner, aDirtyRect, contentDisplayItems);
+ BuildDisplayListForChild(aBuilder, inner, contentDisplayItems);
}
if (nsIFrame* legend = GetLegend()) {
// The legend's background goes on our BlockBorderBackgrounds list because
// it's a block child.
nsDisplayListSet set(aLists, aLists.BlockBorderBackgrounds());
- BuildDisplayListForChild(aBuilder, legend, aDirtyRect, set);
+ BuildDisplayListForChild(aBuilder, legend, set);
}
// Put the inner frame's display items on the master list. Note that this
// moves its border/background display items to our BorderBackground() list,
diff --git a/layout/forms/nsFieldSetFrame.h b/layout/forms/nsFieldSetFrame.h
index 5eb67c320..7c162515e 100644
--- a/layout/forms/nsFieldSetFrame.h
+++ b/layout/forms/nsFieldSetFrame.h
@@ -53,7 +53,6 @@ public:
nscoord* aBaseline) const override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
DrawResult PaintBorder(nsDisplayListBuilder* aBuilder,
diff --git a/layout/forms/nsFileControlFrame.cpp b/layout/forms/nsFileControlFrame.cpp
index 659371615..d60e4fb46 100644
--- a/layout/forms/nsFileControlFrame.cpp
+++ b/layout/forms/nsFileControlFrame.cpp
@@ -485,10 +485,9 @@ nsFileControlFrame::SetFormProperty(nsIAtom* aName,
void
nsFileControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- BuildDisplayListForInline(aBuilder, aDirtyRect, aLists);
+ BuildDisplayListForInline(aBuilder, aLists);
}
#ifdef ACCESSIBILITY
diff --git a/layout/forms/nsFileControlFrame.h b/layout/forms/nsFileControlFrame.h
index 55c51d426..4f975af29 100644
--- a/layout/forms/nsFileControlFrame.h
+++ b/layout/forms/nsFileControlFrame.h
@@ -33,7 +33,6 @@ public:
nsIFrame* aPrevInFlow) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
NS_DECL_QUERYFRAME
diff --git a/layout/forms/nsFormControlFrame.h b/layout/forms/nsFormControlFrame.h
index fd3e95d93..41bb1d9e8 100644
--- a/layout/forms/nsFormControlFrame.h
+++ b/layout/forms/nsFormControlFrame.h
@@ -40,7 +40,6 @@ public:
// nsIFrame replacements
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override {
DO_GLOBAL_REFLOW_COUNT_DSP("nsFormControlFrame");
DisplayBorderBackgroundOutline(aBuilder, aLists);
diff --git a/layout/forms/nsGfxCheckboxControlFrame.cpp b/layout/forms/nsGfxCheckboxControlFrame.cpp
index 061c92349..80009eff2 100644
--- a/layout/forms/nsGfxCheckboxControlFrame.cpp
+++ b/layout/forms/nsGfxCheckboxControlFrame.cpp
@@ -107,10 +107,9 @@ nsGfxCheckboxControlFrame::AccessibleType()
//------------------------------------------------------------
void
nsGfxCheckboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- nsFormControlFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsFormControlFrame::BuildDisplayList(aBuilder, aLists);
// Get current checked state through content model.
if ((!IsChecked() && !IsIndeterminate()) || !IsVisibleForPainting(aBuilder))
diff --git a/layout/forms/nsGfxCheckboxControlFrame.h b/layout/forms/nsGfxCheckboxControlFrame.h
index 70b8d8d6a..9234b5057 100644
--- a/layout/forms/nsGfxCheckboxControlFrame.h
+++ b/layout/forms/nsGfxCheckboxControlFrame.h
@@ -23,7 +23,6 @@ public:
#endif
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
#ifdef ACCESSIBILITY
diff --git a/layout/forms/nsGfxRadioControlFrame.cpp b/layout/forms/nsGfxRadioControlFrame.cpp
index e4a35a998..9c1ec070b 100644
--- a/layout/forms/nsGfxRadioControlFrame.cpp
+++ b/layout/forms/nsGfxRadioControlFrame.cpp
@@ -70,10 +70,9 @@ PaintCheckedRadioButton(nsIFrame* aFrame,
void
nsGfxRadioControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- nsFormControlFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsFormControlFrame::BuildDisplayList(aBuilder, aLists);
if (!IsVisibleForPainting(aBuilder))
return;
diff --git a/layout/forms/nsGfxRadioControlFrame.h b/layout/forms/nsGfxRadioControlFrame.h
index f91e6b94c..dd268dec1 100644
--- a/layout/forms/nsGfxRadioControlFrame.h
+++ b/layout/forms/nsGfxRadioControlFrame.h
@@ -25,7 +25,6 @@ public:
#endif
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
};
diff --git a/layout/forms/nsHTMLButtonControlFrame.cpp b/layout/forms/nsHTMLButtonControlFrame.cpp
index c6d8e1c4f..495686cfc 100644
--- a/layout/forms/nsHTMLButtonControlFrame.cpp
+++ b/layout/forms/nsHTMLButtonControlFrame.cpp
@@ -98,7 +98,6 @@ nsHTMLButtonControlFrame::ShouldClipPaintingToBorderBox()
void
nsHTMLButtonControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// Clip to our border area for event hit testing.
@@ -117,7 +116,7 @@ nsHTMLButtonControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
mRenderer.DisplayButton(aBuilder, aLists.BorderBackground(), &onTop);
}
- nsDisplayListCollection set;
+ nsDisplayListCollection set(aBuilder);
// Do not allow the child subtree to receive events.
if (!isForEventDelivery) {
@@ -132,7 +131,7 @@ nsHTMLButtonControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
clipState.ClipContainingBlockDescendants(rect, hasRadii ? radii : nullptr);
}
- BuildDisplayListForChild(aBuilder, mFrames.FirstChild(), aDirtyRect, set,
+ BuildDisplayListForChild(aBuilder, mFrames.FirstChild(), set,
DISPLAY_CHILD_FORCE_PSEUDO_STACKING_CONTEXT);
// That should put the display items in set.Content()
}
diff --git a/layout/forms/nsHTMLButtonControlFrame.h b/layout/forms/nsHTMLButtonControlFrame.h
index 432afa12c..8837daf74 100644
--- a/layout/forms/nsHTMLButtonControlFrame.h
+++ b/layout/forms/nsHTMLButtonControlFrame.h
@@ -27,7 +27,6 @@ public:
NS_DECL_FRAMEARENA_HELPERS
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nscoord GetMinISize(nsRenderingContext *aRenderingContext) override;
diff --git a/layout/forms/nsListControlFrame.cpp b/layout/forms/nsListControlFrame.cpp
index cc5f37f9a..7bd356a22 100644
--- a/layout/forms/nsListControlFrame.cpp
+++ b/layout/forms/nsListControlFrame.cpp
@@ -155,7 +155,6 @@ nsListControlFrame::DestroyFrom(nsIFrame* aDestructRoot)
void
nsListControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// We allow visibility:hidden <select>s to contain visible options.
@@ -180,7 +179,7 @@ nsListControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
mLastDropdownBackstopColor));
}
- nsHTMLScrollFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsHTMLScrollFrame::BuildDisplayList(aBuilder, aLists);
}
/**
diff --git a/layout/forms/nsListControlFrame.h b/layout/forms/nsListControlFrame.h
index 47f033a9b..d8df9ebd6 100644
--- a/layout/forms/nsListControlFrame.h
+++ b/layout/forms/nsListControlFrame.h
@@ -81,7 +81,6 @@ public:
virtual void DestroyFrom(nsIFrame* aDestructRoot) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsContainerFrame* GetContentInsertionFrame() override;
diff --git a/layout/forms/nsProgressFrame.cpp b/layout/forms/nsProgressFrame.cpp
index 2445defd3..1e3519f0e 100644
--- a/layout/forms/nsProgressFrame.cpp
+++ b/layout/forms/nsProgressFrame.cpp
@@ -101,10 +101,9 @@ NS_QUERYFRAME_TAIL_INHERITING(nsContainerFrame)
void
nsProgressFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- BuildDisplayListForInline(aBuilder, aDirtyRect, aLists);
+ BuildDisplayListForInline(aBuilder, aLists);
}
void
diff --git a/layout/forms/nsProgressFrame.h b/layout/forms/nsProgressFrame.h
index 01465ff7c..9cc72612f 100644
--- a/layout/forms/nsProgressFrame.h
+++ b/layout/forms/nsProgressFrame.h
@@ -32,7 +32,6 @@ public:
virtual void DestroyFrom(nsIFrame* aDestructRoot) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void Reflow(nsPresContext* aCX,
diff --git a/layout/forms/nsRangeFrame.cpp b/layout/forms/nsRangeFrame.cpp
index 7590da066..9370acb87 100644
--- a/layout/forms/nsRangeFrame.cpp
+++ b/layout/forms/nsRangeFrame.cpp
@@ -259,7 +259,6 @@ nsDisplayRangeFocusRing::Paint(nsDisplayListBuilder* aBuilder,
void
nsRangeFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (IsThemed()) {
@@ -274,10 +273,10 @@ nsRangeFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
nsIFrame* thumb = mThumbDiv->GetPrimaryFrame();
if (thumb) {
nsDisplayListSet set(aLists, aLists.Content());
- BuildDisplayListForChild(aBuilder, thumb, aDirtyRect, set, DISPLAY_CHILD_INLINE);
+ BuildDisplayListForChild(aBuilder, thumb, set, DISPLAY_CHILD_INLINE);
}
} else {
- BuildDisplayListForInline(aBuilder, aDirtyRect, aLists);
+ BuildDisplayListForInline(aBuilder, aLists);
}
// Draw a focus outline if appropriate:
diff --git a/layout/forms/nsRangeFrame.h b/layout/forms/nsRangeFrame.h
index 8a2d34a40..b913b3002 100644
--- a/layout/forms/nsRangeFrame.h
+++ b/layout/forms/nsRangeFrame.h
@@ -43,7 +43,6 @@ public:
virtual void DestroyFrom(nsIFrame* aDestructRoot) override;
void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void Reflow(nsPresContext* aPresContext,
diff --git a/layout/forms/nsSelectsAreaFrame.cpp b/layout/forms/nsSelectsAreaFrame.cpp
index dd613ae9f..d9ea7cd95 100644
--- a/layout/forms/nsSelectsAreaFrame.cpp
+++ b/layout/forms/nsSelectsAreaFrame.cpp
@@ -126,16 +126,15 @@ public:
void
nsSelectsAreaFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (!aBuilder->IsForEventDelivery()) {
- BuildDisplayListInternal(aBuilder, aDirtyRect, aLists);
+ BuildDisplayListInternal(aBuilder, aLists);
return;
}
- nsDisplayListCollection set;
- BuildDisplayListInternal(aBuilder, aDirtyRect, set);
+ nsDisplayListCollection set(aBuilder);
+ BuildDisplayListInternal(aBuilder, set);
nsOptionEventGrabberWrapper wrapper;
wrapper.WrapLists(aBuilder, this, set, aLists);
@@ -143,10 +142,9 @@ nsSelectsAreaFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
void
nsSelectsAreaFrame::BuildDisplayListInternal(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- nsBlockFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsBlockFrame::BuildDisplayList(aBuilder, aLists);
nsListControlFrame* listFrame = GetEnclosingListFrame(this);
if (listFrame && listFrame->IsFocused()) {
diff --git a/layout/forms/nsSelectsAreaFrame.h b/layout/forms/nsSelectsAreaFrame.h
index 3aac8a837..9b0a5b723 100644
--- a/layout/forms/nsSelectsAreaFrame.h
+++ b/layout/forms/nsSelectsAreaFrame.h
@@ -18,11 +18,9 @@ public:
nsFrameState aFlags);
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
void BuildDisplayListInternal(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists);
virtual void Reflow(nsPresContext* aCX,
diff --git a/layout/forms/nsTextControlFrame.cpp b/layout/forms/nsTextControlFrame.cpp
index a65e5b972..fa64e3937 100644
--- a/layout/forms/nsTextControlFrame.cpp
+++ b/layout/forms/nsTextControlFrame.cpp
@@ -1434,7 +1434,6 @@ nsTextControlFrame::PeekOffset(nsPeekOffsetStruct *aPos)
void
nsTextControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
/*
@@ -1462,7 +1461,7 @@ nsTextControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// placeholder has to be visible.
if (kid->GetContent() != txtCtrl->GetPlaceholderNode() ||
txtCtrl->GetPlaceholderVisibility()) {
- BuildDisplayListForChild(aBuilder, kid, aDirtyRect, set, 0);
+ BuildDisplayListForChild(aBuilder, kid, set, 0);
}
kid = kid->GetNextSibling();
}
diff --git a/layout/forms/nsTextControlFrame.h b/layout/forms/nsTextControlFrame.h
index 7fa39c5fb..620cc92b9 100644
--- a/layout/forms/nsTextControlFrame.h
+++ b/layout/forms/nsTextControlFrame.h
@@ -127,7 +127,6 @@ public:
nsFrameList& aChildList) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual mozilla::dom::Element*
diff --git a/layout/generic/CSSAlignUtils.h b/layout/generic/CSSAlignUtils.h
index 3693038b2..a258f4103 100644
--- a/layout/generic/CSSAlignUtils.h
+++ b/layout/generic/CSSAlignUtils.h
@@ -9,6 +9,7 @@
#define mozilla_CSSAlignUtils_h
#include "mozilla/WritingModes.h"
+#include "ReflowInput.h"
namespace mozilla {
diff --git a/layout/generic/ReflowOutput.cpp b/layout/generic/ReflowOutput.cpp
index e64e41dc5..1c61484e7 100644
--- a/layout/generic/ReflowOutput.cpp
+++ b/layout/generic/ReflowOutput.cpp
@@ -8,6 +8,8 @@
#include "mozilla/ReflowOutput.h"
#include "mozilla/ReflowInput.h"
+using namespace mozilla;
+
void
nsOverflowAreas::UnionWith(const nsOverflowAreas& aOther)
{
diff --git a/layout/generic/RubyUtils.h b/layout/generic/RubyUtils.h
index 8c9545f70..9bba89d0b 100644
--- a/layout/generic/RubyUtils.h
+++ b/layout/generic/RubyUtils.h
@@ -10,6 +10,7 @@
#include "nsTArray.h"
#include "nsGkAtoms.h"
#include "nsCSSAnonBoxes.h"
+#include "nsIFrame.h"
#define RTC_ARRAY_SIZE 1
diff --git a/layout/generic/ScrollSnap.h b/layout/generic/ScrollSnap.h
index a2877564d..37609017b 100644
--- a/layout/generic/ScrollSnap.h
+++ b/layout/generic/ScrollSnap.h
@@ -6,6 +6,8 @@
#ifndef mozilla_layout_ScrollSnap_h_
#define mozilla_layout_ScrollSnap_h_
+#include "nsIScrollableFrame.h"
+
namespace mozilla {
namespace layers {
diff --git a/layout/generic/moz.build b/layout/generic/moz.build
index 0fe98afec..ad186ef7a 100644
--- a/layout/generic/moz.build
+++ b/layout/generic/moz.build
@@ -123,7 +123,7 @@ EXPORTS.mozilla.layout += [
'FrameChildList.h',
]
-UNIFIED_SOURCES += [
+SOURCES += [
'AsyncScrollBase.cpp',
'BlockReflowInput.cpp',
'CSSAlignUtils.cpp',
@@ -157,9 +157,11 @@ UNIFIED_SOURCES += [
'nsIntervalSet.cpp',
'nsLeafFrame.cpp',
'nsLineBox.cpp',
+ 'nsLineLayout.cpp',
'nsPageContentFrame.cpp',
'nsPageFrame.cpp',
'nsPlaceholderFrame.cpp',
+ 'nsPluginFrame.cpp',
'nsRubyBaseContainerFrame.cpp',
'nsRubyBaseFrame.cpp',
'nsRubyContentFrame.cpp',
@@ -185,13 +187,6 @@ UNIFIED_SOURCES += [
'TextOverflow.cpp',
]
-# nsLineLayout.cpp needs to be built separately because it uses plarena.h.
-# nsPluginFrame.cpp needs to be built separately because of name clashes in the OS X headers.
-SOURCES += [
- 'nsLineLayout.cpp',
- 'nsPluginFrame.cpp',
-]
-
include('/ipc/chromium/chromium-config.mozbuild')
FINAL_LIBRARY = 'xul'
diff --git a/layout/generic/nsAbsoluteContainingBlock.cpp b/layout/generic/nsAbsoluteContainingBlock.cpp
index e3c847d01..068681692 100644
--- a/layout/generic/nsAbsoluteContainingBlock.cpp
+++ b/layout/generic/nsAbsoluteContainingBlock.cpp
@@ -18,6 +18,7 @@
#include "nsPresContext.h"
#include "nsCSSFrameConstructor.h"
#include "nsGridContainerFrame.h"
+#include "nsPlaceholderFrame.h"
#include "mozilla/Sprintf.h"
diff --git a/layout/generic/nsBRFrame.cpp b/layout/generic/nsBRFrame.cpp
index 057210350..08c0fe3dd 100644
--- a/layout/generic/nsBRFrame.cpp
+++ b/layout/generic/nsBRFrame.cpp
@@ -6,6 +6,7 @@
/* rendering object for HTML <br> elements */
#include "nsCOMPtr.h"
+#include "nsContainerFrame.h"
#include "nsFontMetrics.h"
#include "nsFrame.h"
#include "nsPresContext.h"
diff --git a/layout/generic/nsBackdropFrame.cpp b/layout/generic/nsBackdropFrame.cpp
index 687c5b2e3..ae847f460 100644
--- a/layout/generic/nsBackdropFrame.cpp
+++ b/layout/generic/nsBackdropFrame.cpp
@@ -39,7 +39,6 @@ nsBackdropFrame::GetParentStyleContext(nsIFrame** aProviderFrame) const
/* virtual */ void
nsBackdropFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
DO_GLOBAL_REFLOW_COUNT_DSP("nsBackdropFrame");
diff --git a/layout/generic/nsBackdropFrame.h b/layout/generic/nsBackdropFrame.h
index 74d366bef..f3159da31 100644
--- a/layout/generic/nsBackdropFrame.h
+++ b/layout/generic/nsBackdropFrame.h
@@ -27,7 +27,6 @@ public:
virtual nsStyleContext*
GetParentStyleContext(nsIFrame** aProviderFrame) const override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual mozilla::LogicalSize
ComputeAutoSize(nsRenderingContext* aRenderingContext,
diff --git a/layout/generic/nsBlockFrame.cpp b/layout/generic/nsBlockFrame.cpp
index a37bfc06b..57838207d 100644
--- a/layout/generic/nsBlockFrame.cpp
+++ b/layout/generic/nsBlockFrame.cpp
@@ -6527,13 +6527,13 @@ static void DebugOutputDrawLine(int32_t aDepth, nsLineBox* aLine, bool aDrawn) {
static void
DisplayLine(nsDisplayListBuilder* aBuilder, const nsRect& aLineArea,
- const nsRect& aDirtyRect, nsBlockFrame::LineIterator& aLine,
+ nsBlockFrame::LineIterator& aLine,
int32_t aDepth, int32_t& aDrawnLines, const nsDisplayListSet& aLists,
nsBlockFrame* aFrame, TextOverflow* aTextOverflow) {
// If the line's combined area (which includes child frames that
// stick outside of the line's bounding box or our bounding box)
// intersects the dirty rect then paint the line.
- bool intersect = aLineArea.Intersects(aDirtyRect);
+ bool intersect = aLineArea.Intersects(aBuilder->GetDirtyRect());
#ifdef DEBUG
if (nsBlockFrame::gLamePaintMetrics) {
aDrawnLines++;
@@ -6556,7 +6556,7 @@ DisplayLine(nsDisplayListBuilder* aBuilder, const nsRect& aLineArea,
// Collect our line's display items in a temporary nsDisplayListCollection,
// so that we can apply any "text-overflow" clipping to the entire collection
// without affecting previous lines.
- nsDisplayListCollection collection;
+ nsDisplayListCollection collection(aBuilder);
// Block-level child backgrounds go on the blockBorderBackgrounds list ...
// Inline-level child backgrounds go on the regular child content list.
@@ -6568,8 +6568,7 @@ DisplayLine(nsDisplayListBuilder* aBuilder, const nsRect& aLineArea,
nsIFrame* kid = aLine->mFirstChild;
int32_t n = aLine->GetChildCount();
while (--n >= 0) {
- aFrame->BuildDisplayListForChild(aBuilder, kid, aDirtyRect,
- childLists, flags);
+ aFrame->BuildDisplayListForChild(aBuilder, kid, childLists, flags);
kid = kid->GetNextSibling();
}
@@ -6582,13 +6581,13 @@ DisplayLine(nsDisplayListBuilder* aBuilder, const nsRect& aLineArea,
void
nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
int32_t drawnLines; // Will only be used if set (gLamePaintMetrics).
int32_t depth = 0;
#ifdef DEBUG
if (gNoisyDamageRepair) {
+ nsRect dirty = aBuilder->GetDirtyRect();
depth = GetDepth();
nsRect ca;
::ComputeVisualOverflowArea(mLines, mRect.width, mRect.height, ca);
@@ -6596,7 +6595,7 @@ nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
ListTag(stdout);
printf(": bounds=%d,%d,%d,%d dirty(absolute)=%d,%d,%d,%d ca=%d,%d,%d,%d\n",
mRect.x, mRect.y, mRect.width, mRect.height,
- aDirtyRect.x, aDirtyRect.y, aDirtyRect.width, aDirtyRect.height,
+ dirty.x, dirty.y, dirty.width, dirty.height,
ca.x, ca.y, ca.width, ca.height);
}
PRTime start = 0; // Initialize these variables to silence the compiler.
@@ -6609,21 +6608,21 @@ nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
DisplayBorderBackgroundOutline(aBuilder, aLists);
if (GetPrevInFlow()) {
- DisplayOverflowContainers(aBuilder, aDirtyRect, aLists);
+ DisplayOverflowContainers(aBuilder, aLists);
for (nsIFrame* f : mFloats) {
if (f->GetStateBits() & NS_FRAME_IS_PUSHED_FLOAT)
- BuildDisplayListForChild(aBuilder, f, aDirtyRect, aLists);
+ BuildDisplayListForChild(aBuilder, f, aLists);
}
}
- aBuilder->MarkFramesForDisplayList(this, mFloats, aDirtyRect);
+ aBuilder->MarkFramesForDisplayList(this, mFloats);
// Prepare for text-overflow processing.
UniquePtr<TextOverflow> textOverflow(
TextOverflow::WillProcessLines(aBuilder, this));
// We'll collect our lines' display items here, & then append this to aLists.
- nsDisplayListCollection linesDisplayListCollection;
+ nsDisplayListCollection linesDisplayListCollection(aBuilder);
// Don't use the line cursor if we might have a descendant placeholder ...
// it might skip lines that contain placeholders but don't themselves
@@ -6633,7 +6632,7 @@ nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// approximate it by checking it on |this|; if it's true for any
// frame in our child list, it's also true for |this|.
nsLineBox* cursor = aBuilder->ShouldDescendIntoFrame(this) ?
- nullptr : GetFirstLineContaining(aDirtyRect.y);
+ nullptr : GetFirstLineContaining(aBuilder->GetDirtyRect().y);
LineIterator line_end = LinesEnd();
if (cursor) {
@@ -6644,10 +6643,10 @@ nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
if (!lineArea.IsEmpty()) {
// Because we have a cursor, the combinedArea.ys are non-decreasing.
// Once we've passed aDirtyRect.YMost(), we can never see it again.
- if (lineArea.y >= aDirtyRect.YMost()) {
+ if (lineArea.y >= aBuilder->GetDirtyRect().YMost()) {
break;
}
- DisplayLine(aBuilder, lineArea, aDirtyRect, line, depth, drawnLines,
+ DisplayLine(aBuilder, lineArea, line, depth, drawnLines,
linesDisplayListCollection, this, textOverflow.get());
}
}
@@ -6660,7 +6659,7 @@ nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
line != line_end;
++line) {
nsRect lineArea = line->GetVisualOverflowArea();
- DisplayLine(aBuilder, lineArea, aDirtyRect, line, depth, drawnLines,
+ DisplayLine(aBuilder, lineArea, line, depth, drawnLines,
linesDisplayListCollection, this, textOverflow.get());
if (!lineArea.IsEmpty()) {
if (lineArea.y < lastY
@@ -6690,7 +6689,7 @@ nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
if (HasOutsideBullet()) {
// Display outside bullets manually
nsIFrame* bullet = GetOutsideBullet();
- BuildDisplayListForChild(aBuilder, bullet, aDirtyRect, aLists);
+ BuildDisplayListForChild(aBuilder, bullet, aLists);
}
#ifdef DEBUG
diff --git a/layout/generic/nsBlockFrame.h b/layout/generic/nsBlockFrame.h
index f515cc26f..4775fa626 100644
--- a/layout/generic/nsBlockFrame.h
+++ b/layout/generic/nsBlockFrame.h
@@ -139,7 +139,6 @@ public:
virtual nsSplittableType GetSplittableType() const override;
virtual bool IsFloatContainingBlock() const override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsIAtom* GetType() const override;
virtual bool IsFrameOfType(uint32_t aFlags) const override
diff --git a/layout/generic/nsBulletFrame.cpp b/layout/generic/nsBulletFrame.cpp
index f6595e8f6..db9a70aff 100644
--- a/layout/generic/nsBulletFrame.cpp
+++ b/layout/generic/nsBulletFrame.cpp
@@ -274,7 +274,6 @@ void nsDisplayBullet::Paint(nsDisplayListBuilder* aBuilder,
void
nsBulletFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (!IsVisibleForPainting(aBuilder))
diff --git a/layout/generic/nsBulletFrame.h b/layout/generic/nsBulletFrame.h
index e35ed0923..30f4e23cd 100644
--- a/layout/generic/nsBulletFrame.h
+++ b/layout/generic/nsBulletFrame.h
@@ -68,7 +68,6 @@ public:
// nsIFrame
virtual void DestroyFrom(nsIFrame* aDestructRoot) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsIAtom* GetType() const override;
virtual void DidSetStyleContext(nsStyleContext* aOldStyleContext) override;
diff --git a/layout/generic/nsCanvasFrame.cpp b/layout/generic/nsCanvasFrame.cpp
index 1a8812fb7..31baa040c 100644
--- a/layout/generic/nsCanvasFrame.cpp
+++ b/layout/generic/nsCanvasFrame.cpp
@@ -410,11 +410,10 @@ public:
void
nsCanvasFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (GetPrevInFlow()) {
- DisplayOverflowContainers(aBuilder, aDirtyRect, aLists);
+ DisplayOverflowContainers(aBuilder, aLists);
}
// Force a background to be shown. We may have a background propagated to us,
@@ -488,7 +487,7 @@ nsCanvasFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
for (nsIFrame* kid : PrincipalChildList()) {
// Put our child into its own pseudo-stack.
- BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists);
+ BuildDisplayListForChild(aBuilder, kid, aLists);
}
#ifdef DEBUG_CANVAS_FOCUS
@@ -504,7 +503,7 @@ nsCanvasFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
docShell->GetHasFocus(&hasFocus);
printf("%p - nsCanvasFrame::Paint R:%d,%d,%d,%d DR: %d,%d,%d,%d\n", this,
mRect.x, mRect.y, mRect.width, mRect.height,
- aDirtyRect.x, aDirtyRect.y, aDirtyRect.width, aDirtyRect.height);
+ dirty.x, dirty.y, dirty.width, dirty.height);
}
printf("%p - Focus: %s c: %p DoPaint:%s\n", docShell.get(), hasFocus?"Y":"N",
focusContent.get(), mDoPaintFocus?"Y":"N");
diff --git a/layout/generic/nsCanvasFrame.h b/layout/generic/nsCanvasFrame.h
index 8bd9dbf79..8c59f18c0 100644
--- a/layout/generic/nsCanvasFrame.h
+++ b/layout/generic/nsCanvasFrame.h
@@ -107,7 +107,6 @@ public:
NS_IMETHOD SetHasFocus(bool aHasFocus);
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
void PaintFocus(mozilla::gfx::DrawTarget* aRenderingContext, nsPoint aPt);
diff --git a/layout/generic/nsColumnSetFrame.cpp b/layout/generic/nsColumnSetFrame.cpp
index 6ea15d4d2..90d425ccf 100644
--- a/layout/generic/nsColumnSetFrame.cpp
+++ b/layout/generic/nsColumnSetFrame.cpp
@@ -1115,7 +1115,6 @@ nsColumnSetFrame::Reflow(nsPresContext* aPresContext,
void
nsColumnSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
DisplayBorderBackgroundOutline(aBuilder, aLists);
@@ -1128,7 +1127,7 @@ nsColumnSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// Our children won't have backgrounds so it doesn't matter where we put them.
for (nsFrameList::Enumerator e(mFrames); !e.AtEnd(); e.Next()) {
- BuildDisplayListForChild(aBuilder, e.get(), aDirtyRect, aLists);
+ BuildDisplayListForChild(aBuilder, e.get(), aLists);
}
}
diff --git a/layout/generic/nsColumnSetFrame.h b/layout/generic/nsColumnSetFrame.h
index db44183d6..4195742c2 100644
--- a/layout/generic/nsColumnSetFrame.h
+++ b/layout/generic/nsColumnSetFrame.h
@@ -67,7 +67,6 @@ public:
}
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsIAtom* GetType() const override;
diff --git a/layout/generic/nsContainerFrame.cpp b/layout/generic/nsContainerFrame.cpp
index 3ff6c9bf1..47afed9de 100644
--- a/layout/generic/nsContainerFrame.cpp
+++ b/layout/generic/nsContainerFrame.cpp
@@ -29,10 +29,12 @@
#include "nsBoxLayoutState.h"
#include "nsCSSFrameConstructor.h"
#include "nsBlockFrame.h"
+#include "nsBulletFrame.h"
#include "nsPlaceholderFrame.h"
#include "mozilla/AutoRestore.h"
#include "nsIFrameInlines.h"
#include "nsPrintfCString.h"
+#include "nsAttrValueInlines.h"
#include <algorithm>
using namespace mozilla;
@@ -329,17 +331,15 @@ nsContainerFrame::GetChildLists(nsTArray<ChildList>* aLists) const
void
nsContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
DisplayBorderBackgroundOutline(aBuilder, aLists);
- BuildDisplayListForNonBlockChildren(aBuilder, aDirtyRect, aLists);
+ BuildDisplayListForNonBlockChildren(aBuilder, aLists);
}
void
nsContainerFrame::BuildDisplayListForNonBlockChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists,
uint32_t aFlags)
{
@@ -348,7 +348,7 @@ nsContainerFrame::BuildDisplayListForNonBlockChildren(nsDisplayListBuilder* aB
nsDisplayListSet set(aLists, aLists.Content());
// The children should be in content order
while (kid) {
- BuildDisplayListForChild(aBuilder, kid, aDirtyRect, set, aFlags);
+ BuildDisplayListForChild(aBuilder, kid, set, aFlags);
kid = kid->GetNextSibling();
}
}
@@ -1338,13 +1338,12 @@ nsContainerFrame::ReflowOverflowContainerChildren(nsPresContext* aPres
void
nsContainerFrame::DisplayOverflowContainers(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
nsFrameList* overflowconts = GetPropTableFrames(OverflowContainersProperty());
if (overflowconts) {
for (nsIFrame* frame : *overflowconts) {
- BuildDisplayListForChild(aBuilder, frame, aDirtyRect, aLists);
+ BuildDisplayListForChild(aBuilder, frame, aLists);
}
}
}
diff --git a/layout/generic/nsContainerFrame.h b/layout/generic/nsContainerFrame.h
index ddf993d91..e3cc54b0b 100644
--- a/layout/generic/nsContainerFrame.h
+++ b/layout/generic/nsContainerFrame.h
@@ -437,7 +437,6 @@ public:
* Add overflow containers to the display list
*/
void DisplayOverflowContainers(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists);
/**
@@ -450,7 +449,6 @@ public:
* to emulate what nsContainerFrame::Paint did.
*/
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
static void PlaceFrameView(nsIFrame* aFrame)
@@ -576,7 +574,6 @@ protected:
* display items) go into the Content() list.
*/
void BuildDisplayListForNonBlockChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists,
uint32_t aFlags = 0);
@@ -585,11 +582,9 @@ protected:
* Intended as a convenience for derived classes.
*/
void BuildDisplayListForInline(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) {
DisplayBorderBackgroundOutline(aBuilder, aLists);
- BuildDisplayListForNonBlockChildren(aBuilder, aDirtyRect, aLists,
- DISPLAY_CHILD_INLINE);
+ BuildDisplayListForNonBlockChildren(aBuilder, aLists, DISPLAY_CHILD_INLINE);
}
diff --git a/layout/generic/nsFirstLetterFrame.cpp b/layout/generic/nsFirstLetterFrame.cpp
index 980e1e9be..426e3caa7 100644
--- a/layout/generic/nsFirstLetterFrame.cpp
+++ b/layout/generic/nsFirstLetterFrame.cpp
@@ -50,10 +50,9 @@ nsFirstLetterFrame::GetType() const
void
nsFirstLetterFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- BuildDisplayListForInline(aBuilder, aDirtyRect, aLists);
+ BuildDisplayListForInline(aBuilder, aLists);
}
void
diff --git a/layout/generic/nsFirstLetterFrame.h b/layout/generic/nsFirstLetterFrame.h
index 40e4ef0cf..c8d416a85 100644
--- a/layout/generic/nsFirstLetterFrame.h
+++ b/layout/generic/nsFirstLetterFrame.h
@@ -20,7 +20,6 @@ public:
explicit nsFirstLetterFrame(nsStyleContext* aContext) : nsContainerFrame(aContext) {}
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void Init(nsIContent* aContent,
diff --git a/layout/generic/nsFlexContainerFrame.cpp b/layout/generic/nsFlexContainerFrame.cpp
index 94bce1e7a..69200117b 100644
--- a/layout/generic/nsFlexContainerFrame.cpp
+++ b/layout/generic/nsFlexContainerFrame.cpp
@@ -2433,7 +2433,6 @@ GetDisplayFlagsForFlexItem(nsIFrame* aFrame)
void
nsFlexContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// XXXdholbert hacky temporary band-aid for bug 1059138: Trivially pass this
@@ -2452,7 +2451,7 @@ nsFlexContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// the BlockBorderBackgrounds list.
nsDisplayListSet childLists(aLists, aLists.BlockBorderBackgrounds());
for (nsIFrame* childFrame : mFrames) {
- BuildDisplayListForChild(aBuilder, childFrame, aDirtyRect, childLists,
+ BuildDisplayListForChild(aBuilder, childFrame, childLists,
GetDisplayFlagsForFlexItem(childFrame));
}
}
diff --git a/layout/generic/nsFlexContainerFrame.h b/layout/generic/nsFlexContainerFrame.h
index 459ae8e20..ac2cc72f6 100644
--- a/layout/generic/nsFlexContainerFrame.h
+++ b/layout/generic/nsFlexContainerFrame.h
@@ -64,7 +64,6 @@ public:
nsIFrame* aPrevInFlow) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
void MarkIntrinsicISizesDirty() override;
diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp
index b8b1f312e..07cdbd7e3 100644
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -53,6 +53,7 @@
#include "nsGkAtoms.h"
#include "nsHtml5Atoms.h"
#include "nsCSSAnonBoxes.h"
+#include "nsGenericHTMLElement.h"
#include "nsFrameTraversal.h"
#include "nsRange.h"
@@ -1794,6 +1795,13 @@ void
nsFrame::DisplayOutlineUnconditional(nsDisplayListBuilder* aBuilder,
const nsDisplayListSet& aLists)
{
+ // Per https://drafts.csswg.org/css-tables-3/#global-style-overrides:
+ // "All css properties of table-column and table-column-group boxes are
+ // ignored, except when explicitly specified by this specification."
+ // CSS outlines fall into this category, so we skip them on these boxes.
+
+ MOZ_ASSERT(GetType() != nsGkAtoms::tableColGroupFrame && GetType() != nsGkAtoms::tableColFrame);
+
if (StyleOutline()->mOutlineStyle == NS_STYLE_BORDER_STYLE_NONE) {
return;
}
@@ -1814,7 +1822,7 @@ nsFrame::DisplayOutline(nsDisplayListBuilder* aBuilder,
void
nsIFrame::DisplayCaret(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect, nsDisplayList* aList)
+ nsDisplayList* aList)
{
if (!IsVisibleForPainting(aBuilder))
return;
@@ -1840,7 +1848,9 @@ nsFrame::DisplayBackgroundUnconditional(nsDisplayListBuilder* aBuilder,
if (aBuilder->IsForEventDelivery() || aForceBackground ||
!StyleBackground()->IsTransparent() || StyleDisplay()->mAppearance) {
return nsDisplayBackgroundImage::AppendBackgroundItemsToTop(
- aBuilder, this, GetRectRelativeToSelf(), aLists.BorderBackground());
+ aBuilder, this,
+ GetRectRelativeToSelf() + aBuilder->ToReferenceFrame(this),
+ aLists.BorderBackground());
}
return false;
}
@@ -1873,7 +1883,9 @@ nsFrame::DisplayBorderBackgroundOutline(nsDisplayListBuilder* aBuilder,
// If there's a themed background, we should not create a border item.
// It won't be rendered.
- if (!bgIsThemed && StyleBorder()->HasBorder()) {
+ // Don't paint borders for tables here, since they paint them in a different
+ // order.
+ if (!bgIsThemed && StyleBorder()->HasBorder() && GetType() != nsGkAtoms::tableFrame) {
aLists.BorderBackground()->AppendNewToTop(new (aBuilder)
nsDisplayBorder(aBuilder, this));
}
@@ -2073,13 +2085,12 @@ ItemParticipatesIn3DContext(nsIFrame* aAncestor, nsDisplayItem* aItem)
static void
WrapSeparatorTransform(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
- nsRect& aDirtyRect,
nsDisplayList* aSource, nsDisplayList* aTarget,
int aIndex) {
if (!aSource->IsEmpty()) {
nsDisplayTransform *sepIdItem =
new (aBuilder) nsDisplayTransform(aBuilder, aFrame, aSource,
- aDirtyRect, Matrix4x4(), aIndex);
+ aBuilder->GetDirtyRect(), Matrix4x4(), aIndex);
sepIdItem->SetNoExtendContext();
aTarget->AppendToTop(sepIdItem);
}
@@ -2087,7 +2098,6 @@ WrapSeparatorTransform(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
void
nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
nsDisplayList* aList) {
if (GetStateBits() & NS_FRAME_TOO_DEEP_IN_FRAME_TREE)
return;
@@ -2123,25 +2133,27 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
aBuilder->AddToWillChangeBudget(this, GetSize());
}
- bool extend3DContext = Extend3DContext();
+ const bool isTransformed = IsTransformed();
+ const bool hasPerspective = isTransformed && HasPerspective();
+ const bool extend3DContext = Extend3DContext();
+ const bool combines3DTransformWithAncestors =
+ (extend3DContext || isTransformed) && Combines3DTransformWithAncestors();
+ const bool childrenHavePerspective = ChildrenHavePerspective();
Maybe<nsDisplayListBuilder::AutoPreserves3DContext> autoPreserves3DContext;
- if (extend3DContext && !Combines3DTransformWithAncestors()) {
+ if (extend3DContext && !combines3DTransformWithAncestors) {
// Start a new preserves3d context to keep informations on
// nsDisplayListBuilder.
autoPreserves3DContext.emplace(aBuilder);
// Save dirty rect on the builder to avoid being distorted for
// multiple transforms along the chain.
- aBuilder->SetPreserves3DDirtyRect(aDirtyRect);
+ aBuilder->SavePreserves3DRects();
}
// For preserves3d, use the dirty rect already installed on the
// builder, since aDirtyRect maybe distorted for transforms along
// the chain.
- nsRect dirtyRect = aDirtyRect;
+ nsRect dirtyRect = aBuilder->GetDirtyRect();
- bool inTransform = aBuilder->IsInTransform();
- bool isTransformed = IsTransformed();
- bool hasPerspective = HasPerspective();
// reset blend mode so we can keep track if this stacking context needs have
// a nsDisplayBlendContainer. Set the blend mode back when the routine exits
// so we keep track if the parent stacking context needs a container too.
@@ -2149,6 +2161,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
aBuilder->SetContainsBlendMode(false);
nsRect dirtyRectOutsideTransform = dirtyRect;
+ bool inTransform = aBuilder->IsInTransform();
if (isTransformed) {
const nsRect overflow = GetVisualOverflowRectRelativeToSelf();
if (nsDisplayTransform::ShouldPrerenderTransformedContent(aBuilder,
@@ -2161,8 +2174,8 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
// If we're in preserve-3d then grab the dirty rect that was given to the root
// and transform using the combined transform.
- if (Combines3DTransformWithAncestors()) {
- dirtyRect = aBuilder->GetPreserves3DDirtyRect(this);
+ if (combines3DTransformWithAncestors) {
+ dirtyRect = aBuilder->GetPreserves3DRects();
}
nsRect untransformedDirtyRect;
@@ -2270,19 +2283,19 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
clipState.EnterStackingContextContents(clearClip);
- nsDisplayListCollection set;
+ nsDisplayListCollection set(aBuilder);
{
DisplayListClipState::AutoSaveRestore nestedClipState(aBuilder);
nsDisplayListBuilder::AutoInTransformSetter
inTransformSetter(aBuilder, inTransform);
nsDisplayListBuilder::AutoSaveRestorePerspectiveIndex
- perspectiveIndex(aBuilder, this);
+ perspectiveIndex(aBuilder, childrenHavePerspective);
CheckForApzAwareEventHandlers(aBuilder, this);
Maybe<nsRect> clipPropClip = GetClipPropClipRect(disp, effects, GetSize());
if (clipPropClip) {
- dirtyRect.IntersectRect(dirtyRect, *clipPropClip);
+ aBuilder->IntersectDirtyRect(*clipPropClip);
nestedClipState.ClipContentDescendants(
*clipPropClip + aBuilder->ToReferenceFrame(this));
}
@@ -2295,7 +2308,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
aBuilder->MarkPreserve3DFramesForDisplayList(this);
}
- MarkAbsoluteFramesForDisplayList(aBuilder, dirtyRect);
+ MarkAbsoluteFramesForDisplayList(aBuilder);
nsDisplayLayerEventRegions* eventRegions = nullptr;
if (aBuilder->IsBuildingLayerEventRegions()) {
@@ -2304,7 +2317,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
aBuilder->SetLayerEventRegions(eventRegions);
}
aBuilder->AdjustWindowDraggingRegion(this);
- BuildDisplayList(aBuilder, dirtyRect, set);
+ BuildDisplayList(aBuilder, set);
if (eventRegions) {
// If the event regions item ended up empty, throw it away rather than
// adding it to the display list.
@@ -2410,7 +2423,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
clipState.ExitStackingContextContents(&containerItemScrollClip);
}
// Revert to the post-filter dirty rect.
- buildingDisplayList.SetDirtyRect(dirtyRectOutsideSVGEffects);
+ aBuilder->SetDirtyRect(dirtyRectOutsideSVGEffects);
// Skip all filter effects while generating glyph mask.
if (usingFilter && !aBuilder->IsForGenerateGlyphMask()) {
@@ -2475,8 +2488,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
while (nsDisplayItem* item = resultList.RemoveBottom()) {
if (ItemParticipatesIn3DContext(this, item) && !item->GetClip().HasClip()) {
// The frame of this item participates the same 3D context.
- WrapSeparatorTransform(aBuilder, this, dirtyRect,
- &nonparticipants, &participants, index++);
+ WrapSeparatorTransform(aBuilder, this, &nonparticipants, &participants, index++);
participants.AppendToTop(item);
} else {
// The frame of the item doesn't participate the current
@@ -2489,8 +2501,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
nonparticipants.AppendToTop(item);
}
}
- WrapSeparatorTransform(aBuilder, this, dirtyRect,
- &nonparticipants, &participants, index++);
+ WrapSeparatorTransform(aBuilder, this, &nonparticipants, &participants, index++);
resultList.AppendToTop(&participants);
}
@@ -2501,7 +2512,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
}
// Revert to the dirtyrect coming in from the parent, without our transform
// taken into account.
- buildingDisplayList.SetDirtyRect(dirtyRectOutsideTransform);
+ aBuilder->SetDirtyRect(dirtyRectOutsideTransform);
// Revert to the outer reference frame and offset because all display
// items we create from now on are outside the transform.
nsPoint toOuterReferenceFrame;
@@ -2602,10 +2613,63 @@ WrapInWrapList(nsDisplayListBuilder* aBuilder,
return item;
}
+static bool DescendIntoChild(nsDisplayListBuilder* aBuilder,
+ const nsIFrame* aChild, const nsRect& aDirty) {
+ if (aChild->GetStateBits() & NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO) {
+ return true;
+ }
+
+ // If the child is a scrollframe that we want to ignore, then we need
+ // to descend into it because its scrolled child may intersect the dirty
+ // area even if the scrollframe itself doesn't.
+ if (aChild == aBuilder->GetIgnoreScrollFrame()) {
+ return true;
+ }
+
+ // There are cases where the "ignore scroll frame" on the builder is not set
+ // correctly, and so we additionally want to catch cases where the child is
+ // a root scrollframe and we are ignoring scrolling on the viewport.
+ if (aChild == aBuilder->GetPresShellIgnoreScrollFrame()) {
+ return true;
+ }
+
+ const nsRect overflow = aChild->GetVisualOverflowRect();
+
+ if (aDirty.Intersects(overflow)) {
+ return true;
+ }
+
+ if (aChild->IsFrameOfType(nsIFrame::eTablePart)) {
+ // Relative positioning and transforms can cause table parts to move, but we
+ // will still paint the backgrounds for their ancestor parts under them at
+ // their 'normal' position. That means that we must consider the overflow
+ // rects at both positions.
+
+ // We convert the overflow rect into the nsTableFrame's coordinate
+ // space, applying the normal position offset at each step. Then we
+ // compare that against the builder's cached dirty rect in table
+ // coordinate space.
+ const nsIFrame* f = aChild;
+ nsRect normalPositionOverflowRelativeToTable = overflow;
+
+ while (f->IsFrameOfType(nsIFrame::eTablePart)) {
+ normalPositionOverflowRelativeToTable += f->GetNormalPosition();
+ f = f->GetParent();
+ }
+
+ nsDisplayTableBackgroundSet* tableBGs = aBuilder->GetTableBackgroundSet();
+ if (tableBGs &&
+ tableBGs->GetDirtyRect().Intersects(normalPositionOverflowRelativeToTable)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
void
nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder,
nsIFrame* aChild,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists,
uint32_t aFlags) {
// If painting is restricted to just the background of the top level frame,
@@ -2624,12 +2688,13 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder,
if (child->GetStateBits() & NS_FRAME_TOO_DEEP_IN_FRAME_TREE)
return;
- bool isSVG = (child->GetStateBits() & NS_FRAME_SVG_LAYOUT);
+ const bool isSVG = child->GetStateBits() & NS_FRAME_SVG_LAYOUT;
// true if this is a real or pseudo stacking context
bool pseudoStackingContext =
(aFlags & DISPLAY_CHILD_FORCE_PSEUDO_STACKING_CONTEXT) != 0;
- if (!isSVG &&
+ if (!pseudoStackingContext &&
+ !isSVG &&
(aFlags & DISPLAY_CHILD_INLINE) &&
!child->IsFrameOfType(eLineParticipant)) {
// child is a non-inline frame in an inline context, i.e.,
@@ -2638,12 +2703,14 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder,
pseudoStackingContext = true;
}
- // dirty rect in child-relative coordinates
- nsRect dirty = aDirtyRect - child->GetOffsetTo(this);
-
nsIAtom* childType = child->GetType();
nsDisplayListBuilder::OutOfFlowDisplayData* savedOutOfFlowData = nullptr;
bool isPlaceholder = false;
+
+ // dirty rect in child-relative coordinates
+ NS_ASSERTION(aBuilder->GetCurrentFrame() == this, "Wrong coord space!");
+ nsRect dirty = aBuilder->GetDirtyRect() - child->GetOffsetTo(this);
+
if (childType == nsGkAtoms::placeholderFrame) {
isPlaceholder = true;
nsPlaceholderFrame* placeholder = static_cast<nsPlaceholderFrame*>(child);
@@ -2690,35 +2757,10 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder,
!aChild->IsSelected()) {
return;
}
-
- if (aBuilder->GetIncludeAllOutOfFlows() &&
- (child->GetStateBits() & NS_FRAME_OUT_OF_FLOW)) {
+ if (aBuilder->GetIncludeAllOutOfFlows() && isPlaceholder) {
dirty = child->GetVisualOverflowRect();
- } else if (!(child->GetStateBits() & NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO)) {
- // No need to descend into child to catch placeholders for visible
- // positioned stuff. So see if we can short-circuit frame traversal here.
-
- // We can stop if child's frame subtree's intersection with the
- // dirty area is empty.
- // If the child is a scrollframe that we want to ignore, then we need
- // to descend into it because its scrolled child may intersect the dirty
- // area even if the scrollframe itself doesn't.
- // There are cases where the "ignore scroll frame" on the builder is not set
- // correctly, and so we additionally want to catch cases where the child is
- // a root scrollframe and we are ignoring scrolling on the viewport.
- nsIPresShell* shell = PresContext()->PresShell();
- bool keepDescending = child == aBuilder->GetIgnoreScrollFrame() ||
- (shell->IgnoringViewportScrolling() && child == shell->GetRootScrollFrame());
- if (!keepDescending) {
- nsRect childDirty;
- if (!childDirty.IntersectRect(dirty, child->GetVisualOverflowRect()))
- return;
- // Usually we could set dirty to childDirty now but there's no
- // benefit, and it can be confusing. It can especially confuse
- // situations where we're going to ignore a scrollframe's clipping;
- // we wouldn't want to clip the dirty area to the scrollframe's
- // bounds in that case.
- }
+ } else if (!DescendIntoChild(aBuilder, child, dirty)) {
+ return;
}
// XXX need to have inline-block and inline-table set pseudoStackingContext
@@ -2742,7 +2784,7 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder,
const nsStyleDisplay* disp = child->StyleDisplay();
const nsStyleEffects* effects = child->StyleEffects();
const nsStylePosition* pos = child->StylePosition();
- bool isVisuallyAtomic = child->HasOpacity()
+ const bool isVisuallyAtomic = child->HasOpacity()
|| child->IsTransformed()
// strictly speaking, 'perspective' doesn't require visual atomicity,
// but the spec says it acts like the rest of these
@@ -2750,28 +2792,28 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder,
|| effects->mMixBlendMode != NS_STYLE_BLEND_NORMAL
|| nsSVGIntegrationUtils::UsingEffectsForFrame(child);
- bool isPositioned = disp->IsAbsPosContainingBlock(child);
- bool isStackingContext =
+ const bool isPositioned = disp->IsAbsPosContainingBlock(child);
+ const bool isStackingContext =
(isPositioned && (disp->IsPositionForcingStackingContext() ||
pos->mZIndex.GetUnit() == eStyleUnit_Integer)) ||
(disp->mWillChangeBitField & NS_STYLE_WILL_CHANGE_STACKING_CONTEXT) ||
disp->mIsolation != NS_STYLE_ISOLATION_AUTO ||
isVisuallyAtomic || (aFlags & DISPLAY_CHILD_FORCE_STACKING_CONTEXT);
- if (isVisuallyAtomic || isPositioned || (!isSVG && disp->IsFloating(child)) ||
- ((effects->mClipFlags & NS_STYLE_CLIP_RECT) &&
- IsSVGContentWithCSSClip(child)) ||
- disp->mIsolation != NS_STYLE_ISOLATION_AUTO ||
- (disp->mWillChangeBitField & NS_STYLE_WILL_CHANGE_STACKING_CONTEXT) ||
- (aFlags & DISPLAY_CHILD_FORCE_STACKING_CONTEXT)) {
+ if (pseudoStackingContext || isStackingContext || isPositioned ||
+ (!isSVG && disp->IsFloating(child)) ||
+ (isSVG && (effects->mClipFlags & NS_STYLE_CLIP_RECT) &&
+ IsSVGContentWithCSSClip(child))) {
// If you change this, also change IsPseudoStackingContextFromStyle()
pseudoStackingContext = true;
}
+
NS_ASSERTION(!isStackingContext || pseudoStackingContext,
"Stacking contexts must also be pseudo-stacking-contexts");
nsDisplayListBuilder::AutoBuildingDisplayList
buildingForChild(aBuilder, child, dirty, pseudoStackingContext);
+
DisplayListClipState::AutoClipMultiple clipState(aBuilder);
CheckForApzAwareEventHandlers(aBuilder, child);
@@ -2784,7 +2826,7 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder,
savedOutOfFlowData->mContainingBlockScrollClip);
} else if (GetStateBits() & NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO &&
isPlaceholder) {
- NS_ASSERTION(dirty.IsEmpty(), "should have empty dirty rect");
+ NS_ASSERTION(dirty.IsEmpty(), "should have empty visible rect");
// Every item we build from now until we descent into an out of flow that
// does have saved out of flow data should be invisible. This state gets
// restored when AutoBuildingDisplayList gets out of scope.
@@ -2820,18 +2862,18 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder,
// True stacking context.
// For stacking contexts, BuildDisplayListForStackingContext handles
// clipping and MarkAbsoluteFramesForDisplayList.
- child->BuildDisplayListForStackingContext(aBuilder, dirty, &list);
- aBuilder->DisplayCaret(child, dirty, &list);
+ child->BuildDisplayListForStackingContext(aBuilder, &list);
+ aBuilder->DisplayCaret(child, &list);
} else {
Maybe<nsRect> clipPropClip =
child->GetClipPropClipRect(disp, effects, child->GetSize());
if (clipPropClip) {
- dirty.IntersectRect(dirty, *clipPropClip);
+ aBuilder->IntersectDirtyRect(*clipPropClip);
clipState.ClipContentDescendants(
*clipPropClip + aBuilder->ToReferenceFrame(child));
}
- child->MarkAbsoluteFramesForDisplayList(aBuilder, dirty);
+ child->MarkAbsoluteFramesForDisplayList(aBuilder);
if (aBuilder->IsBuildingLayerEventRegions()) {
// If this frame has a different animated geometry root than its parent,
@@ -2863,8 +2905,8 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder,
// return early.
aBuilder->AdjustWindowDraggingRegion(child);
- child->BuildDisplayList(aBuilder, dirty, aLists);
- aBuilder->DisplayCaret(child, dirty, aLists.Content());
+ child->BuildDisplayList(aBuilder, aLists);
+ aBuilder->DisplayCaret(child, aLists.Content());
#ifdef DEBUG
DisplayDebugBorders(aBuilder, child, aLists);
#endif
@@ -2875,10 +2917,10 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder,
// We allow positioned descendants of the child to escape to our parent
// stacking context's positioned descendant list, because they might be
// z-index:non-auto
- nsDisplayListCollection pseudoStack;
+ nsDisplayListCollection pseudoStack(aBuilder);
aBuilder->AdjustWindowDraggingRegion(child);
- child->BuildDisplayList(aBuilder, dirty, pseudoStack);
- aBuilder->DisplayCaret(child, dirty, pseudoStack.Content());
+ child->BuildDisplayList(aBuilder, pseudoStack);
+ aBuilder->DisplayCaret(child, pseudoStack.Content());
list.AppendToTop(pseudoStack.BorderBackground());
list.AppendToTop(pseudoStack.BlockBorderBackgrounds());
@@ -2928,11 +2970,10 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder,
}
void
-nsIFrame::MarkAbsoluteFramesForDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect)
+nsIFrame::MarkAbsoluteFramesForDisplayList(nsDisplayListBuilder* aBuilder)
{
if (IsAbsoluteContainer()) {
- aBuilder->MarkFramesForDisplayList(this, GetAbsoluteContainingBlock()->GetChildList(), aDirtyRect);
+ aBuilder->MarkFramesForDisplayList(this, GetAbsoluteContainingBlock()->GetChildList());
}
}
diff --git a/layout/generic/nsFrameSetFrame.cpp b/layout/generic/nsFrameSetFrame.cpp
index 87cb31fd0..4315b9b8a 100644
--- a/layout/generic/nsFrameSetFrame.cpp
+++ b/layout/generic/nsFrameSetFrame.cpp
@@ -100,7 +100,6 @@ public:
nsIFrame::Cursor& aCursor) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void Reflow(nsPresContext* aPresContext,
@@ -149,7 +148,6 @@ public:
#endif
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void Reflow(nsPresContext* aPresContext,
@@ -672,10 +670,9 @@ nsHTMLFramesetFrame::GetCursor(const nsPoint& aPoint,
void
nsHTMLFramesetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- BuildDisplayListForInline(aBuilder, aDirtyRect, aLists);
+ BuildDisplayListForInline(aBuilder, aLists);
if (mDragger && aBuilder->IsForEventDelivery()) {
aLists.Content()->AppendNewToTop(
@@ -1429,7 +1426,6 @@ void nsDisplayFramesetBorder::Paint(nsDisplayListBuilder* aBuilder,
void
nsHTMLFramesetBorderFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
aLists.Content()->AppendNewToTop(
@@ -1640,7 +1636,6 @@ void nsDisplayFramesetBlank::Paint(nsDisplayListBuilder* aBuilder,
void
nsHTMLFramesetBlankFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
aLists.Content()->AppendNewToTop(
diff --git a/layout/generic/nsFrameSetFrame.h b/layout/generic/nsFrameSetFrame.h
index ac6ab07ce..b97d10c58 100644
--- a/layout/generic/nsFrameSetFrame.h
+++ b/layout/generic/nsFrameSetFrame.h
@@ -97,7 +97,6 @@ public:
nsIFrame::Cursor& aCursor) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void Reflow(nsPresContext* aPresContext,
diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp
index 3ed3b0bb3..dd1b15f77 100644
--- a/layout/generic/nsGfxScrollFrame.cpp
+++ b/layout/generic/nsGfxScrollFrame.cpp
@@ -3031,7 +3031,6 @@ struct HoveredStateComparator
void
ScrollFrameHelper::AppendScrollPartsTo(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists,
bool aCreateLayer,
bool aPositioned)
@@ -3093,23 +3092,25 @@ ScrollFrameHelper::AppendScrollPartsTo(nsDisplayListBuilder* aBuilder,
// zoomable, and where the scrollbar sizes are bounded by the widget.
nsRect dirty = mIsRoot && mOuter->PresContext()->IsRootContentDocument()
? scrollParts[i]->GetVisualOverflowRectRelativeToParent()
- : aDirtyRect;
- nsDisplayListBuilder::AutoBuildingDisplayList
- buildingForChild(aBuilder, scrollParts[i],
- dirty + mOuter->GetOffsetTo(scrollParts[i]), true);
+ : aBuilder->GetDirtyRect();
// Always create layers for overlay scrollbars so that we don't create a
// giant layer covering the whole scrollport if both scrollbars are visible.
bool isOverlayScrollbar = (flags != 0) && overlayScrollbars;
bool createLayer = aCreateLayer || isOverlayScrollbar;
- nsDisplayListBuilder::AutoCurrentScrollbarInfoSetter
- infoSetter(aBuilder, scrollTargetId, flags, createLayer);
- nsDisplayListCollection partList;
- mOuter->BuildDisplayListForChild(
- aBuilder, scrollParts[i], dirty, partList,
- nsIFrame::DISPLAY_CHILD_FORCE_STACKING_CONTEXT);
-
+ nsDisplayListCollection partList(aBuilder);
+ {
+ nsDisplayListBuilder::AutoBuildingDisplayList
+ buildingForChild(aBuilder, mOuter,
+ dirty, true);
+
+ nsDisplayListBuilder::AutoCurrentScrollbarInfoSetter
+ infoSetter(aBuilder, scrollTargetId, flags, createLayer);
+ mOuter->BuildDisplayListForChild(
+ aBuilder, scrollParts[i], partList,
+ nsIFrame::DISPLAY_CHILD_FORCE_STACKING_CONTEXT);
+ }
if (createLayer) {
appendToTopFlags |= APPEND_OWN_LAYER;
}
@@ -3117,11 +3118,18 @@ ScrollFrameHelper::AppendScrollPartsTo(nsDisplayListBuilder* aBuilder,
appendToTopFlags |= APPEND_POSITIONED;
}
+ {
+ nsDisplayListBuilder::AutoBuildingDisplayList
+ buildingForChild(aBuilder, scrollParts[i],
+ dirty + mOuter->GetOffsetTo(scrollParts[i]), true);
+ nsDisplayListBuilder::AutoCurrentScrollbarInfoSetter
+ infoSetter(aBuilder, scrollTargetId, flags, createLayer);
// DISPLAY_CHILD_FORCE_STACKING_CONTEXT put everything into
// partList.PositionedDescendants().
::AppendToTop(aBuilder, aLists,
partList.PositionedDescendants(), scrollParts[i],
appendToTopFlags);
+ }
}
}
@@ -3246,7 +3254,6 @@ ClipListsExceptCaret(nsDisplayListCollection* aLists,
void
ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (aBuilder->IsForFrameVisibility()) {
@@ -3283,7 +3290,7 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// had dirty rects saved for them by their parent frames calling
// MarkOutOfFlowChildrenForDisplayList, so it's safe to restrict our
// dirty rect here.
- nsRect dirtyRect = aDirtyRect;
+ nsRect dirtyRect = aBuilder->GetDirtyRect();
if (!ignoringThisScrollFrame) {
dirtyRect = dirtyRect.Intersect(mScrollPort);
}
@@ -3325,20 +3332,20 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder,
if (addScrollBars) {
// Add classic scrollbars.
- AppendScrollPartsTo(aBuilder, aDirtyRect, aLists,
- createLayersForScrollbars, false);
+ AppendScrollPartsTo(aBuilder, aLists, createLayersForScrollbars, false);
}
+ nsDisplayListBuilder::AutoBuildingDisplayList
+ building(aBuilder, mOuter, dirtyRect, aBuilder->IsAtRootOfPseudoStackingContext());
+
// Don't clip the scrolled child, and don't paint scrollbars/scrollcorner.
// The scrolled frame shouldn't have its own background/border, so we
// can just pass aLists directly.
- mOuter->BuildDisplayListForChild(aBuilder, mScrolledFrame,
- dirtyRect, aLists);
+ mOuter->BuildDisplayListForChild(aBuilder, mScrolledFrame, aLists);
if (addScrollBars) {
// Add overlay scrollbars.
- AppendScrollPartsTo(aBuilder, aDirtyRect, aLists,
- createLayersForScrollbars, true);
+ AppendScrollPartsTo(aBuilder, aLists, createLayersForScrollbars, true);
}
return;
@@ -3376,8 +3383,7 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// Note that this does not apply for overlay scrollbars; those are drawn
// in the positioned-elements layer on top of everything else by the call
// to AppendScrollPartsTo(..., true) further down.
- AppendScrollPartsTo(aBuilder, aDirtyRect, aLists,
- createLayersForScrollbars, false);
+ AppendScrollPartsTo(aBuilder, aLists, createLayersForScrollbars, false);
const nsStyleDisplay* disp = mOuter->StyleDisplay();
if (disp && (disp->mWillChangeBitField & NS_STYLE_WILL_CHANGE_SCROLL)) {
@@ -3414,7 +3420,7 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder,
nsIScrollableFrame* sf = do_QueryFrame(mOuter);
MOZ_ASSERT(sf);
- nsDisplayListCollection scrolledContent;
+ nsDisplayListCollection scrolledContent(aBuilder);
{
// Note that setting the current scroll parent id here means that positioned children
// of this scroll info layer will pick up the scroll info layer as their scroll handoff
@@ -3506,7 +3512,10 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder,
scrolledRectClipState.ClipContainingBlockDescendants(
scrolledRectClip + aBuilder->ToReferenceFrame(mOuter));
- mOuter->BuildDisplayListForChild(aBuilder, mScrolledFrame, dirtyRect, scrolledContent);
+ nsDisplayListBuilder::AutoBuildingDisplayList
+ building(aBuilder, mOuter, dirtyRect, aBuilder->IsAtRootOfPseudoStackingContext());
+
+ mOuter->BuildDisplayListForChild(aBuilder, mScrolledFrame, scrolledContent);
}
if (contentBoxClipForNonCaretContent) {
@@ -3593,8 +3602,8 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder,
}
}
// Now display overlay scrollbars and the resizer, if we have one.
- AppendScrollPartsTo(aBuilder, aDirtyRect, scrolledContent,
- createLayersForScrollbars, true);
+ AppendScrollPartsTo(aBuilder, scrolledContent, createLayersForScrollbars, true);
+
scrolledContent.MoveTo(aLists);
}
@@ -6175,3 +6184,4 @@ ScrollFrameHelper::UsesContainerScrolling() const
}
return false;
}
+
diff --git a/layout/generic/nsGfxScrollFrame.h b/layout/generic/nsGfxScrollFrame.h
index 81bbb358f..296867856 100644
--- a/layout/generic/nsGfxScrollFrame.h
+++ b/layout/generic/nsGfxScrollFrame.h
@@ -70,11 +70,9 @@ public:
void Destroy();
void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists);
void AppendScrollPartsTo(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists,
bool aCreateLayer,
bool aPositioned);
@@ -687,9 +685,8 @@ public:
}
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override {
- mHelper.BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ mHelper.BuildDisplayList(aBuilder, aLists);
}
bool TryLayout(ScrollReflowInput* aState,
@@ -1105,9 +1102,8 @@ public:
bool aClipAllDescendants);
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override {
- mHelper.BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ mHelper.BuildDisplayList(aBuilder, aLists);
}
// XXXldb Is this actually used?
diff --git a/layout/generic/nsGridContainerFrame.cpp b/layout/generic/nsGridContainerFrame.cpp
index f771c9d7c..d7120d91e 100644
--- a/layout/generic/nsGridContainerFrame.cpp
+++ b/layout/generic/nsGridContainerFrame.cpp
@@ -6643,12 +6643,11 @@ nsGridContainerFrame::GetType() const
void
nsGridContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
DisplayBorderBackgroundOutline(aBuilder, aLists);
if (GetPrevInFlow()) {
- DisplayOverflowContainers(aBuilder, aDirtyRect, aLists);
+ DisplayOverflowContainers(aBuilder, aLists);
}
// Our children are all grid-level boxes, which behave the same as
@@ -6662,8 +6661,7 @@ nsGridContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
GridItemCSSOrderIterator::eIncludeAll, order);
for (; !iter.AtEnd(); iter.Next()) {
nsIFrame* child = *iter;
- BuildDisplayListForChild(aBuilder, child, aDirtyRect, aLists,
- ::GetDisplayFlagsForGridItem(child));
+ BuildDisplayListForChild(aBuilder, child, aLists, ::GetDisplayFlagsForGridItem(child));
}
}
diff --git a/layout/generic/nsGridContainerFrame.h b/layout/generic/nsGridContainerFrame.h
index 960558421..c9163b95c 100644
--- a/layout/generic/nsGridContainerFrame.h
+++ b/layout/generic/nsGridContainerFrame.h
@@ -98,7 +98,6 @@ public:
}
void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
nscoord GetLogicalBaseline(mozilla::WritingMode aWM) const override
diff --git a/layout/generic/nsHTMLCanvasFrame.cpp b/layout/generic/nsHTMLCanvasFrame.cpp
index bad3a710f..f86ec1136 100644
--- a/layout/generic/nsHTMLCanvasFrame.cpp
+++ b/layout/generic/nsHTMLCanvasFrame.cpp
@@ -367,7 +367,6 @@ nsHTMLCanvasFrame::BuildLayer(nsDisplayListBuilder* aBuilder,
void
nsHTMLCanvasFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (!IsVisibleForPainting(aBuilder))
diff --git a/layout/generic/nsHTMLCanvasFrame.h b/layout/generic/nsHTMLCanvasFrame.h
index e4235deae..b2d159627 100644
--- a/layout/generic/nsHTMLCanvasFrame.h
+++ b/layout/generic/nsHTMLCanvasFrame.h
@@ -45,7 +45,6 @@ public:
nsIFrame* aPrevInFlow) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h
index 57f5c460c..82bcf563a 100644
--- a/layout/generic/nsIFrame.h
+++ b/layout/generic/nsIFrame.h
@@ -1435,21 +1435,14 @@ public:
* BuildDisplayListForChild.
*
* See nsDisplayList.h for more information about display lists.
- *
- * @param aDirtyRect content outside this rectangle can be ignored; the
- * rectangle is in frame coordinates
*/
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) {}
/**
* Displays the caret onto the given display list builder. The caret is
* painted on top of the rest of the display list items.
- *
- * @param aDirtyRect is the dirty rectangle that we're repainting.
*/
void DisplayCaret(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
nsDisplayList* aList);
/**
@@ -1483,11 +1476,8 @@ public:
/**
* Builds a display list for the content represented by this frame,
* treating this frame as the root of a stacking context.
- * @param aDirtyRect content outside this rectangle can be ignored; the
- * rectangle is in frame coordinates
*/
void BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
nsDisplayList* aList);
enum {
@@ -1506,7 +1496,6 @@ public:
*/
void BuildDisplayListForChild(nsDisplayListBuilder* aBuilder,
nsIFrame* aChild,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists,
uint32_t aFlags = 0);
@@ -3530,7 +3519,7 @@ private:
nsIFrame* mNextSibling; // doubly-linked list of frames
nsIFrame* mPrevSibling; // Do not touch outside SetNextSibling!
- void MarkAbsoluteFramesForDisplayList(nsDisplayListBuilder* aBuilder, const nsRect& aDirtyRect);
+ void MarkAbsoluteFramesForDisplayList(nsDisplayListBuilder* aBuilder);
static void DestroyPaintedPresShellList(nsTArray<nsWeakPtr>* list) {
list->Clear();
diff --git a/layout/generic/nsImageFrame.cpp b/layout/generic/nsImageFrame.cpp
index c64520f2e..03fcbd8e3 100644
--- a/layout/generic/nsImageFrame.cpp
+++ b/layout/generic/nsImageFrame.cpp
@@ -116,7 +116,7 @@ static bool HaveSpecifiedSize(const nsStylePosition* aStylePosition)
// Decide whether we can optimize away reflows that result from the
// image's intrinsic size changing.
-inline bool HaveFixedSize(const ReflowInput& aReflowInput)
+static bool HaveFixedSize(const ReflowInput& aReflowInput)
{
NS_ASSERTION(aReflowInput.mStylePosition, "crappy reflowInput - null stylePosition");
// Don't try to make this optimization when an image has percentages
@@ -430,66 +430,56 @@ nsImageFrame::SourceRectToDest(const nsIntRect& aRect)
// that we'll construct image frames for them as needed if their display is
// toggled from "none" (though we won't paint them, unless their visibility
// is changed too).
-#define BAD_STATES (NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_USERDISABLED | \
- NS_EVENT_STATE_LOADING)
+#define BAD_STATES (NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_USERDISABLED)
-// This is a macro so that we don't evaluate the boolean last arg
-// unless we have to; it can be expensive
-#define IMAGE_OK(_state, _loadingOK) \
- (!(_state).HasAtLeastOneOfStates(BAD_STATES) || \
- (!(_state).HasAtLeastOneOfStates(NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_USERDISABLED) && \
- (_state).HasState(NS_EVENT_STATE_LOADING) && (_loadingOK)))
+static bool ImageOk(EventStates aState) {
+ return !aState.HasAtLeastOneOfStates(BAD_STATES);
+}
-/* static */
-bool
+static bool HasAltText(Element* aElement)
+{
+ // We always return some alternate text for <input>, see
+ // nsCSSFrameConstructor::GetAlternateTextFor.
+ if (aElement->IsHTMLElement(nsGkAtoms::input)) {
+ return true;
+ }
+
+ MOZ_ASSERT(aElement->IsHTMLElement(nsGkAtoms::img));
+ nsAutoString altText;
+ return aElement->GetAttr(kNameSpaceID_None, nsGkAtoms::alt, altText) && !altText.IsEmpty();
+}
+
+// Check if we want to use an image frame or just let the frame constructor make
+// us into an inline.
+/* static */ bool
nsImageFrame::ShouldCreateImageFrameFor(Element* aElement,
nsStyleContext* aStyleContext)
{
- EventStates state = aElement->State();
- if (IMAGE_OK(state,
- HaveSpecifiedSize(aStyleContext->StylePosition()))) {
- // Image is fine; do the image frame thing
+ if (ImageOk(aElement->State())) {
+ // Image is fine or loading; do the image frame thing
return true;
}
- // Check if we want to use a placeholder box with an icon or just
- // let the presShell make us into inline text. Decide as follows:
- //
- // - if our special "force icons" style is set, show an icon
- // - else if our "do not show placeholders" pref is set, skip the icon
- // - else:
- // - if there is a src attribute, there is no alt attribute,
- // and this is not an <object> (which could not possibly have
- // such an attribute), show an icon.
- // - if QuirksMode, and the IMG has a size show an icon.
- // - otherwise, skip the icon
- bool useSizedBox;
-
+ // If our special "force icons" style is set, show an icon
if (aStyleContext->StyleUIReset()->mForceBrokenImageIcon) {
- useSizedBox = true;
- }
- else if (gIconLoad && gIconLoad->mPrefForceInlineAltText) {
- useSizedBox = false;
+ return true;
}
- else if (aElement->HasAttr(kNameSpaceID_None, nsGkAtoms::src) &&
- !aElement->HasAttr(kNameSpaceID_None, nsGkAtoms::alt) &&
- !aElement->IsHTMLElement(nsGkAtoms::object) &&
- !aElement->IsHTMLElement(nsGkAtoms::input)) {
- // Use a sized box if we have no alt text. This means no alt attribute
- // and the node is not an object or an input (since those always have alt
- // text).
- useSizedBox = true;
+
+ // If our "do not show placeholders" pref is set, skip the icon
+ if (gIconLoad && gIconLoad->mPrefForceInlineAltText) {
+ return false;
}
- else if (aStyleContext->PresContext()->CompatibilityMode() !=
- eCompatibility_NavQuirks) {
- useSizedBox = false;
+
+ // If there is no Alt text, always create an image frame (regardless of src)
+ if (!HasAltText(aElement)) {
+ return true;
}
- else {
- // check whether we have specified size
- useSizedBox = HaveSpecifiedSize(aStyleContext->StylePosition());
+
+ if (aStyleContext->PresContext()->CompatibilityMode() == eCompatibility_NavQuirks) {
+ return HaveSpecifiedSize(aStyleContext->StylePosition());
}
-
- return useSizedBox;
+
+ return false;
}
nsresult
@@ -775,6 +765,25 @@ nsImageFrame::PredictedDestRect(const nsRect& aFrameContentBox)
StylePosition());
}
+bool nsImageFrame::ShouldShowBrokenImageIcon() const
+{
+ bool imageBroken = false;
+ // Check for broken images. valid null images (eg. img src="") are
+ // not considered broken because they have no image requests
+ nsCOMPtr<nsIImageLoadingContent> imageLoader = do_QueryInterface(mContent);
+ if (imageLoader) {
+ nsCOMPtr<imgIRequest> currentRequest;
+ imageLoader->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST,
+ getter_AddRefs(currentRequest));
+ uint32_t imageStatus;
+ imageBroken =
+ currentRequest &&
+ NS_SUCCEEDED(currentRequest->GetImageStatus(&imageStatus)) &&
+ (imageStatus & imgIRequest::STATUS_ERROR);
+ }
+ return imageBroken;
+}
+
void
nsImageFrame::EnsureIntrinsicSizeAndRatio()
{
@@ -789,25 +798,11 @@ nsImageFrame::EnsureIntrinsicSizeAndRatio()
UpdateIntrinsicSize(mImage);
UpdateIntrinsicRatio(mImage);
} else {
- // image request is null or image size not known, probably an
- // invalid image specified
+ // Image request is null or image size not known.
if (!(GetStateBits() & NS_FRAME_GENERATED_CONTENT)) {
- bool imageBroken = false;
- // check for broken images. valid null images (eg. img src="") are
- // not considered broken because they have no image requests
- nsCOMPtr<nsIImageLoadingContent> imageLoader = do_QueryInterface(mContent);
- if (imageLoader) {
- nsCOMPtr<imgIRequest> currentRequest;
- imageLoader->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST,
- getter_AddRefs(currentRequest));
- uint32_t imageStatus;
- imageBroken =
- currentRequest &&
- NS_SUCCEEDED(currentRequest->GetImageStatus(&imageStatus)) &&
- (imageStatus & imgIRequest::STATUS_ERROR);
- }
- // invalid image specified. make the image big enough for the "broken" icon
- if (imageBroken) {
+ // Likely an invalid image. Check if we should display it as broken.
+ if (ShouldShowBrokenImageIcon()) {
+ // Invalid image specified. make the image big enough for the "broken" icon
nscoord edgeLengthToUse =
nsPresContext::CSSPixelsToAppUnits(
ICON_SIZE + (2 * (ICON_PADDING + ALT_BORDER_WIDTH)));
@@ -1015,8 +1010,7 @@ nsImageFrame::Reflow(nsPresContext* aPresContext,
}
aMetrics.SetOverflowAreasToDesiredBounds();
- EventStates contentState = mContent->AsElement()->State();
- bool imageOK = IMAGE_OK(contentState, true);
+ bool imageOK = ImageOk(mContent->AsElement()->State());
// Determine if the size is available
bool haveSize = false;
@@ -1335,7 +1329,7 @@ nsImageFrame::DisplayAltFeedback(nsRenderingContext& aRenderingContext,
MOZ_ASSERT(gIconLoad, "How did we succeed in Init then?");
// Whether we draw the broken or loading icon.
- bool isLoading = IMAGE_OK(GetContent()->AsElement()->State(), true);
+ bool isLoading = ImageOk(mContent->AsElement()->State());
// Calculate the inner area
nsRect inner = GetInnerArea() + aPt;
@@ -1389,7 +1383,8 @@ nsImageFrame::DisplayAltFeedback(nsRenderingContext& aRenderingContext,
DrawResult result = DrawResult::NOT_READY;
// Check if we should display image placeholders
- if (!gIconLoad->mPrefShowPlaceholders ||
+ if (!ShouldShowBrokenImageIcon() ||
+ !gIconLoad->mPrefShowPlaceholders ||
(isLoading && !gIconLoad->mPrefShowLoadingPlaceholder)) {
result = DrawResult::SUCCESS;
} else {
@@ -1730,7 +1725,6 @@ nsImageFrame::PaintImage(nsRenderingContext& aRenderingContext, nsPoint aPt,
void
nsImageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (!IsVisibleForPainting(aBuilder))
@@ -1755,8 +1749,7 @@ nsImageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
getter_AddRefs(currentRequest));
}
- EventStates contentState = mContent->AsElement()->State();
- bool imageOK = IMAGE_OK(contentState, true);
+ bool imageOK = ImageOk(mContent->AsElement()->State());
// XXX(seth): The SizeIsAvailable check here should not be necessary - the
// intention is that a non-null mImage means we have a size, but there is
diff --git a/layout/generic/nsImageFrame.h b/layout/generic/nsImageFrame.h
index 5bc59c042..59af1be32 100644
--- a/layout/generic/nsImageFrame.h
+++ b/layout/generic/nsImageFrame.h
@@ -82,7 +82,6 @@ public:
nsContainerFrame* aParent,
nsIFrame* aPrevInFlow) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nscoord GetMinISize(nsRenderingContext *aRenderingContext) override;
virtual nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override;
@@ -107,6 +106,8 @@ public:
void OnVisibilityChange(Visibility aNewVisibility,
Maybe<OnNonvisible> aNonvisibleAction = Nothing()) override;
+ bool ShouldShowBrokenImageIcon() const;
+
#ifdef ACCESSIBILITY
virtual mozilla::a11y::AccType AccessibleType() override;
#endif
diff --git a/layout/generic/nsInlineFrame.cpp b/layout/generic/nsInlineFrame.cpp
index 7e188c247..fb77422a3 100644
--- a/layout/generic/nsInlineFrame.cpp
+++ b/layout/generic/nsInlineFrame.cpp
@@ -243,10 +243,9 @@ nsInlineFrame::StealFrame(nsIFrame* aChild)
void
nsInlineFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- BuildDisplayListForInline(aBuilder, aDirtyRect, aLists);
+ BuildDisplayListForInline(aBuilder, aLists);
// The sole purpose of this is to trigger display of the selection
// window for Named Anchors, which don't have any children and
diff --git a/layout/generic/nsInlineFrame.h b/layout/generic/nsInlineFrame.h
index 36df6be93..c1e0d7fe3 100644
--- a/layout/generic/nsInlineFrame.h
+++ b/layout/generic/nsInlineFrame.h
@@ -31,7 +31,6 @@ public:
// nsIFrame overrides
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
#ifdef ACCESSIBILITY
diff --git a/layout/generic/nsLeafFrame.h b/layout/generic/nsLeafFrame.h
index 407f9846d..7087fb6cf 100644
--- a/layout/generic/nsLeafFrame.h
+++ b/layout/generic/nsLeafFrame.h
@@ -24,7 +24,6 @@ public:
// nsIFrame replacements
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override {
DO_GLOBAL_REFLOW_COUNT_DSP("nsLeafFrame");
DisplayBorderBackgroundOutline(aBuilder, aLists);
diff --git a/layout/generic/nsPageFrame.cpp b/layout/generic/nsPageFrame.cpp
index ae3af6ef7..31a686e83 100644
--- a/layout/generic/nsPageFrame.cpp
+++ b/layout/generic/nsPageFrame.cpp
@@ -437,7 +437,7 @@ PruneDisplayListForExtraPage(nsDisplayListBuilder* aBuilder,
static void
BuildDisplayListForExtraPage(nsDisplayListBuilder* aBuilder,
nsPageFrame* aPage, nsIFrame* aExtraPage,
- const nsRect& aDirtyRect, nsDisplayList* aList)
+ nsDisplayList* aList)
{
// The only content in aExtraPage we care about is out-of-flow content whose
// placeholders have occurred in aPage. If
@@ -447,7 +447,7 @@ BuildDisplayListForExtraPage(nsDisplayListBuilder* aBuilder,
return;
}
nsDisplayList list;
- aExtraPage->BuildDisplayListForStackingContext(aBuilder, aDirtyRect, &list);
+ aExtraPage->BuildDisplayListForStackingContext(aBuilder, &list);
PruneDisplayListForExtraPage(aBuilder, aPage, aExtraPage, &list);
aList->AppendToTop(&list);
}
@@ -517,10 +517,9 @@ protected:
//------------------------------------------------------------------------------
void
nsPageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- nsDisplayListCollection set;
+ nsDisplayListCollection set(aBuilder);
if (PresContext()->IsScreen()) {
DisplayBorderBackgroundOutline(aBuilder, aLists);
@@ -558,7 +557,10 @@ nsPageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
clipState.ClipContainingBlockDescendants(clipRect, nullptr);
nsRect dirtyRect = child->GetVisualOverflowRectRelativeToSelf();
- child->BuildDisplayListForStackingContext(aBuilder, dirtyRect, &content);
+ nsDisplayListBuilder::AutoBuildingDisplayList
+ buildingForChild(aBuilder, child, dirtyRect,
+ aBuilder->IsAtRootOfPseudoStackingContext());
+ child->BuildDisplayListForStackingContext(aBuilder, &content);
// We may need to paint out-of-flow frames whose placeholders are
// on other pages. Add those pages to our display list. Note that
@@ -569,8 +571,12 @@ nsPageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// following placeholders to their out-of-flows) end up on the list.
nsIFrame* page = child;
while ((page = GetNextPage(page)) != nullptr) {
- BuildDisplayListForExtraPage(aBuilder, this, page,
- dirtyRect + child->GetOffsetTo(page), &content);
+ nsRect childDirty = dirtyRect + child->GetOffsetTo(page);
+
+ nsDisplayListBuilder::AutoBuildingDisplayList
+ buildingForChild(aBuilder, page, childDirty,
+ aBuilder->IsAtRootOfPseudoStackingContext());
+ BuildDisplayListForExtraPage(aBuilder, this, page, &content);
}
// Invoke AutoBuildingDisplayList to ensure that the correct dirtyRect
diff --git a/layout/generic/nsPageFrame.h b/layout/generic/nsPageFrame.h
index aab2ac7b8..86516fe73 100644
--- a/layout/generic/nsPageFrame.h
+++ b/layout/generic/nsPageFrame.h
@@ -29,7 +29,6 @@ public:
nsReflowStatus& aStatus) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
/**
diff --git a/layout/generic/nsPlaceholderFrame.cpp b/layout/generic/nsPlaceholderFrame.cpp
index bd380a2d9..f234b2f2d 100644
--- a/layout/generic/nsPlaceholderFrame.cpp
+++ b/layout/generic/nsPlaceholderFrame.cpp
@@ -240,7 +240,6 @@ PaintDebugPlaceholder(nsIFrame* aFrame, DrawTarget* aDrawTarget,
void
nsPlaceholderFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
DO_GLOBAL_REFLOW_COUNT_DSP("nsPlaceholderFrame");
diff --git a/layout/generic/nsPlaceholderFrame.h b/layout/generic/nsPlaceholderFrame.h
index 0c23a4f75..11cb98592 100644
--- a/layout/generic/nsPlaceholderFrame.h
+++ b/layout/generic/nsPlaceholderFrame.h
@@ -107,7 +107,6 @@ public:
#if defined(DEBUG) || (defined(MOZ_REFLOW_PERF_DSP) && defined(MOZ_REFLOW_PERF))
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
#endif // DEBUG || (MOZ_REFLOW_PERF_DSP && MOZ_REFLOW_PERF)
diff --git a/layout/generic/nsPluginFrame.cpp b/layout/generic/nsPluginFrame.cpp
index 34ed12d44..6e9e072e7 100644
--- a/layout/generic/nsPluginFrame.cpp
+++ b/layout/generic/nsPluginFrame.cpp
@@ -1182,7 +1182,6 @@ nsPluginFrame::IsTransparentMode() const
void
nsPluginFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// XXX why are we painting collapsed object frames?
diff --git a/layout/generic/nsPluginFrame.h b/layout/generic/nsPluginFrame.h
index 5d9f9f475..57db78acc 100644
--- a/layout/generic/nsPluginFrame.h
+++ b/layout/generic/nsPluginFrame.h
@@ -81,7 +81,6 @@ public:
const ReflowInput* aReflowInput,
nsDidReflowStatus aStatus) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsresult HandleEvent(nsPresContext* aPresContext,
diff --git a/layout/generic/nsRubyBaseContainerFrame.cpp b/layout/generic/nsRubyBaseContainerFrame.cpp
index 401b7d576..566dee14f 100644
--- a/layout/generic/nsRubyBaseContainerFrame.cpp
+++ b/layout/generic/nsRubyBaseContainerFrame.cpp
@@ -22,6 +22,7 @@
#include "RubyUtils.h"
using namespace mozilla;
+using namespace mozilla::gfx;
//----------------------------------------------------------------------
diff --git a/layout/generic/nsRubyTextFrame.cpp b/layout/generic/nsRubyTextFrame.cpp
index b4a26ff33..2848cb6fc 100644
--- a/layout/generic/nsRubyTextFrame.cpp
+++ b/layout/generic/nsRubyTextFrame.cpp
@@ -63,14 +63,13 @@ nsRubyTextFrame::GetFrameName(nsAString& aResult) const
/* virtual */ void
nsRubyTextFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (IsAutoHidden()) {
return;
}
- nsRubyContentFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsRubyContentFrame::BuildDisplayList(aBuilder, aLists);
}
/* virtual */ void
diff --git a/layout/generic/nsRubyTextFrame.h b/layout/generic/nsRubyTextFrame.h
index 841b5081f..83c24d49d 100644
--- a/layout/generic/nsRubyTextFrame.h
+++ b/layout/generic/nsRubyTextFrame.h
@@ -34,7 +34,6 @@ public:
#endif
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void Reflow(nsPresContext* aPresContext,
diff --git a/layout/generic/nsSimplePageSequenceFrame.cpp b/layout/generic/nsSimplePageSequenceFrame.cpp
index 2e74afc3b..d8ec898a6 100644
--- a/layout/generic/nsSimplePageSequenceFrame.cpp
+++ b/layout/generic/nsSimplePageSequenceFrame.cpp
@@ -808,7 +808,6 @@ ComputePageSequenceTransform(nsIFrame* aFrame, float aAppUnitsPerPixel)
void
nsSimplePageSequenceFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
DisplayBorderBackgroundOutline(aBuilder, aLists);
@@ -822,13 +821,16 @@ nsSimplePageSequenceFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
clipState.Clear();
nsIFrame* child = PrincipalChildList().FirstChild();
- nsRect dirty = aDirtyRect;
+ nsRect dirty = aBuilder->GetDirtyRect();
dirty.ScaleInverseRoundOut(PresContext()->GetPrintPreviewScale());
while (child) {
if (child->GetVisualOverflowRectRelativeToParent().Intersects(dirty)) {
- child->BuildDisplayListForStackingContext(aBuilder,
- dirty - child->GetPosition(), &content);
+ nsDisplayListBuilder::AutoBuildingDisplayList
+ buildingForChild(aBuilder, child,
+ dirty - child->GetPosition(),
+ aBuilder->IsAtRootOfPseudoStackingContext());
+ child->BuildDisplayListForStackingContext(aBuilder, &content);
aBuilder->ResetMarkedFramesForDisplayList();
}
child = child->GetNextSibling();
diff --git a/layout/generic/nsSimplePageSequenceFrame.h b/layout/generic/nsSimplePageSequenceFrame.h
index c4e1e84b6..4981c67a8 100644
--- a/layout/generic/nsSimplePageSequenceFrame.h
+++ b/layout/generic/nsSimplePageSequenceFrame.h
@@ -69,7 +69,6 @@ public:
nsReflowStatus& aStatus) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
// nsIPageSequenceFrame
diff --git a/layout/generic/nsSubDocumentFrame.cpp b/layout/generic/nsSubDocumentFrame.cpp
index 47026b73c..fd9a7d32c 100644
--- a/layout/generic/nsSubDocumentFrame.cpp
+++ b/layout/generic/nsSubDocumentFrame.cpp
@@ -327,7 +327,6 @@ WrapBackgroundColorInOwnLayer(nsDisplayListBuilder* aBuilder,
void
nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (!IsVisibleForPainting(aBuilder))
@@ -343,7 +342,7 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
bool pointerEventsNone =
StyleUserInterface()->mPointerEvents == NS_STYLE_POINTER_EVENTS_NONE;
if (!aBuilder->IsForEventDelivery() || !pointerEventsNone) {
- nsDisplayListCollection decorations;
+ nsDisplayListCollection decorations(aBuilder);
DisplayBorderBackgroundOutline(aBuilder, decorations);
if (rfp) {
// Wrap background colors of <iframe>s with remote subdocuments in their
@@ -368,7 +367,7 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
}
if (rfp) {
- rfp->BuildDisplayList(aBuilder, this, aDirtyRect, aLists);
+ rfp->BuildDisplayList(aBuilder, this, aLists);
return;
}
@@ -393,17 +392,18 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
nsIFrame* savedIgnoreScrollFrame = nullptr;
if (subdocRootFrame) {
// get the dirty rect relative to the root frame of the subdoc
- dirty = aDirtyRect + GetOffsetToCrossDoc(subdocRootFrame);
+ dirty = aBuilder->GetDirtyRect() + GetOffsetToCrossDoc(subdocRootFrame);
// and convert into the appunits of the subdoc
dirty = dirty.ScaleToOtherAppUnitsRoundOut(parentAPD, subdocAPD);
if (nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame()) {
nsIScrollableFrame* rootScrollableFrame = presShell->GetRootScrollFrameAsScrollable();
MOZ_ASSERT(rootScrollableFrame);
- // Use a copy, so the dirty rect doesn't get modified to the display port.
- nsRect copy = dirty;
+ // Use a copy, so the rects don't get modified.
+ nsRect copyOfDirty = dirty;
haveDisplayPort = rootScrollableFrame->DecideScrollableLayer(aBuilder,
- &copy, /* aAllowCreateDisplayPort = */ true);
+ &copyOfDirty,
+ /* aAllowCreateDisplayPort = */ true);
if (!gfxPrefs::LayoutUseContainersForRootFrames()) {
haveDisplayPort = false;
}
@@ -417,7 +417,7 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
aBuilder->EnterPresShell(subdocRootFrame, pointerEventsNone);
} else {
- dirty = aDirtyRect;
+ dirty = aBuilder->GetDirtyRect();
}
DisplayListClipState::AutoSaveRestore clipState(aBuilder);
@@ -456,6 +456,13 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
nestedClipState.EnterStackingContextContents(true);
}
+ // Invoke AutoBuildingDisplayList to ensure that the correct dirty rect
+ // is used to compute the visible rect if AddCanvasBackgroundColorItem
+ // creates a display item.
+ nsIFrame* frame = subdocRootFrame ? subdocRootFrame : this;
+ nsDisplayListBuilder::AutoBuildingDisplayList
+ building(aBuilder, frame, dirty, true);
+
if (subdocRootFrame) {
nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame();
nsDisplayListBuilder::AutoCurrentScrollParentIdSetter idSetter(
@@ -466,7 +473,7 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
aBuilder->SetAncestorHasApzAwareEventHandler(false);
subdocRootFrame->
- BuildDisplayListForStackingContext(aBuilder, dirty, &childItems);
+ BuildDisplayListForStackingContext(aBuilder, &childItems);
}
if (!aBuilder->IsForEventDelivery()) {
@@ -485,15 +492,8 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// painted on the page itself.
if (nsLayoutUtils::NeedsPrintPreviewBackground(presContext)) {
presShell->AddPrintPreviewBackgroundItem(
- *aBuilder, childItems, subdocRootFrame ? subdocRootFrame : this,
- bounds);
+ *aBuilder, childItems, frame, bounds);
} else {
- // Invoke AutoBuildingDisplayList to ensure that the correct dirty rect
- // is used to compute the visible rect if AddCanvasBackgroundColorItem
- // creates a display item.
- nsIFrame* frame = subdocRootFrame ? subdocRootFrame : this;
- nsDisplayListBuilder::AutoBuildingDisplayList
- building(aBuilder, frame, dirty, true);
// Add the canvas background color to the bottom of the list. This
// happens after we've built the list so that AddCanvasBackgroundColorItem
// can monkey with the contents if necessary.
diff --git a/layout/generic/nsSubDocumentFrame.h b/layout/generic/nsSubDocumentFrame.h
index 54f08d4fe..93d908dcc 100644
--- a/layout/generic/nsSubDocumentFrame.h
+++ b/layout/generic/nsSubDocumentFrame.h
@@ -79,7 +79,6 @@ public:
nsReflowStatus& aStatus) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsresult AttributeChanged(int32_t aNameSpaceID,
diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp
index 59ef020ce..4bc542626 100644
--- a/layout/generic/nsTextFrame.cpp
+++ b/layout/generic/nsTextFrame.cpp
@@ -4998,7 +4998,6 @@ nsDisplayText::Paint(nsDisplayListBuilder* aBuilder,
void
nsTextFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (!IsVisibleForPainting(aBuilder))
diff --git a/layout/generic/nsTextFrame.h b/layout/generic/nsTextFrame.h
index 425dbb737..43a4f5f1c 100644
--- a/layout/generic/nsTextFrame.h
+++ b/layout/generic/nsTextFrame.h
@@ -65,7 +65,6 @@ public:
// nsIFrame
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void Init(nsIContent* aContent,
diff --git a/layout/generic/nsTextFrameUtils.cpp b/layout/generic/nsTextFrameUtils.cpp
index d07400f2b..8562839cc 100644
--- a/layout/generic/nsTextFrameUtils.cpp
+++ b/layout/generic/nsTextFrameUtils.cpp
@@ -13,6 +13,8 @@
#include "nsUnicharUtils.h"
#include <algorithm>
+using namespace mozilla;
+
static bool IsDiscardable(char16_t ch, uint32_t* aFlags)
{
// Unlike IS_DISCARDABLE, we don't discard \r. \r will be ignored by gfxTextRun
diff --git a/layout/generic/nsTextRunTransformations.cpp b/layout/generic/nsTextRunTransformations.cpp
index 84d669ed6..ac3edd0b9 100644
--- a/layout/generic/nsTextRunTransformations.cpp
+++ b/layout/generic/nsTextRunTransformations.cpp
@@ -20,6 +20,7 @@
#include "IrishCasing.h"
using namespace mozilla;
+using namespace mozilla::gfx;
// Unicode characters needing special casing treatment in tr/az languages
#define LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE 0x0130
diff --git a/layout/generic/nsTextRunTransformations.h b/layout/generic/nsTextRunTransformations.h
index 662a5d2f8..db29c7315 100644
--- a/layout/generic/nsTextRunTransformations.h
+++ b/layout/generic/nsTextRunTransformations.h
@@ -12,6 +12,8 @@
#include "gfxTextRun.h"
#include "nsStyleContext.h"
+using namespace mozilla;
+
class nsTransformedTextRun;
struct nsTransformedCharStyle final {
diff --git a/layout/generic/nsVideoFrame.cpp b/layout/generic/nsVideoFrame.cpp
index 9f27684a7..cea209cb5 100644
--- a/layout/generic/nsVideoFrame.cpp
+++ b/layout/generic/nsVideoFrame.cpp
@@ -446,7 +446,6 @@ public:
void
nsVideoFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (!IsVisibleForPainting(aBuilder))
@@ -482,14 +481,15 @@ nsVideoFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// but only want to draw mPosterImage conditionally. Others we
// always add to the display list.
for (nsIFrame* child : mFrames) {
- if (child->GetContent() != mPosterImage || shouldDisplayPoster) {
- child->BuildDisplayListForStackingContext(aBuilder,
- aDirtyRect - child->GetOffsetTo(this),
- aLists.Content());
- } else if (child->GetType() == nsGkAtoms::boxFrame) {
- child->BuildDisplayListForStackingContext(aBuilder,
- aDirtyRect - child->GetOffsetTo(this),
- aLists.Content());
+ if (child->GetContent() != mPosterImage || shouldDisplayPoster ||
+ child->GetType() == nsGkAtoms::boxFrame) {
+
+ nsDisplayListBuilder::AutoBuildingDisplayList
+ buildingForChild(aBuilder, child,
+ aBuilder->GetDirtyRect() - child->GetOffsetTo(this),
+ aBuilder->IsAtRootOfPseudoStackingContext());
+
+ child->BuildDisplayListForStackingContext(aBuilder, aLists.Content());
}
}
}
diff --git a/layout/generic/nsVideoFrame.h b/layout/generic/nsVideoFrame.h
index 36e9f9ac3..d624ae6b9 100644
--- a/layout/generic/nsVideoFrame.h
+++ b/layout/generic/nsVideoFrame.h
@@ -45,7 +45,6 @@ public:
NS_DECL_FRAMEARENA_HELPERS
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsresult AttributeChanged(int32_t aNameSpaceID,
diff --git a/layout/generic/nsViewportFrame.cpp b/layout/generic/nsViewportFrame.cpp
index 39491a0ed..a37d2a5a7 100644
--- a/layout/generic/nsViewportFrame.cpp
+++ b/layout/generic/nsViewportFrame.cpp
@@ -16,6 +16,7 @@
#include "nsAbsoluteContainingBlock.h"
#include "GeckoProfiler.h"
#include "nsIMozBrowserFrame.h"
+#include "nsPlaceholderFrame.h"
using namespace mozilla;
typedef nsAbsoluteContainingBlock::AbsPosReflowFlags AbsPosReflowFlags;
@@ -48,7 +49,6 @@ ViewportFrame::Init(nsIContent* aContent,
void
ViewportFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
PROFILER_LABEL("ViewportFrame", "BuildDisplayList",
@@ -58,7 +58,7 @@ ViewportFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// make the kid's BorderBackground our own. This ensures that the canvas
// frame's background becomes our own background and therefore appears
// below negative z-index elements.
- BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists);
+ BuildDisplayListForChild(aBuilder, kid, aLists);
}
nsDisplayList topLayerList;
@@ -109,8 +109,12 @@ BuildDisplayListForTopLayerFrame(nsDisplayListBuilder* aBuilder,
clipState.SetScrollClipForContainingBlockDescendants(
aBuilder, savedOutOfFlowData->mContainingBlockScrollClip);
}
+ nsDisplayListBuilder::AutoBuildingDisplayList
+ buildingForChild(aBuilder, aFrame, dirty,
+ aBuilder->IsAtRootOfPseudoStackingContext());
+
nsDisplayList list;
- aFrame->BuildDisplayListForStackingContext(aBuilder, dirty, &list);
+ aFrame->BuildDisplayListForStackingContext(aBuilder, &list);
aList->AppendToTop(&list);
}
diff --git a/layout/generic/nsViewportFrame.h b/layout/generic/nsViewportFrame.h
index 062de4054..3e5263093 100644
--- a/layout/generic/nsViewportFrame.h
+++ b/layout/generic/nsViewportFrame.h
@@ -56,7 +56,6 @@ public:
#endif
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
void BuildDisplayListForTopLayer(nsDisplayListBuilder* aBuilder,
diff --git a/layout/ipc/RenderFrameParent.cpp b/layout/ipc/RenderFrameParent.cpp
index 8162d02d7..0f4aa11bb 100644
--- a/layout/ipc/RenderFrameParent.cpp
+++ b/layout/ipc/RenderFrameParent.cpp
@@ -266,7 +266,6 @@ RenderFrameParent::GetLayerTreeId() const
void
RenderFrameParent::BuildDisplayList(nsDisplayListBuilder* aBuilder,
nsSubDocumentFrame* aFrame,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// We're the subdoc for <browser remote="true"> and it has
diff --git a/layout/ipc/RenderFrameParent.h b/layout/ipc/RenderFrameParent.h
index 274f8ff6d..f91cfe614 100644
--- a/layout/ipc/RenderFrameParent.h
+++ b/layout/ipc/RenderFrameParent.h
@@ -64,7 +64,6 @@ public:
void BuildDisplayList(nsDisplayListBuilder* aBuilder,
nsSubDocumentFrame* aFrame,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists);
already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
diff --git a/layout/mathml/nsMathMLChar.cpp b/layout/mathml/nsMathMLChar.cpp
index 507e32b22..4b02a52d8 100644
--- a/layout/mathml/nsMathMLChar.cpp
+++ b/layout/mathml/nsMathMLChar.cpp
@@ -1992,7 +1992,8 @@ nsMathMLChar::Display(nsDisplayListBuilder* aBuilder,
if (styleContext != parentContext &&
NS_GET_A(backg->mBackgroundColor) > 0) {
nsDisplayBackgroundImage::AppendBackgroundItemsToTop(
- aBuilder, aForFrame, mRect, aLists.BorderBackground(),
+ aBuilder, aForFrame, mRect + aBuilder->ToReferenceFrame(aForFrame),
+ aLists.BorderBackground(),
/* aAllowWillPaintBorderOptimization */ true, styleContext);
}
//else
diff --git a/layout/mathml/nsMathMLContainerFrame.cpp b/layout/mathml/nsMathMLContainerFrame.cpp
index 93b631c9d..8e22ba204 100644
--- a/layout/mathml/nsMathMLContainerFrame.cpp
+++ b/layout/mathml/nsMathMLContainerFrame.cpp
@@ -618,7 +618,6 @@ nsMathMLContainerFrame::PropagatePresentationDataFromChildAt(nsIFrame* aPa
void
nsMathMLContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// report an error if something wrong was found in this frame
@@ -633,8 +632,7 @@ nsMathMLContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
DisplayBorderBackgroundOutline(aBuilder, aLists);
- BuildDisplayListForNonBlockChildren(aBuilder, aDirtyRect, aLists,
- DISPLAY_CHILD_INLINE);
+ BuildDisplayListForNonBlockChildren(aBuilder, aLists, DISPLAY_CHILD_INLINE);
#if defined(DEBUG) && defined(SHOW_BOUNDING_BOX)
// for visual debug
diff --git a/layout/mathml/nsMathMLContainerFrame.h b/layout/mathml/nsMathMLContainerFrame.h
index 94ccf70d2..61c59a4fe 100644
--- a/layout/mathml/nsMathMLContainerFrame.h
+++ b/layout/mathml/nsMathMLContainerFrame.h
@@ -126,7 +126,6 @@ public:
}
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual bool ComputeCustomOverflow(nsOverflowAreas& aOverflowAreas) override;
diff --git a/layout/mathml/nsMathMLSelectedFrame.cpp b/layout/mathml/nsMathMLSelectedFrame.cpp
index 2378d0763..11eb14d83 100644
--- a/layout/mathml/nsMathMLSelectedFrame.cpp
+++ b/layout/mathml/nsMathMLSelectedFrame.cpp
@@ -71,14 +71,13 @@ nsMathMLSelectedFrame::SetInitialChildList(ChildListID aListID,
// Only paint the selected child...
void
nsMathMLSelectedFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// Report an error if something wrong was found in this frame.
// We can't call nsDisplayMathMLError from here,
// so ask nsMathMLContainerFrame to do the work for us.
if (NS_MATHML_HAS_ERROR(mPresentationData.flags)) {
- nsMathMLContainerFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsMathMLContainerFrame::BuildDisplayList(aBuilder, aLists);
return;
}
@@ -89,7 +88,7 @@ nsMathMLSelectedFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// Put the child's background directly onto the content list
nsDisplayListSet set(aLists, aLists.Content());
// The children should be in content order
- BuildDisplayListForChild(aBuilder, childFrame, aDirtyRect, set);
+ BuildDisplayListForChild(aBuilder, childFrame, set);
}
#if defined(DEBUG) && defined(SHOW_BOUNDING_BOX)
diff --git a/layout/mathml/nsMathMLSelectedFrame.h b/layout/mathml/nsMathMLSelectedFrame.h
index ad523a594..872351829 100644
--- a/layout/mathml/nsMathMLSelectedFrame.h
+++ b/layout/mathml/nsMathMLSelectedFrame.h
@@ -26,7 +26,6 @@ public:
ChildListChanged(int32_t aModType) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsresult
diff --git a/layout/mathml/nsMathMLmencloseFrame.cpp b/layout/mathml/nsMathMLmencloseFrame.cpp
index 64277a92e..236a5ab07 100644
--- a/layout/mathml/nsMathMLmencloseFrame.cpp
+++ b/layout/mathml/nsMathMLmencloseFrame.cpp
@@ -201,12 +201,11 @@ nsMathMLmencloseFrame::TransmitAutomaticData()
void
nsMathMLmencloseFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
/////////////
// paint the menclosed content
- nsMathMLContainerFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsMathMLContainerFrame::BuildDisplayList(aBuilder, aLists);
if (NS_MATHML_HAS_ERROR(mPresentationData.flags))
return;
diff --git a/layout/mathml/nsMathMLmencloseFrame.h b/layout/mathml/nsMathMLmencloseFrame.h
index 82d73b2cf..e9e7a2b0a 100644
--- a/layout/mathml/nsMathMLmencloseFrame.h
+++ b/layout/mathml/nsMathMLmencloseFrame.h
@@ -70,7 +70,6 @@ public:
GetAdditionalStyleContext(int32_t aIndex) const override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
NS_IMETHOD
diff --git a/layout/mathml/nsMathMLmfencedFrame.cpp b/layout/mathml/nsMathMLmfencedFrame.cpp
index a5f5ed4d9..bc663a571 100644
--- a/layout/mathml/nsMathMLmfencedFrame.cpp
+++ b/layout/mathml/nsMathMLmfencedFrame.cpp
@@ -161,12 +161,11 @@ nsMathMLmfencedFrame::CreateFencesAndSeparators(nsPresContext* aPresContext)
void
nsMathMLmfencedFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
/////////////
// display the content
- nsMathMLContainerFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsMathMLContainerFrame::BuildDisplayList(aBuilder, aLists);
////////////
// display fences and separators
diff --git a/layout/mathml/nsMathMLmfencedFrame.h b/layout/mathml/nsMathMLmfencedFrame.h
index 2d7535d0c..472e5aed9 100644
--- a/layout/mathml/nsMathMLmfencedFrame.h
+++ b/layout/mathml/nsMathMLmfencedFrame.h
@@ -41,7 +41,6 @@ public:
nsReflowStatus& aStatus) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void
diff --git a/layout/mathml/nsMathMLmfracFrame.cpp b/layout/mathml/nsMathMLmfracFrame.cpp
index 4e74faea2..731cca7d0 100644
--- a/layout/mathml/nsMathMLmfracFrame.cpp
+++ b/layout/mathml/nsMathMLmfracFrame.cpp
@@ -149,12 +149,11 @@ nsMathMLmfracFrame::CalcLineThickness(nsPresContext* aPresContext,
void
nsMathMLmfracFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
/////////////
// paint the numerator and denominator
- nsMathMLContainerFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsMathMLContainerFrame::BuildDisplayList(aBuilder, aLists);
/////////////
// paint the fraction line
diff --git a/layout/mathml/nsMathMLmfracFrame.h b/layout/mathml/nsMathMLmfracFrame.h
index 330a31180..8ced03694 100644
--- a/layout/mathml/nsMathMLmfracFrame.h
+++ b/layout/mathml/nsMathMLmfracFrame.h
@@ -67,7 +67,6 @@ public:
ReflowOutput& aDesiredSize) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsresult
diff --git a/layout/mathml/nsMathMLmoFrame.cpp b/layout/mathml/nsMathMLmoFrame.cpp
index 591b46309..3ef7b88d0 100644
--- a/layout/mathml/nsMathMLmoFrame.cpp
+++ b/layout/mathml/nsMathMLmoFrame.cpp
@@ -78,14 +78,13 @@ nsMathMLmoFrame::UseMathMLChar()
void
nsMathMLmoFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
bool useMathMLChar = UseMathMLChar();
if (!useMathMLChar) {
// let the base class do everything
- nsMathMLTokenFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsMathMLTokenFrame::BuildDisplayList(aBuilder, aLists);
} else {
DisplayBorderBackgroundOutline(aBuilder, aLists);
diff --git a/layout/mathml/nsMathMLmoFrame.h b/layout/mathml/nsMathMLmoFrame.h
index f25107a20..15df62ac2 100644
--- a/layout/mathml/nsMathMLmoFrame.h
+++ b/layout/mathml/nsMathMLmoFrame.h
@@ -29,7 +29,6 @@ public:
GetAdditionalStyleContext(int32_t aIndex) const override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
NS_IMETHOD
diff --git a/layout/mathml/nsMathMLmrootFrame.cpp b/layout/mathml/nsMathMLmrootFrame.cpp
index 4c81bde3d..300adcb91 100644
--- a/layout/mathml/nsMathMLmrootFrame.cpp
+++ b/layout/mathml/nsMathMLmrootFrame.cpp
@@ -77,12 +77,11 @@ nsMathMLmrootFrame::TransmitAutomaticData()
void
nsMathMLmrootFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
/////////////
// paint the content we are square-rooting
- nsMathMLContainerFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsMathMLContainerFrame::BuildDisplayList(aBuilder, aLists);
/////////////
// paint the sqrt symbol
diff --git a/layout/mathml/nsMathMLmrootFrame.h b/layout/mathml/nsMathMLmrootFrame.h
index 0996af26b..ddf6f89a6 100644
--- a/layout/mathml/nsMathMLmrootFrame.h
+++ b/layout/mathml/nsMathMLmrootFrame.h
@@ -51,7 +51,6 @@ public:
ReflowOutput& aDesiredSize) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
uint8_t
diff --git a/layout/printing/ipc/RemotePrintJobParent.cpp b/layout/printing/ipc/RemotePrintJobParent.cpp
index 2f4dbd56e..d49927da3 100644
--- a/layout/printing/ipc/RemotePrintJobParent.cpp
+++ b/layout/printing/ipc/RemotePrintJobParent.cpp
@@ -18,7 +18,6 @@
#include "nsIDeviceContextSpec.h"
#include "nsIPrintSettings.h"
#include "nsIWebProgressListener.h"
-#include "PrintTranslator.h"
namespace mozilla {
namespace layout {
diff --git a/layout/printing/ipc/RemotePrintJobParent.h b/layout/printing/ipc/RemotePrintJobParent.h
index a96cc7eaa..752ef601e 100644
--- a/layout/printing/ipc/RemotePrintJobParent.h
+++ b/layout/printing/ipc/RemotePrintJobParent.h
@@ -13,11 +13,11 @@
#include "nsCOMPtr.h"
#include "mozilla/RefPtr.h"
#include "mozilla/UniquePtr.h"
+#include "mozilla/layout/PrintTranslator.h"
class nsDeviceContext;
class nsIPrintSettings;
class nsIWebProgressListener;
-class PrintTranslator;
namespace mozilla {
namespace layout {
diff --git a/layout/printing/moz.build b/layout/printing/moz.build
index 1a82d7cdb..745c45c4b 100644
--- a/layout/printing/moz.build
+++ b/layout/printing/moz.build
@@ -13,11 +13,12 @@ XPIDL_SOURCES += [
EXPORTS.mozilla.layout += [
'ipc/RemotePrintJobChild.h',
'ipc/RemotePrintJobParent.h',
+ 'PrintTranslator.h',
]
XPIDL_MODULE = 'layout_printing'
-UNIFIED_SOURCES += [
+SOURCES += [
'ipc/RemotePrintJobChild.cpp',
'ipc/RemotePrintJobParent.cpp',
'nsPagePrintTimer.cpp',
diff --git a/layout/printing/nsPrintData.cpp b/layout/printing/nsPrintData.cpp
index 1914f779b..d760f7f0a 100644
--- a/layout/printing/nsPrintData.cpp
+++ b/layout/printing/nsPrintData.cpp
@@ -7,9 +7,11 @@
#include "nsIStringBundle.h"
#include "nsIServiceManager.h"
+#include "nsPIDOMWindow.h"
#include "nsPrintObject.h"
#include "nsPrintPreviewListener.h"
#include "nsIWebProgressListener.h"
+#include "nsIWidget.h"
#include "mozilla/Services.h"
//-----------------------------------------------------
diff --git a/layout/printing/nsPrintEngine.cpp b/layout/printing/nsPrintEngine.cpp
index f2db53250..67208447a 100644
--- a/layout/printing/nsPrintEngine.cpp
+++ b/layout/printing/nsPrintEngine.cpp
@@ -16,6 +16,7 @@
#include "nsPIDOMWindow.h"
#include "nsIDocShell.h"
#include "nsIURI.h"
+#include "nsIFile.h"
#include "nsITextToSubURI.h"
#include "nsError.h"
@@ -143,7 +144,7 @@ using namespace mozilla::dom;
#define DUMP_LAYOUT_LEVEL 9 // this turns on the dumping of each doucment's layout info
#ifndef PR_PL
-static mozilla::LazyLogModule gPrintingLog("printing")
+static mozilla::LazyLogModule gPrintingLog("printing");
#define PR_PL(_p1) MOZ_LOG(gPrintingLog, mozilla::LogLevel::Debug, _p1);
#endif
diff --git a/layout/printing/nsPrintObject.cpp b/layout/printing/nsPrintObject.cpp
index 9165374c2..fe9622a1c 100644
--- a/layout/printing/nsPrintObject.cpp
+++ b/layout/printing/nsPrintObject.cpp
@@ -6,6 +6,7 @@
#include "nsPrintObject.h"
#include "nsIContentViewer.h"
#include "nsIDOMDocument.h"
+#include "nsIDOMElement.h"
#include "nsContentUtils.h" // for nsAutoScriptBlocker
#include "nsIInterfaceRequestorUtils.h"
#include "nsPIDOMWindow.h"
@@ -14,6 +15,9 @@
#include "nsIDocShellTreeItem.h"
#include "nsIBaseWindow.h"
#include "nsIDocument.h"
+#include "nsIWidget.h"
+#include "mozilla/Unused.h"
+#include "mozilla/dom/Element.h"
//---------------------------------------------------
//-- nsPrintObject Class Impl
diff --git a/layout/reftests/backgrounds/really-big-background.html b/layout/reftests/backgrounds/really-big-background.html
index fd33d573a..741a7cbfa 100644
--- a/layout/reftests/backgrounds/really-big-background.html
+++ b/layout/reftests/backgrounds/really-big-background.html
@@ -1,2 +1,2 @@
<!DOCTYPE html>
-<img style="background-image: url(really-big-background.png); width: 1600px; height: 1200px; position: absolute;"></img>
+<img alt=" " style="background-image: url(really-big-background.png); width: 1600px; height: 1200px; position: absolute;"></img>
diff --git a/layout/reftests/bugs/521602.html b/layout/reftests/bugs/521602.html
index fa07eb1cd..4ef57ea9c 100644
--- a/layout/reftests/bugs/521602.html
+++ b/layout/reftests/bugs/521602.html
@@ -1,4 +1,5 @@
<body onload="document.getElementById('i').removeAttribute('src');">
<div style="outline: 1px solid black">
-<img id="i" src="data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%C8%00%00%00%C8%04%03%00%00%00_v%B3%AD%00%00%000PLTE%9D%0B%08%1F%20%1E231%3F%40%3EOQNefdnpm%7F%81~%97%99%96%9F%A1%9E%AE%B0%AD%CC%CE%CB%DE%E0%DD%FE%FF%FC%00%01%00%0F%11%0Di%C4%2B%A9%00%00%00%01tRNS%00%40%E6%D8%0f%00%00%00%01bKGD%00%88%05%1DH%00%00%00%10acTl%00%00%00%0B%00%00%00%00_v%B3%ADi%C4%2B%A9%0D%7Biv%00%00%09RIDATx%9C%ED%9C%7Dl%1Bg%1D%C7%7F%8E%ED8%CE%F9r%99x%1B*k3%95n%7Ft%0D%A1%A1%A4UI%14Q%10%8C%0D%16%A6%F1%07bJ%B32%40%1A%D2%9A%B5%EB%3A%A8%D6%1A1i%7FtL%E9%10%FFP%91%1A%A11%ED%0F2%B7i%95i%DE%1C%0B%26U%02%AD%98l%EAx%99%8A%9Bvi%DAd%97g%0C%8DVE9%9E%B7%7B%B3%EF.%CFs%F6y%DA%C8%CF9%FB%9E%97%BB%CF%3Do%DF%E7wO%7C%06%A8%B6%0E%C7%FEO%BF%C0%3E%2B5%B9%EA4'%A4%D8%D3%18%88%5Em%B3%8E%C4%EE%9CO%269%0B%BC%80%D6%A5%7C%9DE%10%B0%89%BD%D1CR%FF%8AG%0Fi%D1%9BP%12(%9Ch%02%04%3A%1A%04%09%3CM%B1!%90'%E0p%D0y%8A%8D%60(w%C0%9B%D7%03%D2%CF%EC%2F%D5%0FI%E2b%7C%2B%20%3D%B1%3CR%3F%24%8E%B7%23%F5%9FfeHC%EA%3D%C8%12%B8%BA~%135%24%DD%03%E5%AFF%0DQ7%C0rO%E8%A3%DBG%C5%F2%BD%0Ec%A1%19%B0%7B%BBX%BEc0%18%9A%A1%5C%FF%7DI%24_r%00%A4j%EB~%A7%3C%A4%86~%FB5%91%83~%B2S%0A2%F3%C0%0F%1D%A1D%EE%D5%1D%02%07)%0B%EB%E1%AA%04%E4qx%C5%11Jf%D5%B7%04%0E%8A%0D-%C0%F4%9D%E2%90%EDp%0EZ%07%CDP%BA%A7mA%E0%A0%F1%3Fu%822%F0ia%C8%1Dp(%F3%99%9C%19%CA%CC%1D%12%E9%C3%3B%D2r%83%E4%E7Ss%CFo%B4B%F1%E1%1F%8B%1Ct)5%24%C3P%EF%D37%5C%B3%83%FB%9E%12%99%D2%94%2B)%C11%CB%2Cq%B1w%5B%D9%0E%F6%AC%13%19%C8%CA%A2%24d%D1%19j%BFsN%A4%1E%14%24%07%99%D0%9D%C3%24%F9%E8%8D%5D%02%07%A9y%0C)%BC%2C%CAP%8D%D3%CB%B7%DB%CD%10%7Bv%7BE%E8%B8%D4w%40_%1A%14%84%A4%16%E0%AFw%CD%DEk%06%3B%A6%FAE%86%09%40%9B%0E%1BAPK!F%DAy*k%06%8BS%5D%97%C4%0E%9C%04%ED%85M%82%90Iw%B08U%E9%15%3C%12%E2%FF.%AF%9C%89%DA%14%C0%1F%0F8%20%85%C5%DD%A2%90%E7%07Es%9E%84_%9F%DF%60%07%CF%E4%173%A2%87%BE%2B%DC%8B%13%BB%B6%E6%1DU%D6%D2%BF%BE%E4%97%F5%25%D5%99t%02%DE%10%86%A8%FB%B6%FCj%AF3b%E6%B2O%CEV%FD%9B%D9%87%0Ffy%E8%95K%10%CF%89B%C4%ED%E0%93kwe%E3%5C%0F%D2%E7%F3pN%B4%DD%25l%1E%BAg!1%C2%02%1D%FD%00%BFh%3C%03%DEV%DE%99-'x%3B%A4%AE%00%049%F5am%B1u%EF%DA%B1%E9%2C%0F%3D%9E%86%91%08%20%0B%DAk%5B%F4Y%AB%1D%C6%23%40%00%7C%F9%A1%13%07%E6%BB%CCP%E6%3F%91%40%5E%D7%F5%BE%CB%D6%B8Mv%06%DF3%86%B4%17t%5D_%3A%96%E5!%AD%0F%A4fyA%D37%8D%8F%8E%FFm%9E7J%FB%8E%DA%B5%99J%FD%90K%AFI%2C%E0%84%86t%E0%B9%1D%94R%24'7%EDZ%C7%CAy%EA%B7%F7%05%12E%C3C%BC%09%0D%BFj%AB%B6j%0D4%03Id%C6y5y%84%06%12%0C%24%93%B9%E9%10%8DT%17%02%03%0C%03%13I%5D%E0%18%12%89%0C%92%8Ew4%BE%917D3%19%B2%10zq%F8%94%1A%D28%84%9D%1C%0C%8D7%80%C1_%F4ZH6%E9%E2%D8%10%00%C4%20%C8%8C%E7%10D%03l%8Ff%0C%09%D1%B4*%08%AE%3B%D6%00%B8%9A%0C%C3%A0%9B%05%09Y%5D%1A%3D%BD%0D%D1%CC%92%D8E%05%1B%02%B2e%E1%10%DC%9E%B4U%C85%1A%24%D6%B0!%3C%CE%0D%91%C2%F0%1AF%B4%86p%BB%02%EF%5Df%9B%D0%9Ee%D0%8D%D4%1D%85%90%FD0%7DY%F6%98%10%C3%1E%B4p%83L%C0J%F6%AElw%11%B7f%FC%1B%EB%FD5%EFF%8D%AC%D5%82%20!%D4%25Z%88F%86%BA%C1%86%B2%C6D_%A3C%90%C9%B2)%F9d%18%D2%D1jP9%23%8A%AF%89O%A9%9A%25!H%B3%F4%98%08%3BW%19%A6%F1Ts%90%C6%B5%07%D84%20U%12%AE%E5%F4hS%CB5%06A%A6%B6%819%178%B4KfJ5%5C%10*%FAD%D8%11BL%E5%5D%10%83H%3F%92%87%A0*%88y%F1%A4%FAL%95w%96%C2%9A%D0%24%20%06%B2%9B%00%98%E8%5B%CD%C0%E7%5C%ABMX%B3%85%80h%5C%CF%11%BFLD%3D%056%BF%D0%1D%C4.%C5%EC%5Df_%94r%D8%C2%88%B6%B4E'%C0%B6E7%93%ACZc%8Du%5B%AA%87d%DC%D0%DE%1B%19%04%8F%15%EE%86%D7%D7%3FL%99%A7%E2M%AFY%A3%0A%C5%05%07%19a%9C%DF*%E3%9Aj%EB%06%D1s%AEW4%1E5%10%E2%D6r%13B%D5%98%EExs%F4%0Bb%14%03%F9%40%0C%26%C7%B8%26%03%D4Pt%BDK%F3%830q%C4%82%D8%18%88%E6~%01%9FGp%83%B0%3B%3D%FF%DE%25%061e%DE%D9%BB%D8%9D%22%A2%FD%8BBxl%1D%25%E1%C5%09%25%FA%A2%0D_%17D%CE%9A%02%F9%F0Xuu!%9F%FDp%0A%A3yA%D0%07%15%C2%E4%9Dm%40%BD-%B2P%C3g*%EEq%D9%DE%BF%E1%9C%14%C4%98%1Au%0F%C1!%F4%60.%D4P%7F%D1%99%60y%9An%87R%0C%E2%12G%C7B%0D_%C1%B1%12%98%B3_%E5%E0%87%80%B0%5B%1E%06%A1%F3%A3%E5%CB%23%B6%8Ac%03%88%C7%1A%16%82%1C%25%01%2B%91O%C6U%A5%90%818d%9EM%81%F6%8D%17XUop%1F%DF%D9%1E%C2%10%C3p%F6.v%1C%5D%A8%01%E6N%B0%DE%85%98%F7o%B8z%97puy%94%ACA%99%02L%C8%8B%AB%13%22%D6%F3%FF%7F'%05%E9%95%D1P%90%95%D3%EB%BF%17k%0A%C4%1C%8B%88%DF%C2k%C4%8F%A7%1B%5B%BC1%EF%B1%EB2%8D%2B%3DX%8B%CE%86%F5%0Av%1E%E5%20%96%04%3A%97s%EC%AD%B1%10%B3%BA%22%858%A7%26'%A4~%B3%17%CA%18%C4p%BD%04%20g%F5%AF%0B%40%2C%97%9D%2F%D6%BBz%17h%2B%F5%AE%BDpJ%A40Uf%FF'C%C8%AEC%98%C7J%24!%15h%ED%8C%1Cr%13%B4W%E4!%92%F6%BDr%BC'r%C8%99O%0C%0FE%0Ei%BF%B0%24%F2%DD%EB%FALYX%FC%C6H%E4%90%8BC%13b_%5D%0Dk*%FE%5B%CA%17%A3%AD%AF%C4%85%3C%5C%80%89%EEH%FF%A9%14%FF%E5%BB%E5%05%18%9E%0C1%1C%C5-14%BD%06%D4ee%3EJH%1A)7%40%EB%5B%B03J%88%BA%003%A3%E3%A3P%1C%8B%12%F2N%EF%E6%F7.%03%B4t%F1%88(%BEzu%9F%CCC%93am%DDp%B9%3DGv%A2%AC%AEO6%E3%EBpG%9A%019S%FD%80Y%14%0D%1F%FBn%13%1A%3E%CC%F4.m%99%2BM%80%C0%96f%40%8A%A5%26%40%E2%D1%3B%11%003%A2%0Fi%D4c%0F5%81%01%DB%9A%01%F9%F0%7Fcd%D5%3E%80%F6%CC%A9%B1%18%D0_%7B%88n%DESo%82%DBN%12H%E1eYH%06r%829%D3%230%F5m%FCyq%FD%E6%A7%24!%007%0B%8E%CEd%0E%E2X%F6T%3C%1F%3D(%0D%99%F8%AFX%3E%7C%5B%FEg%7C%3D%A9%0A%C09I%D5%98%06%5DP%95%139%20%B5%15%C7%90%8EQ9%C8fxR0gzP!%EEA%82%40%B2r%90%BE%C0TW%B5%7Cq%80%04%DB%B0%E7%D9%91%93%83%7C%3F(Quy6%CA%F1%DE%DE%CF%1F(%DC%06p%7C%AE%2C%059%1E%94X%F5Tp%9C%BE%17%BF%B2%E7%ED%3F%C8%3C%5BM%0E%1C%018%FD%A8%F7%95%25%DD%0D%DCB%DF%D5%FD%3F%C2%D7%B6%D1%2B%BF%9F%A9%F0%B1%F2%D9%8F%3F%5C%EB%F1%3D%87%B7%98%BB%AB%C6%1D%FB%87e%20%00g%AF%DER%F6x%B6%ED%9F%25x%E3%A0%BB%80%F1%9AL%C2%A6%90%DF%A3%F8TMtr%0C%EE%D9%D5%D5(%C8%F4Q%F2%94q-%BBS%E9T%DD%0FE%86%5E%DC%CC%C0%1A%FCn%3F%F3n%DB%B6%B6Q%F8%9C%2B%26%B4%C2%B7%02i%F3X%B66e%FA%F4(%B8%1E%F6%0C_%5D1z%EF%E8%E5%1F%A7o%1D%82%FB%DD%90%B0%DE%D44%7D%FF%92W%D2%D3%F3%2F%5EsE%C4%7F%F7%C4c%A1%20%CF%90%B7%CC%7C%C1%23IY%BB4%E2%8AH%AD%EB%DB%E7u%8E%A9%FD%3F%0B%86%3CBO%A7%EB%9E5%D1%EF%0Ef%0Aw%7B%3E%F5%DAW%B8'%B0%22'u%D8%EA%2Fv%0FTG%A4%0Fz%9D%AD%07%5E%AA%04A%D6%FF%03%F6%F8OZ%8FTG%24%1E%2Cyd%EB%F7%1Ag%0E%23%BF%0F%B0%D57%F5%E9%EA%88%9D%7B%BC%B2%1D%3F%BC3%87%3FR~7%8Ad)%F2%07%BE%90bUM%26%E7o%F7%CA%96%B9%FB%3C%F98r%D2%A7e%F4%1C%A8%FE%0F%FE%9E%CB%B9%C3%C3%A3%DE%F7%E73K%25%DC%7B%E6%8E%FA%2Ci%DF2%00%9F%F5%BF%87%8C%8D%B4%3B%2F%EE%E4u%C5%F34jw%1F%1E%D1%A9%8Ft%FB%2C%D1%1E*%C3%A4%7F%EFJl%DA%B0%DBNM%CD%96%DA%3C%2Fh%E6%BD%03%B8%84'%F2%99%81%C7%DE%F4J%FF%CB%10(%83%BE%90%D4%F9%7CK%D6%0AM%AC%81%96%8F%96js%FD%DD8z%F5%C6%C2%A99%DC%86K%9E%3F%13%82%FB%5E%CD%02%8E%FD%B5)%E52hlYl%A0%26%97%94%E1%CEQuu%B6%A2%AB%CBc%C7XuU%7CK%CB%EC%D9%15%D2k%CC9ml%E7%8FQ%AF%04Y%C1%FE%07o%F8A%AA-%A1%E6%92%00%00%00%19fcTl%00%00%00%00%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%94'%03%1A%00%00%00%07tIME%07%D7%03%10%13'06*4%98%00%00%09%FAfdAt%00%00%00%01x%9C%ED%9C%7Fl%13%E7%19%C7%1F%9C%B3%7D%B1%CF%17%CARu%A0%8C%98%B6%ACe%A2%FC%A82Z%AD%40L%E3B%60%2Cf%1B%9DhG%87)%EA4%8D%AC%09P%B6I%9D%C6%A5%FCJiJ%A2%89J%FC%01%E5%A0%D34ihN%A7%89U%FBc9%13%83%C2f%E2%AC%B4%1A%D3%D8r%10RX%D7.8%09%E4%97%C3%ED%CE%B1%E3_w%E7%E7%3D%E7%22M%CAW%89%7D%EF%FB%3E%EF%FBy%7D%AF%EF%7D%DF%7B%EE%7D%0D%90%AD%92%B4%E3c%DF%98x%BF%93cU%A0%D2!%11%CF%D4%40%A4l%0D%A4%25V%B6j%18%91I%B7%02%F6%A8P%E0G%40%A8%ED%80%F9%10%FA%0B%94%F9%90%22i%1A%3E%09%84%DB%A7%01%02%25S%04%D1-%262%25%90%E3pB%AF%9C%C8T0%98%AD%F0y%99NzwcW%E1%10%9B%00%F0%7D%9Dtky%7D%E1%10J%FE%3FSx1%F9!Sr%DE%F5d%15%00~o6%C4%E1%01%F1%05%B3!%EC%0A(%F7%18%CE%ED%E4pv%BD%C0%1Bf%C0%AE%8D8%BB%D3%B0%C90%83)%BB%82%BA%8Al%3E%F0%90%94%BBWH%0B%D0%FE%3F%7C%17%93%E9%17%DB%89%20%3D%AF%FF%2C-dm%FD%D7fD%26%26V%01s%09%20%EF%C0%C7i!%5B%0B%7B%0F%91%C9%E2%8FA%F0%25%3Cd%23%F4%81%7D%B2%11%1D%9E%E2%18%22S%E0%9A%1B%18%DFW%D1%90%AD%D0%E0Z%DE%9A%0C%B9%86%1A8D%A6%CD%F2%C5H%A2_v%0C%BD%BFr2D%D5%BD%85%C94L%FBI%18%ECni%C5%BCT%F0%D0)%01%91%89%19%A39%12%88%F5%AEw%83%98%0Az%16%F0%18%C88!d%3C%3D%E4%7Ci%C8%8F%81%CC%26%83%B4I%E9%97%89%ED%CDE%CB%10%99XA%86%84%3B%B1%0C%F6%81%AB%E5%2F%0A%93A%CB%07%1Bq%F3p%BA%16%A4(%B6%F7%A2c%F0%EFo%0E%FC(%19%2C%E9%A8%C1%5C%26%00%C5%12%AC%04d_%0A%16%5E~%E9hI%06%23%1D%CB%86q%19C0%EB%D2j%24%24%94%19%8Ct%DC%F1%22s%02%F5%A0%88%B4%EC%00%F8GS%1A%24%3C%BE%0B%0By%1F%3D%A0%5C%80%DF%F5%AFH%05%BB%85q%176k)%87%B5%B4%EEY%2F%A4%9D%B2%A2%9A%0A%CD1%EB2%9B%9E%D4%0E%B7%D1%10%F6%D0%DA%DF%1EH%8F%E8%19%D5%B0%B4K%2F%B7%1ClN~E%3E%1E%06%AAU%C3RE%CC%B6%91%8Cp%1D%AFn%D7%7Cr%E9%9E%16%CA%3F%11p%F4%0B%D0'%E2!%CA%A5%92%AEnN%D5%8A%1D%81%CA%01%B0%26f%B8%255%00%BF%22%60%00%9Dy%8D%2FW%3F%0B%CC%7Df%CE%80hM%D4%80%1E%03%D0%9B%D4%E7%C86%3B%3D%E4%A8%10%D4!%E3%F6%03K%F9%60%B2M%DEq%00%D1%B4%3D%E8I%0FY%02%EA%1066%EB%E6Zi%40L%86%03%24%08%B0%0FnI%2F%B6M%EBF%EC%3Bo%B47%8DLv%D1%AE%2F%12A%EA%3C%19%C1%DDZ7%04%BD%92T%3D%3Ay%DD%DA%DC%FA%F7%8C%99r%0C%8B%19a%AF%16%E4%92%24I%D1%D3%C96%99U%0D~%3C%C4%16%F5fT%E9%91%C8QU%BBbiu%80%0B%7C%3A%92%A8%92ss%AEoF%AD%FF%D6%F2%CCDU!%F4%F0%CD%7C%0E%9C%92%DC(%0DWT8%D4%A7%1A%EF%1C%96%CB%60%80%D1%99%8E%E3!%EA%B6%B2%E6i%C4O)D3%DETHA%0D%3F%A8%01%A1%08%3Cw3%9A%D1%8Cf4%A3%2C9%1B%09%26%C8%86!%DER%D1%7C%0A%04%B9i%80%D8%3D%D3%00%A1%DD%26%03%AE%5DZ%07%1F%1AwM%A2%C4%94zO%09%DB%04s!%96z%B0%BC%FA%A0%B9%0C%F9%D6%19l%D5%F3a%0A%9Ei%E8H%BE%E9%B0%97%B7%C2%9A%96%FC%A6%C6UR%0F%1F%0E%C9S-%A4%E3%C4%98%1C%83%87%97%0B%00%C3%CBE3)%17%7C%FDr%83%BC%10!%FF%16%B3%AF-F%DB%B6y%FD%F2%AD%B7%7D%24%AFa%B6%ECo%7F%0Bm%DB%F07%B9%FC%EB%FF%5Dpm3Y%E3%3B%7F%0D%01%1Ek%FC44%D7%82%7DYd%CD%A0%88'%1C%F0z%2Bc%40qHs%D7%7D%F9%AE%AF%C2%5B%E6(%F7%E3%190%B6M%AA%1D%03%3B%16R%2C%B7%F8%ED%A5%D1!%F8%8C%E4%82%F4%F5%BF%0D%83%C2u%01i%5E4%D1%12%01%A2%06q%CE%A9%07%B8W%8Ey%0C%11W%F7Dm%AC8_iB%96%A62%0E%C6%F0%F6%FB%26%DE%98%BB%24%90%12%08%B8a%1D%DE%FE%91%C4%7B%A5H%00)%E2%B7%FB%A1%01m%CE%0C%25%0E%EAH%A6%2C%CC%C2G%1F%96%AA%FCXs%F6d%E2%A0%99%23%80%C0%8D%C0%CE%F6W%7D%D5%24Y%14%B5%11A%E0e%A8%13%5CaRH%84%0C%F25%03%9D%1D)%84%99%7FZ0%1DB%BD%B5%CA%00C%07%C2%AE%C9%7DRq*%C4%1B%81%04j%B5R%EC%AD%B6%9C%B8%3A%A9T0%00i%93%BE%A4%91R%222%9Ff%C7%FD%FD%DD%E3%22%BE%EC%12%15G%0D%97i%12%01%B8%19%3F%A0Tl%F5%1C%3B)H%F2%80I%C5e%B9%A2%FA%00%0E%02%B3%CC%5C%7F%17%C5%7DR%E6%AC%AC7%17%C2H%2B%FE%D9%5C%ABS%D8T%40%AC%D1%CA%E8%CF%F5%0A%CB%0F%C9%DF%F0E%AB%98%CB%F1%03%C3%0D%8FP7%99%F7%DD%98%827%F13E%C3%0AA%F3%D7M%87%5C%01W%83%A9w%16%8A%A6aQ%A1%3C%C9%22%98%FB%18S%F8%CF%C30%CA%9B%CB%E8%ADx6%BA%F2%CENS%19%EC3%E0%DA10%FB%03S!%B4%3C%1B%BF%E1%F3%FF%D4D%82%DCc%08%F2%DBa%C1%DC%8BQY%E3I%BB%8B%3D%E6Bx%00%DB%9Dv%D1%5C%88%3C%F1%09%C5%B0%2B%1E%8CB%22%5B%F6%CF%8F%95%A2V%8F%19%87%B0%8DG%1Cf%3F%DCQ%C6%3C%B2u%3B3%90%19%C8%0C%E4%FF%19%12%EE4%1F%D2%5BQu%1C%01%B9%25%7D%AF%00%C83%00%BB%10%90%03p%B1%00%882%C6%23%20e%86g%80%891%9EB%40%EE%80%DDm%0C%02%133T%0A1%0F%5E%02N%E3%BB%95(%1E7%15%FE%B1Hy%8CC%9E%C0m%18%E9~%BC%CEo%1C%D2%BCe%FF%00%02%E2%1C%8C%A2%9D%9E%99%A2G%80%EAl%3C%829%5DLl%7C%9B%B1%1D%1F%3B%7B'%1A%1E%03%B9%EBo%23r%C7%26%E5%E4%E8%16%14%84%95%FF%A2B%C4%D0%F9%B2%8A%EC%12%14%C4%3A(%C0%20%B4U%E6%B3S%13%05%CC%7C%14%84%FAM%A9%18%83%BA%90%DB%00%C4%D6U%C4%E1%3E%89%3F%B8%18%D8r%C6%88S%92%AD%BC%87kx%C7l%E6a%B0%DF%83%ED%06%20%E0%9C%8F%83%B01%E8%E1%02%1CDx%03%90%9EE%13%90%1F46%EAC%E6x%AB%1E%1A%05(J.SD-%BDJ%E8%F4%93%22%0A%B2%3B%AB%C8%5C%0B%1D7%D2%B1%E7%9B%02%F5%F9O%17%B3%A0Nt%C6%1D%FD%BC%96%89%0E%24%D4.Uq%E1%CE%7C%90%E0W%0C9%D5%12%BA%02%9F%DC%DE%5BQu%2C%0Fd%EB%99B%20%96.%D7%C21%80%7Dy%20%7Cw%F6RO%92%86w%3E%06%ED%CA%18%9F%EF%C1%8A%E5%B5%7C%0D%AF%A7%F5%9B(%0E1%C6%170%BC%CB%3AW%AB%ACg%CE%3B%C6%BB%0A%F2%22Y%8E%2B%B3%C7%FC%E3%C9%DAB%20t5%8D%1A%E3%23%85%ACKp%C5h%1Ff%8CO.w7%24%FB%E3%F4Q%CC%18%DFS%88%CB%A2%3D%84k%937%0A%60%B8V%1D%C2A6%14%00%B1%09%1B%14%88%25o%B3%E6%AD%85%8E%FA%3AG%2Fr%08w%7FA%FAH%EE%22%FCfC%9C%7C%FC)%87%B9%10%BAe%1A%20v%C1l%08s%19%A8.%B3!%E7.%F2%160%19%C2.%81U%17%14H%B8%93%14%E2%02%EC%F2%01G%3Dt%FCP~%BF%5BQu%8A%10%02%F0%A4%80%B3%B3%B5%02%25w%7B%EC%D8%E4J%0D%02%B5i%3D%E0%CD%92%DCa%FDU%98%D8%15%D4%87%ACWRA%90%90%BD%B2%B5%15%94%B3E)%0D%CF%91A%AA%E0d~%A3%B8%1C%9B%18%B7%C2R%20%84%CF%B3%F4Wg%08%E9%81o%FB%94%601%2FC%08%97%C7%FED%2F%91u%A7%87%98%F3%5E%EF%BA%A6%F0*%80%F3C%22%11%E4%BC%5Eb%D6%AE%60*%FE%1A%D9%B2%FF%FEG%24%7B%AB%95%8C%F2%2C%FD%EA%9B%EA5%B3q%19%C1%A2%F8%2B%DBxD%AE%DBJ%15sM%B1%F0e%F1%D6c%07%DD9%09%7F%94%FF-BV%85R%3AA%02%01%B85%F7)Qeo%DB%F5.%B8%DD%2CjB%08%C5(%BFG%F1DN%B4%8D%87W%F6d%EE%EB-%00%12%3C%AB%EC2%CEe%BB%197%9B%B9)r%96Q%84%0B%94%E7l%A9%3D%EF)m(%E6%E0%B9%8C%18%C3%3D%BC%1D%DC%F2%ABE%E5%12%0E%5E%E5%20c%B3%A7%F1%D3e%89%DF%3B%AA%CD%8F%1DO%FBao%26D0%08%09%C6_%9FWKzo%E4%2F%F32%22%A8%3F%1DW%DF%2B%97O%E7%94%17%D7%88%DA%DA%2Ffi4%D3%2BF%2F%A8%3E%A4VFG%E3%BB%FA%90%C3%F1%E2%E2%8E%D8%5C%D5d%06%5D%E1%1D%AA%BB%5E%AB%C3%AF%A8fO*%24%C1z%B5%7C%13z%3D%3B%C2%D1%ACV%9A%07.%EBzg%2B%3E%83%FD%DA%83%D6%E1%EC%08%EB%3E%B5%A9v%8D%DAu%96%26%E5%F7%01%D6k%A6%BE%97%1D%B1%7D%BF%9A%D9%F9%13%DB%95%01%86%D6%BAQT%5C%91%DA%8F%D6%23bf%D86%F2%A2%9A%99kG%BF%F2v%E6%82%A0%5E%8C%D4%0A%AC%F6%C6%DF%BE%AC%11%B0%8Es%AB%DA%F5D%BB%945%9Ag%3D%EA%C5%3C%E5%83g%FD%9A%10K%BD3%BDr%17%CA%18%D5b%D8%CAj%5E%3E%5B%8FVj%B8h%1BD%08%89%9A%10%EB%EA%15%BBR%A9%F4%40W%B1j%85z%1Ejr%CB%B7%93%82%CBw%F4s%B5%F4%1B~%60%B4%17%9D%D3%FDBQ%AAWk%5B%0CE%0BU%BE%5D%FFy%E0%EC%DCE%E1%8BCr%1BFU%7F%26D%FE%EE%E9%2C%9BbFa%16%1F%3F%F2i%2C%B1BJ%FErd%D5.%D5%A3%B3%E5%FCi1~%94%EFQ%08%F1%0A%93%F4accb!W%81%BF%0E%F7%3FB%09%85%E9%1Cj%D9V%00%00%00%19fcTl%00%00%00%02%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%BAw%CA%9A%00%00%0A%13fdAt%00%00%00%03x%9C%ED%9Cml%14%C7%19%C7%1F%EE%D6%F7%BA%BBg%A5%14%C2K%B0!%B4%B4%89%83%1D%C5%16%B4%25p%0EN!%C1%C1(%15%C1m%1A%7C%A5m%40%0D%89%1D%88H%3E%B4b%C1%07v%89%5B%13%8A%E0K%80%B3jW%FD%80bS%C0%FD%12%D5k%03%09%A9%AE%9C%23%DA%A6%A9%D2%B0%60%14%91%C8*%18%1B%02%B6%F1v%F6%DE%7C%B7w%B3%FB%EC%9E%D7%AD*%FF%A5%BB%9D%9Byv%7F%BB%3B%3B%2F%CF%EC%CC%01%A8%E5K%86%5CB%22t%23%C3*G%A5%40%02%13%05%91%D5%1AL%26y%FDT%23c%D2%E2sc9%5E%00J%0FM%06%248%19%90%CB%22%17%7C%DAj%88%7Bqg%F8%98%D5%10x%F2%19%B8.Y%0D%E9%0B%8A%1B%ACf%00%F0%8B%16%5B%0F%81Z%D1z%06%7B%D3z%06%7CX%3BQG%E2%7F%22%D0RJ%7D%94%14%C3r%15%8FPR%F2%96G%26%0A%D2%FD%FE%5DJJm%E5)%AD%1D%CF%8Bx%C8%1F%A1%86b%7D%B0%E0%EB%1A%FBy%1E%5D%8B%874%C2%95u%94%24%F6%9B%1A%FB%F9%FA%9F3%02q%E6S%92%F8%7B%AA%88%FE%0BG%92%E1%AB%60%13%D1%90Np%15R%92%3C%25%AA%88%0D%DB%9B%85D%F8lJ%03%AD%AB%1E%F1%C4~J%12%A3N%A8%04G%B2%C1%BF%08N%DAm%CE%D4N%99z%E7%BB%25UD%1B%B0I%88%EDxw%08%CBp%0C%88%D4%B4%D5%19%C6K%EB%13g%CF5L_%85e%40%F3p%1D-%C9%3D%AA%8A%60W%0C%7C_%F2T%C6x%E5%F8%9B%C5%CD%CC%F7%D3%D2%9C%EA%8Bl%3F%B0)%E4)%0ED%C3%D3n%0Bh%88%7B%8B%9F%5E%A6%3EN%87%B0%A3%D7%8F%2F%5Cp4%F6%23%B2%10%0FaN%D5%ED%C3%DA%BA%96w%F5%F6'%B8%ED%15%06%20g%EB%DE%C3%DA%B2%C5%0B%C6%7Flz%CD%00%A4%CD%3FM%C2Sf%25%C3%8F%06%03h%88%AB%2C%3F%2F%84%B6~*%19%E2%E5%06%3Fz7%A8%1A%C9%A8%3C%E8%AAL%86X%B9%9AV%E3)%A9K%1B%D2%BA%20%9F%17%ACy%00%0D!%0Fb%7F%2C%E4%1E%A8T%D7%9E)%3A%D3%0Bei%11%C7B%7B%D1%90J%F8%2C%EE%090O.%1E%A6%DB%FD%0E%60wZ%84k%EEU4d%87%EB%AB%BB%E2%90g%EE%D0%CF%ED%DC%80%04%DB%D3%A3%9E%08%A1!%EE%07%3F%8D7%96%CE%B1M%7F%A1Z%C9%F3E%A7%AAJ%DA6%D4%8B%858%03%8Ex%06%F2G%18%EA%ED%3A%F6m%9B%3C%24%A6%C7%ED93%17%0B%E1%FD%5D%1D%890'%0B%D9%8D%B8%19%A0%BE%0E%C5%D9%D9%84%85%C0%E1%94%EA%FDG%94%A7%D2%B1%18%BCC%EA%C8%0Dp%85rN%99%B2%0D%04%92%E1%AE%17)6%A4%ED(8%9E%1E%C7%CF%06%8FF%B9J%97%E7%FE_%25%F7%7B%EC%20%05%12%20%F5%8F%9C%9E%CF%EEy%00%F8%E2X%94%0C1sfRN%E4fQ%D5%80%AA%AB%DE-%00%FC%0C%0D%19%2F%1C%5D%7B2r7%AE6%F9%8D%DA4%EF%9D%ED%1C%94%94%BE%17V%E3%BD%E3%9A.%3F%CD%E8%87'%E4gS%7F%17%CB%1B%C1%08%C4%96%7C%84%CB%BBB4%23%AF%BC%7BSG%CAo%B9I%F9%DE%FB%5BjoB%A5%BC%ADR%3C4%BDV%A2%19%D9n%AE%9A%99%DA%CD%A8%8A%9E%CE%EE%E7%91%0Cp%25%8A%20%2F%D3%FBR%5C%D5%CC%3B)%05%3Cc%B4%E5N%96%7Dh%233%19%25..Fo%00'%9BoE%1B%8A%A2%F9a%BA%FE%D9%14D%2B%FE%BF%93%F1S%9A%D2%94%A64%A5)%E5%AA%9E%8Awr%D9%9Do%C2X5%3F1(%E6%00%E9%3B%89%F1%D8%FA%E1%04%BE%7B%9F%A9%8D%9C%88%B2%F3%DEV%BE%3D!3%0C%B2%D7K8%CB*%E5%CBv%DB%0C%24O%84%3D8%CBf%91%7C%F9%0AD%13%10F%C4%BDj%F3%1E%8D%08dc%0B%FAM%40%1C%FBa3%C2%8C%DD%5E%DE%A3%F4%F8%99%26%9A%0F%A5%A1%FE%F3%0Fx%E7!%ECZ%BF%F8%F8%2B~P%DE%FAj%8D%D1g%D7%DF%0Bd%0D_%22EkH%C6%2B%10%B6%B0E2%C8p%DD%16%23%EB%2F%60%2C_!%19%AF%40%A0%E8r%C8%20%E4-%11J%BBQ%96%D7D%A8%89%BAu%87%9C%85%06!_%03%CF(%D3%A1oG%BC%B0%C7V%16oU%02%7D%DCp%D8%18%E4%1B%60%F7%BBq%A3%D1l%B8%BFf%E6%F1p%B8%FD%E5bT%26%8E%AB6t)%C4j%0C%E5%A5%C9%FB%CE%01%D2%D9%9F~h%FA%CB%86%18%E0%1Ai%97%E0~%AC%B1%00%5C%98%DC*%03%2Fyb%FA%D7%1E%F5%88%A0%06%24~_%0D%3F%5Ep0%0C%97E%24%C4%1F%DB%BA%D1%E3F%09%D9%E5%3A%2F%EA%F1%22%F5u%DC%3F%E4%D1%83y%09%B1%B4%81%BC%2C%A6%89%D9%17o%18%85%40%15%F2%3AHQIT%8D%7F5%0C%89%88h%D3%C4%10%A9%DD0%E4z%00m%9Axv%1D%A2QH%3B~%9E%CB%B1x%8F%C3m%18%B2%9E%F6%9E%3AS%97%84%D8%96%0D%19dp%23%F8%F9%14v%7F%1C%22%18%840%25%BFA%DB%26*y%EEM%D1%18%E4-%F1%92%84%B5u%C5K%23%2B%DF4Fi%BEyr%8B%80%B4%F5e%19%A8%A1%ED%CBd%B1%D5%1A%D8%19%87d%89C%0EEqB%F6%F8%09%85%E8%C6%FFoB%3E%C9%09%82%CBxvh%E3%2F~y%D6l%C6%23E%1A%C1%D2%83%E2%04%1D%8C%A6%C3%00%AB%B5%A6%82L%88%D6%00_%80%1D%DE7%A8q%9F%B0%12v%15i%18%E6%A2E%C9P%B0%FCK%C9%22%C8%C5%C7%13!%FB%BB%E8w%93%86%F5j(%1C%F3%0F%AA-C%90%E2q_%E9Je%C2%8C%13%FFv%DD%B8%F8%EF%00%EC%00C%3D%13%E3Rz%B1W%08%60%A9%85%8C%E8%3C(%D2'%7F%BF%D0J%88%2F%06%A9Aw%16MAB%A4G%16%80z%AB%0Ab%0CB%0AJ%E4.T%A3%A7%BA%98%82D%AA%EB%07%E7%FFi%EE%DF%2C%85%F0%8D%FB%98%0F%A6%E7%7F%D7R%08(%035%C1%86%5C%86%C5%90%10h%11%AD%87x%F0%5Dk%B3%10%1F%1C%0BM%02%A4%FC%05%EB!V%BF%3A%F4%01%A2W5%05%89%8A%25%99!N%C2%950b%F8%82%F5%90%D3%A5%2B%AD%5D%99%C0%EF%07f%0E%C0N%84)%5B%F1s%93%903%3F%00%86%B4%F1%D7E%7DS%DB%DB%A7i%D3%83u%B4%CC!2%02%C9xA%DF%D4%0Ep%D4%14%C3%13%80%E5y%0A%04q%8E%8C2%B5%D8%8CH%07%A2RYV%A5t%26%F4d3%FB%A4%BB%05X%ECz%24u%CA%92%C6%09%05%E0%B2)%08%B7%CE%1DpUU%D7cjGn%A8%A1L%DF*%9B%DA%07E%D7%AF%1B%F7a%EE%03%FB%D4%AEW%CDu%FB%D9%92%E8R7%14%24%FF%E4%B5%80)%88c%1D%0E%C2%92%CF%EC%22%97%89w0D%BE%19%BD(%88o%19%40M%C8%85%9F%F7%98%AA%C8%BE%19%9D%18%88%A3%ED%15%E8%07%FB%7B%82%19%C8%89u_%EC%F5%23%20%5C%E19%11%A0%95%C3%BE%1FHS%F0%E1%5E%16%03%81%87%A0%09%F8G%E053%90%86%ABC%2BQ%90Vpu8%04%E8%0B%99%804%C2'%1F%A0%20%B6%8A%8A%BB%07%C9S%96%98a%9D1%F8%92m%EAU%12%02%A8%DB%E5%5D%A17%F5J%E3%10-%15GQ%90%96.%3D%0B%8DCpKO%B1~D%1B%AF_%F1h%1987%B3e%886%BE)'%08lfG%10m%7C%C6%95%18%C9x%D2%00%2B%AB%87t%DB%F8%CE%9C%E6%DC9%C6%98%1B%B1%D1%60M3%BBd%EC%B0%E9%3A%EC%CF%BB%91e5%92Z%1E%FC%12%9BLyWu%B8oD%DD9%1Dm%C9%012%ED%7Be%9F%DE%C3%0C%DE8rXc%1B%CDO%E2%C7%EBB%E0u%F3%10Ec%C4%8F%D7%87%20g%7D%D0%84%CA%130%B0%3C%D0%3C%24%C7%B5%EE8H%8E%FA%3F%81%FC%3B%0A%B1Y7%22%AC%E8%CD(%C4b%9F%F1%5B%93%00%E1G'%01%E2%19%B3%1A%D2%2FA%5E%80%40%AC%F4%E3%F9%D5%0D%81K%E4%B1%BAe%A5%1F%EF%0Ap%A3%7B%09%0B%D3%C6%9B%16%23%40%E7%9C%D8%9Ba%8C%1Fo%1A%D2UH67p~%BC9%11'%BE%8A%1C%5Ci%E31~%BCI%AD%DF%A3%BC%A2t%87H%2B%2CZ%06ak%95%01g%FEqe%0D%B6u%90%19%D1M%A4%BA%1E3%7B%CF%A4%5C%3B%25e%C37%D6%5B%F4%0ESQ%DE%B9x~s%86g%19%E1e%FFga%3Ct%40%B2%0C%E2%E3%17%86b!%C6%EC%FDbu%E7%F1%9D%81%CF%0Bb%5D~S%F7%8B%0F%AE%BE%D0%B2b%96%8E%D5ir%26%8D%B1l9%60%02%C2%AC%09W%2F%E3%C7%FF%8B%20%BBRV%D7%B1%26%20%1F%91%82%BC%1F%D8y%E75%AD~j%E2%C8%E3%F2%06%08%84%E4%E5%8Fgk%9Au%97Vl%A5%24%B1%CF5J%DA%0CNY3%A9L%82%FB%87%A8m%F8%FB%BD2%C5%82%11%CF%0A%DA%FB%06%E5%00%F9V%5D%05%1F%7DJ%C3%AA%0E%D6%12%CA%B3%CB%80%23%A4%C9%E0f%0D%2F!%9B%F5%E9%B1%D1%09%A0%7D%AF%2B%CBo%9Db%D2t%99%3F%FB1%CE%C2%87%92%5B%0B%E2%DEV%12%E9%CD%F8%9F%23%5E%A9%04%9F%87V!%15%D2%F6g%8A%2F%D8%DA%F84%D4j%BD%0Dv%15%EFW%C6y%D5S%7DOJJ%EFG%19%E4%88%24%EE%D9g%82C%C8~%0C%F6V%80%1F.%D4%80xeI%81%A8%C7z%1Dk%A3%5D%AC%7C%F0%26%96%DD%B2E%F4%D6jt%98-%D1r%13%F9%5B%B0M%CA%D2a%7BV%84%22%F0%D6As%3C%B3%D9r%11.R%8E%C1%8D%95%E7%F5%EE%3ABIU%0CdY%99%A9%3FM%1D%EF%98%05%AD%E2%D5%DE%EEe%F1%DF-%95%00%B4%D2%EA%2Ci%DE%E1%91_%5C%24%D2%20%EC%BDp%0F%D90%19%15%E4%1F%1E%F6%CA%95m%C9%3F%AE%F9%92%7C%0EQjQ%7B%5D%E4%CE%EE3%FE%8F%EE%7B%A9%2F%FB%A3%E1%C9%07%3B%C9Zf0%23%E5%F4%92%F9%F2-)%F1k%C1%0B%00%ED%94%D1%8E%EB%1D%EE%81%8D%CE%DBp%AD%802%5DZc%DA%14%BB%B61%BEO%15e%8A%15R%D0%23%A8%A8%E3%8F%80%3BY%C0u%9CYR%2B%BF%ABm%A1%96%05%7FA%F7%1F%B0%1AU%A1%96%23%FD%A5%00%00%00%19fcTl%00%00%00%04%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%C8%86%90%1A%00%00%09%E3fdAt%00%00%00%05x%9C%ED%9C%7Fp%14g%19%C7%1F%92%FB%B1w%D9%DDcFPD0A%98%14%0A6%94FE%25%E4%0C%A9M-m%C8%B4NQ%DBr%AD%ADSmf%8E%AA0%C5q%9A%85%80%0D%90%9A%40%DB%992%83f%83%0C%A3%D3%D6%04A%FD%07%CDB%00%83%9E%5CZ%CB%F4%C7%3F%D9%90d%AC%8ECBr%F9E%92%AE%EF%DEBH%B2%EF%BE%EF%BB%BB%B7%94*%DF%3F.w%CF%FB%EC~v%EF%7D%EF%FD%F1%BC%CF%06%60%A6%22%26%0B%40%1F%C6%E6J%5E%40%B4%99%1A%60q%B2'%E2%05%F0%AA%CB%3B%20%EBo%06%E4%01O!%87%14%9Dq%E0%88%A7%10~%A9%0A%F0%2F%E8%F4%14%02%3D%CB%01%9E%C7%B6%B4Lj%DF%A3%B0%19z%3D%86%88%8FK%2Ba%8B%C7%10%10v.%7Da-%40B%C9%E09%FFn6%BD%D0%A6%FF%926d%8E!%2C%92M%B6Jt%1F%89%F6%CC1%20%10%BEb%B2%AD%CF%E0%F9%D3j%83%0Au%A6-%E3%7Do-t4%7B%0E%89B%B6d%1B%F2j%BD%5D%88%CF%04%B9%DF%C2%F7%F8%DDj%FAo%F6%D2%9F%D8%83%3C%02%B3%E4%99%B6%EF%AB9%B9cfW~%E4%9C%E1%FA%0A%F0%F6%20%07%60%9F%3A%D3%D6%94%DAu%E2%5BfWn3%ACL%BFy%14%7C%8A-%C8%C5%C4Z%93M%DC%B1%B8%CCl%05%BF%A4%D7%16j%26%B3%81%BF%C3%16%A4c%9Bj6%0AjR1%5B%031~6%F8c%3A%04~c%87!%AE%C2%9A%F9%5C%0C%84%1F%3D%13%E3%EFlN%F7%08mv%20%D9)%AC%F9%E4*L%AF%C2%17h%85%05E%E8%CD%5B%AAp%AF%1DH%D2%DC%A9%E8%FA%D2K%18c%BCp%F9Ce*z%F3%AE%A6%D9%AA%93%96%09%AC9%B5%C0l%E3%06%3A6%A7%EF%8F%5Bt%E0E%C2)%DB%24%D3%D5%E5a%1D%1B%9E7%DB%92k%9B%FE%3C%9C~S%2C%13%18%C1%2F%1FS%A6%5B%04-%86s%14o%C3%18%2B%D4%E2pz%BA%16%2F%97%08%90cjx%7C%06v%D5%40-%A6%8A%83%2B1G%8F%08%83%81%5C%FDMi%01i%3C%FB%01%C0%BA%E9%96%CE%C3%B5%F1!%D5%E4%D8%A4%98%0F%E6%C7%C3%23Y%F1p%19%C0%3DC%B3%09%90%EF%A0%C3%A7%5B%1A%03%92xx%B3%C9q%10s0%9F%0A%8E%F7%B6%C4Q%93%9F7%3A%8E)%BF%E6%B6%15%B5%A6i%16%F1%D3!3%01).c%8C%C7%DF%9E8%96%1C%FD%24%FA%DE%C6pUfH%D8tY%991%D7%09%E6%F1%B8o%1F8%EC%A5%FA%FA%B6%C5%13%A8w%1E%99%D7h%099%B9%E8%AF%A9%D2%85%D3L%DD%0A%AC%C0%FA%FE%09g%8CD%97h%DFD%D5%91%FF%DD%2C%D9%82%11%BE%7F5%2C%DEmjJ%C5)%C5%F2%B2f(%FB%5E%AD%E1%D9%18%C0%8E%8E%D7%F3%2C%5C%B6%C0%044%9A%9Bk%D7%FC%7BX!~%ED%CA%FBz%EF%DCu%E4C%EC%9D%A2%1B%99%40%FD%B4%CF%5C%03%E2%5DY%AC%10%40s%B1%1D%FA%DF%EE%01%05%EF%C0%8F%F1Q%FF%DCy%E6%82%AE%0Af%08%92q%DB%F1%CFZ%14%EF%E2%FA%5ENV%99%2FA%9Cc%83!%8E%A4%BF%F0%CEQ%2B%07n%7Ca%D3%19%D3%F7%F5%FE%93%C36%209Z%FA%C7%CE%8DX%3A%F4%7F%BB%BC%F6S%D3m%C2%8F%B4%C5%F8%CE%1E%2F%D1%98%EB%8B%96%10AK%A5*Z%94i6~%E8%0D.j%03rU3%FB%D9)%DA%9FH%A5%F4y%C0T%0Da%A6%5Dte%11%EE%9E%D3L%D3%CB9%D0%A8%DA%87%B4%60%3B%23CUkL%A6K%90o%9F%01%E5%8AeQ%8F%86%2B%1B%F8%ADmF%CE%90uY%1Dv%89v%16%17S%A1%400%13%E5kzWKM%E9%BBL%D1%16%5C%B3%B4%8A%CC%E0gkh4%A0%05p%EC%84%A2%AC%82%09%11%C81-%A9%3C%80P%F4%B1%85%7C4%15%7FK%B7tK%B7%F4%7F%A8s%AA%F7%8CP%05%26%BE%90i%1D1V%15%9E%8A%DF%00h%7D%94%C9X2F%BEv%04%09%10%96%DE%99P%2F%40R%AD%8B%91%5C%3E%A89%E8%12%D2%0AP%1D%26L%2C%D1r%23W%D3nw%07yS%11%E7%9F%8C%91%3C84%ED%2C%8F%BAa%B4U%CF)YM%B8%91%D3%A52%87f%3E%C1%81%7Fc69%18%F5%D6mm%C35%BB%15k%87%BAr)%BDpj%CCu%DE6%0E%A9%BE%3C%A2CEv%94%BF%2C%A3%D5%DEA%E7%AD%FC%1FkZ%C8%D1%FBD0%1A%EA'%B6%0B%BA%C4%1DZ%E1s%C4k%E4%A2%FEh%95%EC%8E%02%9F%AB%A9!BB%7D%BD%F5%1Dy%EE%18%02-%18%C0%F75%AAn%3B%04%1E%1F%5E%9Er%15%E3%B7%93%16%E6l%10%EA%F1%051%06'%0A%84%BAy%A4%EF%20%B8%84%88%CBX%AE%E4Cw%10%A8%AA%A4%FB%E4%90%22%BD%2Cj%AD%5BN%2C%0F%CD%F9%FA%DE%60%CC%25d%3B%1C*%22%95%A3a%F3%D9N%C5%25%A4%04%B8%85%A4%F2%9Dh%3D9%D7%25%03%86DB%BC%C5%80%C4%DD%26%5E%84%C6%BB%C8%BF%F9%93%EDP%F0%15%97%90%8E%BC'%88%91%88w%8A%E7%AC%1B.%C6%07%BA%99U~%8E%1Cd%7CB%DE4%A8%84%0B%247%0Ca%D0O%EC%BC%04%A3%F4%9F%98%5D%14v%05%26%F8%87I%E5%5C%9E%F1%F7%D4c.%20%9D1r%F9%AC%AB%15%26%7C%D1%05%A4%E1%11F%C7%8B%E4%40%15Q%174%89%CD1%DC%84%09%D4X%1D%EB%C3%F8%92%02%3B%93%FA%D8%C6%BB%FE%97!7%A2%E2o%0Aq7%02%E2u%F6%DAG%06%B9%E49Dh%B7%97%EF%C1%AC%E4%F9%EB%EF9%05%CEx%C1%E8)%5Cw%7D5%E5W%E0%B4%07%0C%F1%AB%00%5B'%3F%F9%00%FE%E2%01%84%DB%80%86%1Ce%0A%E4%D7%1E%40%F4%3C(N%BA%F6)R%DF%BE%D7s%C8%D9%E3%17%AC%F6%98%5DAd4)%B9%06%E17%408%CF%0B%C8%E7Q%23%9E%84H%10%C8x%F6%9F%0E%A9%DBX%3D%2CA87%3D%DF%90%C0%EDz%19%ABY%97j%F6%04d%98U%12%D5%3F%EDM%94%CB%1E%40%F4NE%AF%FC%60%1A%12(dX%BE9%87%08%E9%85%9FO%F5%821%09%81%9F%E9%9F%9E%F6%80%C0%1B%3BmiHNiY%E2%1869%C8%BD%26%EF%04%20%BB%86%94%A8%96!%88%CF%23%C44%88'%23%09%AA%93W%EA%A7%400%19%A5%99P%0F%E4%E9%10c%00%0Ea2J3%A1%B3%B0%FE*%24%BC%2CQ%ADx%03%D9%0D%D1%08%24%CE%23%08%3F%AFF%F6%86%01%AF%89%B1%08%1A%E3%1B%20%9D%FC%EA%91%82K%D4%08%1A%E3%AB%D0o2F%F6%14k%14%A7%10q%25D%D0%18%DFK%3F%01%F7%F4V%A7%14%1F%82%A0c%23%12%DDS%81%03%0E!%1D%F9%06%84%9E%84%EEk%87%1C%D9%19%E4%A5%C2%C7%22%E8P%1DDQ%B0%DEqZ%FE%C6%3D_%AB%D2%C7x%BA'%3F%1FDB~%0EIe%3D%1F%14%E7n%ACfH%AC%10%3FQ%AE-R%1CA*sb%11%B1f%0F%CB%0Ae%BB%CA%17%13%12%B3%08%3A%03%F7%5D%EF%BB%C8%EA%AD%FF%5D%2B%26G%91A%5C%F3%A9%24%0B%C4_%09%FEeW%7C%DB%1D%ED%C4%08%D5%CF%C4Y%20%D9w%CA%FC%A2%E6%AC%EE%A8%13%08%08%F9%0D%2C%90%C0%0A%7D%93%AF%95%B7%93%908E%EB%8BY%20%FCx%97%0C%F0%1C%7C%CF%11C%98%60%82%C0%12%F1%1B%00k%E1MG%95%C2%3D%D9%C4%04I*%AD2W%AF%3F%DF%E1%40%5D%FB%D9%9A%F0)MK%FD*%DDk%1B2%05_%2CSA%91v.%60%82%04si%A9W%A4S%94%DF%C1%049%9A%D4%1F%2B!y%10O%F1%60%D2%18%E3%C9%3A%E1(%A8vU%1C%BA%F5%DF%1Bc%3CQ%097%10%24%DFg%D0%18O%3B%05%E7(%E7n%0A%84e%8C%0Ft%D3*%9E%2C%7D%8AJ%1D%E3%05%9A%03%0B%84%3A%C6%B7%A9%EE%202%CB%18%2F%B0%06%ED-%20lc%FCEw%90%3A%A61%DE%EF%0Er%9Ei%8C%B7%F9P%DDL%88%02%90%E5utY%87%D8%7C%2C%EF%26%85%F8%9Bo%00D%0F%A8%DD%82%DC%7C%90%EC%1B%01%F1%7C%DF%81%93%18%C6x%E7%12%AA%EFF%E3%08%B7%85a%8Cw%AE%80%22%A2%A1%F7%F11%861%DE%B9%DE%01x%00%B8%2F%B0%AD%E3%B1z%88%FE%3C%7F%1B%C0%1A8%FA%B6%C4%B4%8E%C7)%24%BF%A7%D2%7CN%83%D0%C7%AF%F0KL%EBx%9C%DE%03%FC%B3%86S%E5%3B%D1%FA%DA%83JH%06%98%A58%82%1C%04a%98%B6%96%10_%EE%CF%FD9%88E%E0t%F3%A7%16%BA%86%E6%AA%14%A7%D0%FE%D7%91%CB%A6%8D%D5%0Ew3.%D4%14o%E8%A6%85%FB%BArJ%91%D6%0F%EFq%C6%00~%C7.%19%96R%9C%5EM%BF%3Ay2%ED%AA%3A%B2%148E%F11%9E%EE%B2%C8i%22%2FG%0C%EDB%FDQ6%D9%C5%D8%02%D0S%8E0%E2w2%3C%FA%BD%3C%0B-%C2%C8.%7CT%7F%15%F1)%DA%CF%C0%1F%A8%8C%40%9E%8F%BA%07nTF(%8A%2B%CB%891%B4%EB%A4%84%08%94%87L%0D%88%88%FD9%05%258L%85%FCP%15%A8%A3*%A9Y%05W%C2%7DTH%99%FE%E2%8B%91!%ABw%96ZuZ%E2S%BB%C8%07%EB%3A%91%86%FC%94%E8%C3k%DA%80%E5%B3%C1%E26*%C3P6m%AF8%D1%B0%C4%F2%0AX%9F%0B%E8%A4%FCP%D0%BDZ%E6%13_d%7D%E6%F2%B0%8F%D2%11%8Bu%96%5D%E3S%97%FF%A30A%1E%E6%C8YW%7C%FC%C7%92E%91pe%A8%CA%AAl%9A%C4%B10%D9%EF%D4%2FN%AA%16E%81%85%2B%06%A3%2C%90%F0l%9E8%D0%87%17%88%96%99%FD%BD%95Ec%A9_2%40%FC%92H%CC%B1m%92%02%96%17%D1%90%18.%E9%EFW%A8%0C%E1%A8%AA%FF%5B%06k%DD%05%B8%7FYb%A8%84%EF%DFW%DA%B4%94J%E1%D0Z%B3%89%10W%E1%B5m%DB-w%2FG%A1%BF%A8w%F8P%FE%1F-%1C%98%D2%A6%CA-R%AC%18e%3E%A1%93%7F%DCV%0FoP%3C2%00%A1%E8%BF%9A%1Ah%826%3A%E2E%00%00%00%19fcTl%00%00%00%06%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%E6%D6Y%9A%00%00%09%DFfdAt%00%00%00%07x%9C%ED%9C%7Dl%DC%E4%1D%C7%7FI%EE%FD%7C%BE%B6%8CV%5B%D2%5EV%3AVJ%A3%EB%D2j%82B%93k%12(%DB%BA%BE%20%D8%8AV%20%84%F4EZ%D7%04%08b%7F%C0%E2%D0v%0D%A5U%C2%84%A6j%AA%88%E9%0A%AA%26%B6t%1B%AD%F8%03-N%D2%D0%97%99%CB1%C8%A6I%95p%08%D9K%D5%A9%B9%BC%BF%E2%3D%BE%5C%12_%F3%7Bl%C7gWj%95%AF%14%9F%FD%FC~~%3E%8E%FD%D8%BF%E7%F9%DDs%06%B8Q%C1Y%25%00%3DHYZ%B2%03%22%DF%A8%3E%23NsS%9A%878%AFy%CD%EB%D6U%E0%C3%9B%00%E9%DA~%C6~%C8%8B%AE%5C%DB%19%81%A50f%3B%C4U%09%3F%B6%AE%B6%7F%1EE%8B%B3%CE%C0Ac%15%B0%1F%EB%BA%F8%96%1C%8Ea%E5%24%26%1EN)%B8F%AB%AB%B9%98%D7%83%B4%C4%BC%5Bp%08%BBzj%7D%3F%F9%F3%F7n%AC%C4kX%19%C8%99%5C9N%85%AD%02%B8%1F%2B%CFz%EA%CB%C8%D4%FA%B3%12%40%26%CF%E6%A0%150%3D%D0%24)%2B%EE%1D%CFR%18%CC%04%E0%E7%3E%10%EA%97%A6%D6%1D%05%00g%01%BE%8F%D7%B0%00%82%82%B2r%5D%F2%F0%14%C8W%00%EFc%86%BF%F5%CF%AC%B3k%01j%01~%88%D6%C0%8E'!m%C0PN%E8%FB%A3%E4%B6%C3%0C%8F%C5U%1B%CD%95p%F0%BD%B3%B9x%15%2FHu%E2!r%00%1F%01l%40%1D%98x%9F%C4~%1D%3B%BE%BC%01N%E56%20%D6%C9K%24%1C%E2T%3A%3A%A5%00%9D%12lF%1D%9A%07%E4%FB%0E%60%7C%DF%CE%F1e%AA%CDVy%E02%8E%00%B6lT%14%05%B2%E2.%20%97%07%D3%D6%B1%C1%F0%20v%84%AE%A3%3D%E5%EAmf%A2%8D%02q%AE%CFM%AEm%CF%170%07%7F%7F%0F%E5%01%E5xo%C2%A9%BE%7F%1C%5C%06%8F%7B%FE%AA%BB4%F1%D9%16%96%0BQ%87%AC%EC%9E%FB%F0%5D%83%E2(%3C%AF%AA%F6O%92o%F0%2F%A8%E7%EA%8AI%B7%D03%83%ED%A8%C3%E7%2F%F7%3CD%81D%07%81)%E2%A6%B7%F7%00%9C%0B%C9%C8%85e%BE%2B%0B%C0%9C%E7!Z%B1%E5U%B4%AA%06%B1%A7%86%02%E1%2Bb%C0%CE%3C%D5%EEM%2C%C5%D9%8E%9E%FE%0A%F0%87%E2%DB%EF%3E%24%FFo%10%AD%AA%8C%E9i%12p%08%D7%C9%A9%B7%C7%F1cQ%D4%CC%96%93%3A.%84%E2%CE%09%D4%FE03%91%85%DF%A5%0E%8E%E1S%20Lm%3D%05%F2Y%8B%2C%0F%82%7F%14%9Ax%D4%FE%3Dv%2CP%40%D9%D7%F7%23A%B55P%5E%F2%0D%8Ac%C6%B0X7%0E%9D%BC%9F%E2%B0%13%96P%F6%24w%CA%87%DBT%5BUb%80v%C6%5C%C2%BFe%1E~W%BE%91%DA%F1(%A3B2%EB%7F%A3%DA%BAZ%B8%22B%F3d%C2J%B3%A8%C0%23%81%A2%F6%C5%7F%A0X%3E%17R%EEq%A6%B0%94%E2%C8V'%CESw%9C%A7A%9C%FD%A1%1F%E0%96%C6X%A6z%D35%B2%9CR%85g%40J%7C%B6QG%AC%EC%DA%AB%85%02j)%02%87%DAP%C1_%C7%FD%C8%5D%F2%A4%F2%11%A8%C9%A5A%E0%93%CA%2C%B4m%92%26%99%12%E8%06%A1%5D%A2T%D12%A0%2C%DF%90y%8A%9D%9C%EB%EC%0A%F4%08%9B%D7%80%B7T%B5%FD%F4O%FB17El%94%2CZ%97%8FR%19%E4%DC%A3Ff!y%22%E5%AA%0A%DC!%8D%9B%9E%FC%E3%C3u%BC%86%B9b)V%FA%C7%9CD%3FdF%1Dq%CD%FEw%D3%09%FC%C1%95%DCY%C6%8E%B0%A3W%00%F0%AA%2C%07%E5%FDZ%0Ch%AC%8A%D0%8D%7F%97%EFG%3A%90%AC%FC%14Y%FA%0B%A7%BBw%9F%C9%B4%87JRY%F2%1A%AA%CD%DF%BB%08%2B%F6N%FE%EF%CC%91%A9%82%AB%FD%826%04%DE%A1%B6%0Bp%8C%0F%A97ge%5B%86%A7%2C%1F%08t%A7%A4h%14%87%5E%02g.%A9(%CC7Y.%0A%14%9B%95%10m%DD%B2%10%FA%85%D7rJ%F7%C2%CFk%5E%F3%9A%D7%BCni%097%81%D1%BD%F3%26%40%5Eg%F4s%87i%2B%17N%DB%CE%60%22J%9E%EC6%81%AC%B7%1D%02K%7D%F4~%B8U%F2%2F%2FF%93%CEV%8A%C9%DF%F8%1606c%DE%E6VpP-%D8%CA%F0%8D%07%C6%22%0C%7D%DCb%89%1C%95%DE-y%ED%B4%04%91E%F2%AEr%D4W%24%D3%15%F6%E9%7C8vM%40%CA%19%D1%CA%C6%D0%84~%A1%E1%0F%CB%B4%04%9D%19%05_%C3J%BD%2Fo%97%2C%8488%B4%98%5Dl!%03%7C%0F%A2%C5%1E%3C%23jV%CF%95%94%F0%B3K3%22%96B%A0e%EF%B6%D9%85A%04%9C%96%EA%90%ACx%B0%94%2C%FEZk%5D%3Bv%20%17%D99%22%8A%1F%ED*%D6%CCm%CDIMH%3A%8D-%96%E5%BE%1Cx%DC*%06%13B%AE%09%88%A2%18%3B)%18%FC%B2T_%5DX%26%C0%2B%CB%7B%05O%8Ee%90%E7%B0%7C%9Fg%F8pX%96%87%AD%820h%82%D3%3B%0A%CC%E9%DA%A3%BB%ADa%B0-r%1F%F6%2C%8C%26%8Cw%BEe%09%C45%7Ci%2352%3AW%DE%15%BB%5C%B5U%96%C3H%A2%86%A3%EC%E4%40%7C%B5%12%3Bo%C4%1A%8B%BE%F6%08ih%D7%11%A3E%F9.%DF%10%9C%1A%A1%3AX%04%E9%FC%098%EA%ED%86%FC%FA%08%B4%0BvC~%DEz%ED%EE%A4%83%7D%17~%8FSF%7B%00%96%AAY%B8b%3B%03%7C%3A%89%F9%14%05%CCR%1A%E7%D0%B7%EC%14LB%98%BB%8C%FBV%99d%00%7CZj%D4%93I%A3%7Bs%C2%98%9B%18up%E6!%C6%D4%BD%AE%F8Q%C9f%06%FB%00%C0.%9B%19%E0!%9D%84%2F%04%9B!%CAW%AA%1E%EEv%80d%F1%24%C2%DA%0D%09n%00h%B7%15%E2!O%F1%F6%1D%07%86l%85%10%05%D9%DA%23%B6_%13%25%E6%D9%0B%F1%3D%92%80%A4%CC%0C%B0%5C%AD%DD%9C%FD%90'%FD%B93%90%B6%90%95%23%F3i%05J%A1%40%F5%9F4Kv%40%FC%1ClQA%D0%AC%40%DA%F2%D4%B3kT%90%23%9A%CE%A6!B%8B0%0D%F1m%3Eg%0B%C4%BF%EE%C1%E9%26%EC_%98%93%A9%E7oN%1D0s%9FD%7F%EB.%9D*g%AC%84%3C%A1%40H%8CW%20%E0%BE%E7%A5d%AF%80%DC%A3%16%8A%8C-%82%24%C6%BF%99%80%C0%9F%E5E%11%E5%93%E9%B0%92%C1%F4%F2%10%241%BEZJ%16%B0%D9%CA%E2%F9e%1A%FB%CC%1D2%20%AF%A8%231~f%1ASK%8C%5C%A1%C3%7B%11%DF%0F%F0%C9%D5%06%20%3D%FB%12%B3k%83%DCT%89%2F%07%E0%DC%FAO%10%DFM%87L%0E%12%D8%89%7F%9DI%40f%1EZm%FB%A1%5C%C0%86%3C%118o%0E%02%C5%F0%D2u%1E%92s%85'u%AEv%01t%22%AE%9B%C1o%F2%F9%E9%FA%D6%CE%A7%95%18%9F2%ED!%07%B0%16%FCn%CC%8B%CF%24%D6Wk%5E%90%C4%F8%D4%89%15%0F%1F%C0%92B%9D%B9%19q%C1%1C%24%F0%95%12%E3S%AF%C1%15q%0F%92%8F%F3%C9%BD%BB%F1%A9%C4%BAr%E5(%80%1B%2F4%BBk%D3%AC%06%EB%A8l%F9Xk%1E%9B%86%DE%DD%87A%C8pb%D6%B7~%8E%D7%B3!%DF%1Cd%F3%02%1C2%5B%EEo%0A%EC%1D%E6~h%B2Q0%0A%09%1C%03%FFf%ACE%E8%2B%9Cg%14%02J%B7%F9%B8%19%86%D2M%15%0CC~%09%0E%C9%0Ce2%60%E9C%D8%E3%B5%92%2F%02%BER%3B!5%FD%F2%03%BB%24%60%A7%12%3F%86%A6%5E%CD%11%E2%0A%E9M%BD%D2%AE%C2%10%E4%02%96%FD%9B%13D%8C%EAB.%9B%9A%0E%A7%82%9C%5DW%DC%A0W%85%3B%5D%08%09%EB%D5zU%B8L%CD%B9SARb%3C%0D%F2%A5%DE%85%D7V%E2%C2s%3ANf%83b%0AD%B7%8EH%9A%10%3E5%C6%E3%DA%97%26%24%8F%C4x%5D%AF%B3iB%EAn%8C%F1%A8W%9A%90%E8%8D1%DE%06%88%F3%8C%91%07%A4%D9%8E%5DRJ%A2%40%1F%E2%BA%19%904GE%C6%20i%EA%F6%82d%D0%BF%B4%B2%0Ebo%02%C7%12%08%23%D9%0AI4lf%C71%03%90%A9q%FC%DC%E5%E0%C8%E2%1F%06%1C%3D%2FN%8F%E3%E7%0E%89%90%05%0F%20i%F8%9C%FA%85%02%193%10%E3)%F2(%BF%08%E1%20%C0%D1%5D%02%E3%FF!%0FG%B7%91%18OSu%BD%124%5D%F5%F4%A8%E6%8E%C0%D2%C9%F3%AA%1B%E3ib%F2O%88%BB%C5%E6%18%F8WS%3CH%E0%1DOBL%F7%13%7C%8F%95%D4%C8%2B%E1%BFa%DA%C8%85%B4%A9q%7F%EDV%02%C9%10%CCB%88%DA%2F%1C%BD%B82J%B3%BA%24%FFP8~lC%9A!%E9%10%9C~M%A2Z%3D%D1%EAM%85%3F%032%8EO'%2B%84On%98%96%FB%3B%D9%DEW%C8%F8%A66%AD%04%A73W%CB%CA%16%AD%93%1A%84t%EAO(%A89%22%EE%DA%BF%D8%3D%97%AFn)%D2%EE%B3%BD%7Duh%91%A0%5D%C1IZ%EB7%0Cy%B5%26%CEi%EF%CF%E4%B5%EAOz%D2n%FE%17%17%E2%BFf%9E%91%83%F7%A1%BF%C9K%91%A7T%CB%AA%D3%F6%20q%B7%EE%D0%85%B0%9A%F3%7C%95%F7%03h%CA%F3L%BD%91%E9%C8_%AC%D5%98%84%C3%8C%5C%AA*%114%F6n%18.%AA%BDG%1F%C2%EC%2B%A3%D7%C2%86%E3%B2%9CG%DF9%10Z%E5)1%92%16z%82%7D%85n%BC%22%B0%974f%B39z%2F%1A%20%10uj%7F%F1%C2%9E%D4%804%0Ci%FDNS%A5L%A0%FC%20xR-%7D%F4%17S1%0BG%B4%7F%2C%3A%25%F6%F1%80Vn%D2s%AF%8B%9E%25%CBz4%3F%1E1%02%E9*pr%1A%E6%0A%A1%93%A7%1Ak%DA%E5%B0%91%17p%B1k%A5%17%24%BA%D99%02eT33%DEpg%99%11HWA%AB%D6%DC%95%EB%DB4n%FA%AC%CA%86S%A7%0C%A4%1C%C9%3FR%F4%7B%0D%7B%BB%E4%1A%93(%B6%C0Z%A9%23%EBS%CAk%3ER%0Ef%19%BC%19%FE6%DD%5E%F7%D0%3Br.%ED%00I%CF%20%D8x%07%ED%18f'p%B0%A1%C7V%CA%14%2B%83%9A%A9%88I%BE%CC%C1%F4%8B%DB%18%FD%EE%FA%B4lx%3B%DC%FF%01%1C0w%1Fb%1D%1A%C7%00%00%00%19fcTl%00%00%00%08%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02-d%25%1A%00%00%0A%15fdAt%00%00%00%09x%9C%ED%9C%7Fl%13%E7%19%C7%1F%92%B3%7D%B6_%DF%01%0Bj%A1%94%98.%ABh%96%90%90Fm%B7%011!PJ%D3%26%AB%D8%94%AD%A9%F04%D6Ri(i%AB%22Vm%8A%93%00u%A1%5B%22%D6%7FZ!b%B6%96v%D2Z%D2%C1~I%D3r!)M%A9%89%1D%986mc%E2%E8%C8%CAVJ~%92%90%C4%F4v%E7%1F%18%DB%F7%BE%F7%CBg%A9%15_%25%8E%EF%9E%E7%F5%E7%F2%DE%DD%FB%BC%3F%9E3%40%BA%D8%8C%3D%00%A32%FB%0C%C9%0C%88%90%AE%095N%DAd%F0%10o%E9%96n%C9%88%BA%0A%7C%A63%98e%D0h%3A%04%D5%C3%99%80%D9%10%BB%0F%ACYo%BB%D3%E5l%06%BB%E9%10%E4%06z%BE%E9%90k%40y%09v%A6%E2Q%E3%10j%EC%D0%F7x%92%3D%B8%CB0%83i%89%D4%11%0F%F5%2C%7CK%F1CPe1%D1%EE%10%14%CE%FA%AF%E0BX%09Bu%DA%F7%90%ECyJ%90%1F%82%CDGtp%9D%86%100%23%3C%C1%A5g%82%00%F9%DF%3AA%98%05%9A%0C%E9%12jC%1C%88%3Fx5M%E2!%D6%05%2F%9C%14%E6%C0J%AE%AE%B6O%EB%B6%DE%16%EE%22%B9%14%CC%E2!!%1F%B4T%1D%A8y%9C%C8%80%1E%AFs%81%20%2C%25x0%D3%91%CF%B0%C6.%0EM%173A%9E%0Cq%DC%03%5D%EB%0F%DA%97%E0%3D%D0%B5H%04kl%0D%E7o%AA'%13b%AA%B6xC%CB%F1%95%8Af%E6%DE%C6%1A%AF%00%7B%98S%03%99b%EE%5D%FE%B1%17%0F%89%3C%40*%1D%0A%A9a%A0%19%B80%83%AEc%ED%CEH%3F%11%D2%A7%0A%12%81%D0S%CD%B7c%ED%B6%08%1B%20AzUBj%00%B6D%DF%0FJ%DB%7C%AA%9D%1A%A5H%A7vdP%15d%0E%DD%09%D0%11%7D%BF%5D%AC%9D%86%CET%BB%BD%9E%22%05%13%CA%93%BA%ED%E8%96u%AB%A8%10%F7%C7%EE%F9%5E%1E%FA%F8%D7%D2%ECaz%8Ex%8C%A9%DBC%F2%D7%E9%C7%D2(%E6%CCX%00%80%B7%D6C)%9CIw%A0%A7%09%10%A8%E6b%7F%99%D8%9F71n%7DbS%1F%BDk72%C5%C8%939%3Cs%8C%93%20%7D%0Bc%15%24%05%CF_l%E0Kp~%1D%F1%98t%C2%DB%FB%AA%072%AEX%24p%24%CA%B6%CA%A8%19%DD%0D%AE%D2%B3%AB%3D87%B4*V%91%CC%BDoW%AF%86%1FeB%7C%24%88%B5!v%F4%FF%F6%DA%7C%CC8%B6%E9pE%EF%92%2B%00%97%16%3E%2B%7CX%9E%01%99%C8%D8%95%A2%BBjcn3%14%97y%847D%B9%A5%D7%3E%B1n%3F%D9%7B%F5%25%3E%DDLO%E3%DB%03%F1%B3%9B%26%3D%B1wu'%A4(%89S%07'%BD%B2%B3b%85%B5vf%9A%A9R%7C3%0C%A8n%AC%3A%5EE%F9_z-%88%BF%A5VD_%AD%85%9B%FC%5B%E5.%8E%D0%11%C2%DD%D84%DE%968%04%A6U%A8%E1p~%CEhP%3Aw*RX%F4%5D9%7Bu%C8%8Be%5C%9C%3C%B7*%F9%C1%EF%E1%0F%C6%EA%11cl%8D%20%8C%97%C9FH%E7%ECr%1E%5B%B6enher%EB%05%3C%84-%05%B8vbbb%A3%FFe935y%0D_%B6%AA%3Bt0y%08w%E2%1Dm%C2%83p%3F%BB%ECo%98%3E%DEy%A1%91%97%B7%88*%EC%EE%17J%13%1Bb%CF%1C%AF%93%1B%E0%18%3D%C6%05%E5%ADH%10nn%EB3f%5B%26%B9%84%C9Q%8FuJ%08s%9DRJ%138%C9%B6.%D9%C7%C3u%A2%E4%A6%ADH%FBe%1C%2C%B9%80P%B9%81%F46g%07%92q.%93%178%E5%7F%DA%83qJ%5C%24%18%88%E2%89O%8A%5Eb%F5%91%ECY%91%EB%ABC%BC%9Er%9Fj%F2%EE%DD%A4%87%01%03%80%E4%FB8%B2%B2.%D3%09%E9%D0%00%C9%23%04%1E%82N%C2%8C%06%EF%03%BA%C6%DA%FF%DD%E3%D3pph%D6%AF%07%D2%C8%2C%D12%E1Q%F6%BA%0E%06*%87gU%0D%A4%E2%BA%DC%AE8%A0%97%81%F8%A0G%A6g%81U%3F%B9%EF%84%814C%0F%A7%DE%DD9%A6%C19%A9%95%F0%8C%06%EF!%D2(%1A%AF%F6%CE%BB5x%7FS%C7%19%11uQ%20u%1E%D3%D5%D1%AC%0Bb)%F2i%F1%D67%BF%97%FF'%5D%C5%B4I1%2CfC%F9%B9%80%10%E7%09%3EW%90Wr%01%D9%FD%85%81%B4%E5%02B%9C%9C%CC%96%88%D3%AC%D9%12%AB%25d%E9%95%C5%9B%03%08%5D%9B%03%08Z%94%03%08%94i%E8%3F%EAV%97%3B%07%90%0B%FAz%B7%DAd-%C8%01%84%DE%AA%AF%07%A2%0D%D2%96%833oi%0F%98%0F9%7F%D8%7C%06l%CBAlD%91%15%E6C%F2%1Asp%9Ft%FC%D5m%3A%03M%E5%F9L%87%D0%93%BD%BC%E9%10W%95%B4%18%A1%20Vf%A2%C6%87%F1%A5d%7CI%13%3BI%88%CC%3E%8DSQ%83J%1D%7B%E7%88q%88%E2%E8!t%3E%07%90%07%B3P%5DJ%10%C7%B2%1C%9C%F8%BC%00%D9%9E%15%E9%99M%D1*W.%FA%00%B1E%24%D34%B0%1F%E0%9F%7C%97%A9%D1%99.Z%B7%96%5EPD%CEF1%AA%EF%F3%F0%83%F6%CB%05%3C%D1%09q%E2KP%D5%12%B4l%F1%EB%E2%20%7F%25s%8C%EC5%D4%FE8%0CW%AE%D7%3B%FE%B0%94%8B%BF%CD%A0%B0%18%FF%01%F3%EE%95o%00%EC%04Fv%8DII%AC'%BA%92q%9C%EC5%08%B6%81z%80%8F%06%5Bu%0DAXN%FC%AD%87%CDd%AFn%B0%9E%10%1D%E9U%FA%869%F9%9D%AE%D3l%C1%1E%859G%1F%7C%24%1D%0D%BDZ%17%03hA%B8%C6%BE%FA%12%A0%17I%B7%BC%FFT%89%94%60%A1g-%C2%B6C%84%AC%0D%EE%B2x%60%A0L%F0%12%3C%877p%EC%9Ah2%90f%CD%BB%0AR%12%DEvW%A10%F94%B9%D3%EF%036%D4%D0%3E%AD%03%C2%0A%1C%E4%7B%E1%0E%B8%8CY4%BC!T%0F%2C%E3%DF%A7%90%99%25%AB%D0%B1%A5%D0%C2%11%F2in%C8%D2%1D%8Dyz%20%87Q%A1%B0%14%1Cne%CF%11%BF%BFC'%E4T%B4%9E(%15%25%7B%FE%FC%87%8Ep%F4%1F%D2%A9wye%9F%B6%95%D1%EA%A28%9D%0C%BB%9A%C5%9B%DD%CF%F1%86%20%A1Y5%10%EBm%1DF%20%CE%87T8%1D%80%DDu%BC%01%88*%85%C2%C6%CE%89*%E5%ED%7B%C7%7C%08%AA%7D%CB%7C%08%D8%B6%B3b%8C7%19%E2%9Ae%C5%18%FF%8A%B9%10(a%C5%18%DF%12%87%0C%9B%03%A3%23%AC%14%E3%E3%CD%0A%E5%C3%7B%FEe%A3%EE%B6%A7o%B5%14~%13%1FN%1AJ%9F%0C%FEX'%03%15%97G!%F1%8E%17K8%D8%F7%E1%22%AF%0Fbm%EB%96b%FC%3C.%B69%8F%E0J%01M%C8%DF!B%26b1%3E%BEIJ%FE%CC%0B3%3AG!.%E1%11)%C6%17%C67%CFpxW%E7%8A%3Dj%9A%5C%19IC%C4A%FF%BE%C4%B0%D3%E6!%F8%B6%D6%D4%E9%BE%BE%A4%BB%3D%0EA%FF%22%A4%25%C3%8A%7F%3C%A7%F3%A4%A4%40%9A%7C%A1%80%BC%13z%02%1CS%8B)%E5%F4%7CE%88u%91%CF%85%E9%3B%D3w%05%D0f~%5E%BF%DE%FA%8AB%A2%03u%CB%B0%07%8E%CA%3B%D9%1F%F9%9A%F8%3Ar%D9%AD%13b%0D%DC%A8.%BA%1C%EA%02%B2N.%F7%B0%17%C4q%08!%9D%8E(%A9%CF%15%87%B8f%3F%F8%BA%5B%DE%AB%16%9E%04h%80a%E3%10x%0F%9B%1F%FBK%7F%FBZT%0E4g%1C%22%EA%0DY'W%93%20%8C%EF%E6%81%F1%C6w%10R%AFT%40%F2%C2%7F%7F'%D3%E9%C2%3A%A5%D4%2B%F24R%1A%C4%B1%7F%E2%CB%7C%86%D3OY%A5%F1%81%12%24%982%F9W%F1%98%B0%26%C3%A9VC%3A%9C%2C%E4%F9%CA%F57%2F%89%FE%0EP%DD%CF%D2%9D%1E2%0A%99%13c%FCM%DBbs%FF%F2%1B%814%A7%BD%1Ar%EE%E4d%13c%FC%08%97%DC%CEo%0C%EE%80%F4%A9%83%DFh%C8%B9%93%13%E5%13%FFW_r%9B)%1B%CF%9C%05!%3E%C9%A3B%D2%9Ak%CA%E2%EE%1F%E5%9C8c%10%BB'6%7DqC6%3E%D3I%EF%9D%9E%10*M%C6%F8%98d%D2t%1C%3E%83%90%C2%86%F6%D4%13y%89%CFt2%0Ay4%19%E3cb~%92%E9%E45%08%F1%A8%C8%E3%91%9CL%87%D8s%01q%1AL%60P%051%AA%2F%0E%84%99%9F%8B%2C%B1%D1%5B%10uB%9D%9FH%90%A0%E2%02%9F%01%D9v.%3B*F%B9%AB%A91%3E%CB%F2%C3%E6m%D7%81I%8B%F1Y%D6J8%F0%157%D0%A3%A91%3E%CB%1A%85%D0%FD%5E%A0Fc%A3%3A%93%20%F3a%A4%2F%00%16%11%92g%5E%02%D7%13%D0%1F%E2%C1%1EH%8E%E3M%D0%EF%3F%5C%BCSlV%D6d%25%9B%12%9D%96%DFo%AFzs-%A0%A08%8E%C7%A6%F4%23%15%0BD%C7k%BE%C3%81%FD%01%5C%1Ec%EFF%1E%A4%3B%05%FF%10a%EFo%953%8C%DF%0A%06%9F%3F4%14%B6q%F2fi%C4%FC%A4%EBH%D9%1D%B8%F2L1%FCZ%11%22%E9%F8%16%C8%0F%C8%9B%A4%C7%05H%D3%03%60m%C6%3D%C8%99v0%5B%A6%E1%3C'o%13%AB%11%11%9F%B0%10%87%DF%F9%98%B2)%EA%5D%D4~%F0%DB%18%5B%9B%D8~y%F1E%1D%82%C0%C1Q%5E%05%A4%86G%15%B8y%84%AE0%B4r%F8%A2%3D%3F%AF%9Cz%91%F8%F8jB%0F%03%9C%C1%1D%CC%F9%A2%1A%B9o%FAI%E8%BE%91%E0.%BF%AA%89%8EZ%B1K%EE%C5%D8%9Ce%C2%C4%0ElI%D7gmHes%F3%14%9C%0Bb%9F%D1A%83%CE%AD%D8%92%8E%F2%7B%D4%F6%B3%87%AA%85%F1%FFx%F1v%16%7B%89%A2%E9%EBG%3C%EA%20%AE%C7%BA%F7%C2~%BC%BD%8B%C7%9A%8E.%D8%E2V%07%01t%1F%F6qbQ%8E)%BC%AD%A5R%E9%BB%23%92%0A%11%D6%7F%5DM%84%19%BFP%F8%AC%DA%F9S%87%10%C0%DA%DE%2F%9B%24%B4%1A%3D%CEB%B5%0B%CF%CFT%60M6%E1vR%CB%D4%BEu%FA%90%3A%C6%C5%12%FCs%EDU%F8%9BDR%97%E0%E5U1%06V8%B0%F5j%237%19L%D5bU%08%60%84n%8B%1Bgd%97%12%9Bq%EBB%8F%3A%084%95%B0%9Bq%1Fe%11%88%F3%E2%97%CA%04%FCZ%BE%AA%B4%A9%3AL%8A%95Je~%E0%E7%F5%DB%E1%FE%0F%95l%83%C1J%7D%EDy%00%00%00%19fcTl%00%00%00%0A%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%034%EC%9A%00%00%0A7fdAt%00%00%00%0Bx%9C%ED%9C%7Fl%14%C7%15%C7%9F%CF%EB%FB%B9%3BWJBi%A1%B6%95%D0%D4!%04%9B%E0%22%D2%108%FF%08%18J1%B4Ph%EB%D6GK%5BTQl%14%A8%92%06%85%0BN%E8%85%10%1FHP%A1%A8%09G%09%89%2B%91%18%08%10%A9%AD%F0%DA%1C%95)%17%9F%A1%FC%D1%FF%BC5%01%14)%8A%8Dm%82%81%C3%DB%5Dl%EC%BB%DB%9D%D9%99%DD%3D%AB%7F%F0%FD%8B%9B%F7f%3E%DE_%F3%DE%BC%9D%05%20S~M%0B%40%AFN%9B%25e%03%22g%AA%9F%C6%89M%16%FF%C4%07z%20%AD%D0%DF%A4%ECCr%3F%08f%1Fr%18%AE%8AY%87%FC%0C%7C%81%ACC%02%80%EE%8E%03%04%92%E3%00%11%86%B2%0E%99%0F%CE%FAl3%CEN%8A%FF%3A%DB%8C%D8%ED%1F%F4%1D%CD2%83%7F%F8%8B%89b%96%19%D0%15%F2%16%05%B2%0D%D9%07y%5B-%DF%C0%E8%DC%9BD%FB1%A9%E7%F4%A0U%08%F7%C2%2C%91d%CF%09%B5t%0EXCt%40%0CN%14%92%3C%5C%F9%9B%C0%1A%C4%F3T(%0C%9DSI.%C2%E4Jx%C4%12%C4%BDu%F6%3A%80%A5D%9F%C8%20%D4Z%82x%F3%AF%16%BC%CC%93%A7%D8%DCAh%16%AD%40%84A%A8%93%AF%93%9Fg%3E%09%DD%92n%E7w()eR%F9%D2O%0C%7C%92%20%E8%B6%0Bk%1B%E9%20%17B%EBf%18%F9%AC%C6%19%F8%B2%DDT%10%3E%D0pL2%F09%8E%EF%5D%1E%05%EFsF%FD%15%B5%E4-7%F0%D8%16%C4%18%C2%E1%ED%7D%1F%1EF%BF3%86%24%3A%E6%18x%CC%F9%8D%A4o%D8%5C!%CB%D7gB%5B%A7!%24'%DA%1A%24%3A%A0%5B%9F%3E%81%B3%F1'%E5%00%E4%8A%86%10~%DE%17%E4C%F1%25%85Y%18%93g%81%5C5G%DAn%7C%24%D0%3A%EF3%89dw%DD%5C%80%BB%01%23%8F%9D%06O1qV%1A%11%3FA%24%9A%D7%F6%2F%C1%FD%11%1FQ%0C%3F%A2%B6%7C%E5%9C%E0%0E%D9%5B%2C%87%B0%3D%2F%04%A9!%E8%97%1F%0A%A5_J%FAF%B7%5C%87%9Fu%F8%8A%CA%CA%DFR%5C%11U%DE%C1%83%C1%E3%B8%F3~%A0%40%24t%AD%ED%2B%1F%20%D9ST%B1%11%60OH%DF%96%2BK%84%9E%C2%F6%9Akw%A8%18%CE%89A%C5%7D%91rH%3A%87%8EH%0Bk%14%3F_%0A%DDT%90%BA%88%A4%CC%11MAp%88Z%23%AFW%0F%B8o%2B%96%E5%97%F9WhrX%E7%D4%E7%15%FF%2F%0B%DF%97%F4%8A%18%17%F0gC8%F4%AD%5D%E7_%95%9F%A6%60%40%AB%A8%B8u%D7%F4%FA%E7%FB%25%AD5%81%9F%CE%5D%FD%12W%F4%0F%91%86%01U%C2%CDF8%10O%E6%DC%F2%EBth%C5'%5D%BE%02%D1%19%A5B%00%9Ap%B2%EAMx%0Bns%93%F5%20hs%CA8%9Aj%CB%A0%CEq%E2*3jbU%94%BB%8E%0B%01%C4%DF%8E%8F%C5n%CE%A8%80%C3R%8AR%7DWr%09w%09%1C%9FV%F0pcZ%3BQ%AC%90wOq%1F%DC%E5%07%F9%94%E0q5a7%E4%E2b~%E6%EA%BCza%E6X%F3%5E%DB%8F%C4%99%0F%3B.%5E%12%E1%BD%B1%E6%A2%CC1%B4%17%5Eg0%D2%85W9%8B%D7*%AB%9EQo!ix%E1%D3%84%0C%EC%23%3A%BBV%84%9E%D1_%7C%D2%1D%A2%EB7%AC%5CJ%3FW%10%F5%8DAz%DDF%E9R%9A.R%FA%A1%D9%E5%CBF%7F%F8J%DC%01%16%C8%3EZG%3E%3E%F6%EF%83%CFpL%90%9F%B08%DF%E7M%85c%94%A7%0B%DD%0BDO%9A%80%B8%EB%A18D%ED%AA%E8%2B%26%20%B9%22%2F%8Bt%AE%BC%92%F0%B8%16%06L%40z%80%A7%AEi%BF%06%F0%07SU%9E%84%12.i%7Ds%A3B%907SSHHn%EA%82%1D%3F%D5s%14%D6%9B%80tu%14%D4%FB%DE%A0tnk%3F%0Aa%13%10%FF%B4A%E8%AE%0E%D19%F3O%04%0D%96%EA%98~%93D%08S%3F%8E%B1%D2%E7i%5DS%25%F4%02%9AO%0DA%2B%E2%C6NZyK%94%87%8C~b1%0Cp%BARfG%87H%0F%89%99%82(%E3w%01%17%CA%3A%E4%10%03%E4%3Dc%17%1D%B9za%9B%94K%0D1%F3%94(%D7%24%E9%91%03~%BA%CA%86i%88%20%CB%A5w%13%22%AD%FB%EB%A6%20pb%89%3By%E04%ADw%8D9%88z%C6%16%5C%17)%7D%CDL*%C3%90%3B%95%95%B4%90%C7i%1D5%10%86%10%B1ev4%FB%90%2B%DE%87(%97%F4%19r2%BC%F6v%89%D7%98R%C1Q9%18%BA%F1%F5%9E%A0)H%22%CA%E0%5C%12%11MA%CA%24%06%E7%A1%9B%A6%18.%A6%D7%0D%83%E6%DE%13F%E638%7B%E7%9A%DB%1CQ%BB%CC%D8gT%5CS%A1)%C8eB%5DE%A3%1Eg%C0%14%04%F63%3C%5E%EF%0A%8B%CDAXd%26%7Fd%16%B6xl%A3%F8%9B%D28P6%8B%E3%00y%A0%FF%13%F9u%0A5!%8C%2F%A7%E3%9BR%D8!%40t%DAH%A5(%96%F6%07%10%93%90%F1%B8%F0%A8%D0%C8%C3%0E%8D%0B%04%9Ff%C7%16%9AK(u%B4%15g%10f%C4%96%D8%05%D9%8538wC%7B%D6!%0E%80%7Ff%1D%C2%014%01%C4%3B%EC%80%04%08%90%EF%C3%95%D2%0A%EA%85-A%D8%F4%CF)y%EB%D13%00%BF%B7%CE8%23%071%16a%FD%8B%A0%D6%AE%BBE%AB%0C4%1D%A6%E3lNe%C6P%00l%95x%DD%81%EAa%15%D6V%03%EA%EB%2Bw%A1UH%8E%04%7F%C4%D9%B8O%C1%1Fe%5B%11%EA%2B%06%C27%B1%10O%D0%FF%AC%E2b%19%D2%16%BD%1C%C5B%D0B%7FbM%C3%90E%88%F0%0By%E0%DBXk%1E%5C%AEC%E1%9D%5E%E3%97%3BDm%BA%F1%97%1A%11ku%8B%D0%DCi%F9%EE%12n%88%11%C2l%EE%8B%DE%0B%AC%16!%7C%12%91%CA%EC(h%0B%A4%E0%3B%C4%F5%AE-%10%B8%24%CB%B7%09%E6%B2N%3B%20%D0u%E4%9C%88%B7%FEk%99-%90f%D8%F35%BC%F5%AF%A7l%81l%87%E9-%22%D6z%D6a%0B%A4%C1%5B%D8%83%1F%23%C6%25%EC%80D%1C%A2%03%3F%C6%89%E6.%3B%20%CD%DB%E3%1C%BE%22%F6%CA%14%BF%12%E3-C%12%B2%BC%A8%E8%E78k%B5%E4Wb%FC~%0A%88C%26d%02%8E%A9%F1%AFb%E3%2F%14%CF%EDQb%FC%26%0AH%D7'%84%CA%B5'%08%11%FC%AB%99%BBM%5Dj%8C%A7%81H%DE%20%DE%CA%D7%DE%C2%DA%DC%C31%9E%A3%808D%7C%FE%06%A8%F61bZ%C5%A9%10%8A%C4%CB%BD%1B%FE%835%5E6(%1Fr%D1a%90%91%84%99%E0%C2%1AW%18%0C%C0%3D%A9%DC%81%14%10%D8%01%9B%24%8C%897%AA%83r%915%0D%FD4%90%FFn%C0nU%13%FA%0C%F6%D9r%1D%E1%9D4%A7%0B%9A%DB%1E%C5%BE%9D%3EF%0A'0r%E1i%20%15%B3%3F7%BD%E3%9D%0A%12%DB%08P%B0%91%2F%97%B2%099%A0dUo%81wG(%9B%90%EE%B0%BA%FCp5bSQ%3B%20%DE%FC3Q%E5%A1%EF%FCS6!h2Z%25%C1%C7%90crENwwE%C2%0D%F3%F8gMG%B7%7B%90%F5%E1%94%D7%9Czs%F6%B6%87*%9F%3B%2B%01*%19%F9M%B5%F5%8A%04%B9%02%9A%AD%ED%BE%09F%5B%AF%C8e%24uoa%FA%E9%CA%EB%8461%DD%E9%C5%1E%A3%8BA%86%B8C%F1%8ET%08*~%A4%A9%E3%7B%19N%01SE%B5%14%C8%96%D2%8A%BD)%10%E7w%0F%CArf%FE%BC%D4*%E4%8ErYS%20%FF%96%CEj%9D%E6%99%DAs7%26%97%1A%E3S%F64%EF%87%CCs%A5h%88m%CF%9DF%5C(%3D%C6%FF%98%D7n%9C%12%AC.%5C%F3B%E91%BE%ED%E3%90%C6%C7%F2%07%86%EAC%9Cvw%ED%0Dj%7D%ACVx%DC%991%9E%0Fh%7C%A8%82%1A%11R%9D%11%E3u%20z%BB%AD%D9%20%8D%191%DE%A5M%CF%F5%B6%0F%B3AB%19%A7Cg%83%8A%FD%10%9D%11%3D%16%19%F7%20%8E%D4%E9%AF%D5%EA%88%99B%C3%90%B4I%23%06%ED%B6~%1A%89%B6)SD0%03%D2%EE%7Ba%9E%9D%90%3Cu%F3Go%E6%91%D4%D8W%2CV%D5%7C%BEP%0B%B9%B2U8%2C%D9%08Y%09w%B5%90%F6%F8%BE%9F%06%ECc%F8%A6%C0%12-d%17%F8N2%7C~c%A4%F7%E3%2F%855%10%F4%B8rYx%DB%18J~sH%85%C4%3BR!%DE%86%AA%F0%AF%EE%FF%B8V%19%B2%08%F1%84%20%B1%01%E0Fi%C5%81%94VGGSxt%05%FA%3A%B2%FAY%B4%F2%18%EE)%01%A4%C6%F8%94%D6%B4%07%BE%10%A2%AC%A3J%99%10T%10%05%B7rMz%C4%B1%D6%D7R%3C%94H%CCx%24he%C6%1EV~%EE%ABOI%12%A7%5E%F8%14Cj%DD%C1%13%60%DDv%E6%12%FF%5E%98%DE%D2%5E%7D%14%B6mQ!)%E15%F5%F3L%F7r%60%9Ca%9C%DA%B75%AB%00%CA%AFG%15%88%FE%8C%886m%F42n%0Bj%07M%B2%F34%C0%E2b%25%C6%B7%E9o%D08x%BD%AF%9A1%85%E0%A4%CB%19%3D%04e5%9B%8C%D4%ADi%18%BA%F4u%9D%0E%CE%81)%1B%18w%E5%FA%D6%CA%99%23%F1C%CA%C19%1E%1D%DC%A9%1C%8B%F6%DC%A3%B2%E3G%02%8C%8C%89%0Bn%C5%CF%95%A7%A5%AC%7C%2Fx%96%F3%C3%DF%13%FDY%DB%23%D9%AA%93%B8%90%84~tbF%7B8%FC%86%98%06%B9%0D%8E%85%95QL%97%9C%E0%5E%9E-%3D%FD(%3EI%D2%B6%D6%AD.%18(%C7%7D3%E0%ED%5C%CD%06%F1%E4%EB~%2F%C6%C9KQ%1D%FE%99%5E%C4%F8_S%08%B8%0AK%CB%14%7C%A7%95%40%F3%D5%E8%98%94%F5%85n%91%D0I%AAB%AD%90%AA%98%20-%2F%A1%B9%3A%CD%A8v%23%A1S%F5%FC%BDL%90%1Fv%9E%09%EA4s%FD%F8%E2%A5%F2%C4Wy%99%20%B1~%DDE%9DC%96%09%89%9C%03%FB%12TW%A8%60%81%A8%DB%1Eo%D2m%1F%96%8Fe%CF%A0Z2UWm%CC%AA%95X%BC%9D%CB%0D%3F~%D7SK%89%B1%CF%98P%19%DB%1D%3F%A2%3A%B6i%C5%115%C1%10d%A6%CD%C5%A7%BEa%82%01y%D3B%D4%BE%9FU%16%17%89f%20%CD%84%0Fd3%D5%10%3Eb%06%01%C2D%C2%1B%B7L%99%FB%F6%40%097%03%B3%24%9CMS%C0%E9%D3q%AA%C6l%B1%A2%94v%40%D3%FFq%DB%E7q%91%C6%CD%1A%04%AF%FF%01%D5%B3%93%8A%C0%85b%9C%00%00%00%19fcTl%00%00%00%0C%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02q%C5%B6%1A%00%00%09%E7fdAt%00%00%00%0Dx%9C%ED%9C%7Dp%14g%1D%C7%7F%09%7B%97%BB%BDg%F7(P%0A%92r%87Ti5%85T%228%25%90%0B9%C2%8B%91%0B%82%8AH%CB)%B5vF%A7%094Ef%7C%C9%A6I%3A%5BL%09%20%FA%8F%CCd%A1%C5Qg4%99%3A%3A8%83%C3%E6%A5j%86%2Bw%D2%81%EA%1F%CAB%A0%14eJ%5E%20%40%DE%D6%BD%23o%DE%EE%3E%CF%DE%ED%3E%FF%F1%9D!%EC%3E%BF%DF%3E%9F%BD%7Dn%9F%DF%F3%FC%F6%D9%03H%97_W%02%D0kPfK4%20j%BA%06%AC8e%26%9B%A7%F8P%0Fe%A8_%2B%F4%19%AE%C5%AB%E9Cj%94%13%D4%19h!%DCj%A3%0Dq%0B%E0%17hCr%12p%86%3AD%EBk%ABd%FA%10v%906%03r%5E%DA%B5%86%3A%C4%D7%B7A%A1%0Eq%A9%B2%ED%3A%D0%D7%08%0E%AD%25!%DB%90%AE%96(%DE%E1%89%B2%11%BB%0C%3E%3Fo%18%EB%80%86%D6%DF%25W%13K%E0%ACl5%FC%0C%7B8%3B%9A%7F%9B%C8x%A7v3%CE%CC%080%03%7B%BC%A7w%24Lbpk%7C%F7%B1%90j8O%82%EC%C5%99%B7%85%C3%1B~%DE%06%DBpux%E7w%3FJ%82%9C%C1%98%AF%865%95%C8%F0%22%AE%8E%8F%02%FD%12%16%E2%EE%1D%CE%C1%3Ah%B7%EB%3C%E9%3A%EE%DB%E3%9B%AB%3E%8F%AF!%B7%F0%9E%9B%00%D9%F3%7Cm%FF!%8C%BD%B5ix%B6%82%AD!%5Ey%8F%C0%B8%B6J%C0%DA%D1%10%3B%F3%FD%7C%AC%CB-a%03%9E%C1%2F%FF%8F%8Cu%98%11%F2%84%F8H5%CE%C5%A7%AC%C7C%DCk%3CxH%5Cv%87%80%7BQ%C1%3A%D5%E0!%DF%94%7DQ%ACC%030!%7C%15%DA%E5x%06k%F6%0E%01%7C%01%EB%B1%11%18%FCYh%E2%F0%0D%EF%2F%8EA%FB%CB8%8F%02%60%04%12%04%F5c%CD%1D%DA%CD%18y%06%D3%3Fr%020%07c%0A%1E%E2U%25%9CY%E4bGg%FF%0B%DB%09%03%A3%AA%95x%08%B3%18%E7%F0%CF%80%AA%CE%95%F15%00%BF%F7%2C%09R%8E%99l%EEU%D5%DB%3F%24%204%A1Y%841h%EE%1B%18%C8%E1%3E%85%8C%D0t)J%B0%9F%C6%40%F8y%96%18%D0%12%C2%DB%5Bob%20y%85%D6%20%CB%04%BC%BD%8C%C3%40%E2%B2%25%06%22%8CA%D1%7D0%1F%AD%F0%16%C6%18I%F5%10%12%15%AEQ%0C%C4%15%B2%06%A9%0A%E2%ED%ED!d%0E9%A2Xbx%07%87%B0v%14%90%D1%E0%9B%C66%97Z%60%89%01n%B5D%C0%D9%3D%EALxaQjS%97m%E9%1F%D4%F7%26f%99%19%93%B1%1B%EA%22%25p%FC%DB%F5ef-l%94%B6%D2%22%E2%B2f%13%7F%EC%81%99A%E2%C5%C6%E5NBNF%DA%A8C%7Ck%3EX%18O%2B%D35%A6Q%C8%CC%A4%E1g%24%E03%CD%B43w%5D%00%AF%8A%E0%0A%A8%D8%E1%92%7DH%D7%06%F0%EEZH%91%01%ED%1A%E4%A9%E4%EDN%13%92%D3%06%BF%1F%FD%5E%AB%C5n%23Ky%16%F2%25Qu%40%A1%0A%81%B5e%C57UuI%02hr%BC%0DA%A4%FEy%CF%3D4%9B%22%04%3C%23H%95P%A4%14%3B%02%CDX%C9Y%06%F7%DE%E4%AE%16%11%03%02%B0M%8E2%E0%C4%0B2%EC%9D%9A%C42AP%05g%09%9A%1A%7CCl%A5K%99%D8u%8DADr%1CR%07%9DoK%DCdj%8B%1D%86-%0A%C6%3D%1B%89b%95X%AF%B6%C1%8A%89%02~N7%3E%E9%92%85%3EY%AA%F6%AD%DF%25%C3%2B%CADI%7B%9F%E00%03%15A%AE%94%ECL%B6%2Cp%B8%E6I%B1M%97c%2F%BB%0B%C1%5D%C9%8E%1E%7F%8E%12%E4%CC%B7n%C3%3BgG%81%AFU%0Fq%BB%BEA%07%B2%D6%A7J%AE%E0%F8%40%11%95%D0%E9%7B%0F%5C%F9%C1%8A%7F%E7%EF%A4R%F7%94%EA%94%1B%25%23%F8%C9%A5mq%16%E7K%E6%F2%AE%93I.n%DB%A1%BC%FD%AF%F8q%BB%A6%CB%82%5D%C8%B7%A1%93%E4rX%B1%0By%0A%18%C2%24%9A%7F%D2.%E3%E4%20%5CQ%F0.h%CC%26%E3%84%FA)%11%9F)%82d%1E%C7%96.%A8%F9%3DspI%C8%94%08i3%82P%60K%1BO%FC%20p%C1%16%A4%FD%EEQm%12MH%CA%DA%14%17%906i_%9E%ADT%3B%8C%9E%BB%A9%89%BE%87%EA%90%B69%0A%A98%FD%AEL%11R%A6%E0%9F%068%A2%8F%B5n)%0A%A8T%A0%CCA%8B%CB%23%FB%B1OP%9C%10%5B%13%9E3%8B6%04%92%F9%13%E2%3Do_%F1%3F%3EN%9D%E1Y%C0%CF%A5%8C%60%1Bg'%A0%96.%C3%B7l%40%B2%9C%8F%CCV%F1%3B%C9%FA%E3ET!%17%D4d%A3_'%3C%CD%C9N~%83D%8D%60%E2%CBd%96%D1%9B%061(%CB%2C%A9f%5E%FE%10%92%25%C4%B4%E1%B9%7Dr%9Ao%D6%0Do%AE%8E%EE%AFg%7F%B0U%15%C3e%85%3A%A4%10%FC2uH%25%DC%A2%3C%A5%D2%14%02q%09u%C8%EB%DDK%DF%A7%BE%BC%0D%95%CA%B0G%8A%9D%A3K%D9%BD%5Dl%E8%2F*%A3%1B%F6%CB%F7%8BM%AB%00%F6Q%85%F4n%06O%25%C0%15%99%22%83%EB%EDTr5%80G%A0%08AAv%B3%9F6%C4%13%82%8B%CDRj%E5!%3DqZ%CC%F7k7J%9C%26%04%5E%87%9A%DA%F8%F6%FA%01%99%26d%C6%EC%0A%95%17%0F0N%40L%EB%F05%B6%95h%FF9%02Y%A0%7D%91%D6)F%16%24D%9C%82%BC%06%F0%D6)%C3%BE%C3%2B-s%0Ar%09%F8B%8F%E1s%7F%97%1C%00%0B%C3%04%2B%F2%CB%5E%09%89%DA%C6o%D3-%B9)%80%23%10%CF%1Aw%5B%F2!%DB%F5%D1tK%D7%03%88%13%8F%0E%F9rw%B5V_W%9F.%D9%F5%7D%E7%3E%09%5C%DD8%06%3B%D0bIg%88%0C%3B%07%81%23%03%8D%CF%D5%C8%06%86s%0EB%F8_%95%19%3C%FA%07%A45%86%EC%18%24921%16%23%C7%CE%D1%87%FC%A1%A8%AC%C5%C2%F1%FC%B6%1F%D9%80h%7D%8E%95%091Z%DDM%5EQo%0A%D1b%FC-%D9%02D%00%F2%F2%ED%A0%19D%00K%0B%F25%C8O%88N%DA%B4G1*w%25!%16%06%5E%1AD%B4%00a%EF%18%95'%07%11V%C6%F6%A8%12%0E%10%9Df%C2%E1%B7%0D!Ok1%9E%CC%004%88%C8%E9%CB%0Ao%FE%2F%0D!%91%ED%F5%96z%C7%06v%808%CF%D8%D4q%EEiC%C8A%F1%80%A5%9Bq_%5E%5D%94%E4%F3%EAc%8D%15%8A%11D%B0%D8%AD%CC%FB*%1B%24%F9%1C%17%9B%D7~)%5BH%DEA%40%7D%02%22%E6%2Fo%C0%C9%EEg%B3%850%B3%DA%B87%C1%BB%5B!%F8%F1G%03%FDF%FD%825H%C1%7C%ED%AF%FB7%84%B5%98%7C%5D%60%83a%DF%83B%16%20%ECh%8F%94%5C%EFS%8Cw%EB(h6%FE%02Z%82%C0%A7%F9%15Z%E4%83%0E%BCW%F3%B9Y%92%0DH%EB%E9%CE(_%40%1A%A0%9D%0F%F9%BE%98%3D%84%AFU%D5%BE.%01Pt%BC%C0d%E9%95%D99X%82tn%25-%BD%C2Wa%09R%E0%17%81Up%1E%24%089%C6%7B*%B3J%AAM%83%7C%9E%1C%E3%2F%CBv!%C3%E4%18_%A3%AB%C3%A4%E1%CD%E4%09%12c%BCo%24%3D%A3G8)%9D%98%DE%07IA%8C%CB%E5h%A6%95%A6%CB%95%84%E0c%7C%C4vR%CC%DBK%9Ai%DD%B0%B8%DA%18%23~%94%F0%20%02El%BE%9B%E5I%B6%22i%1E%DFe3SuQ%FB7%E6%D0%3C%DEL%D7%9F%94R%A3%3E%AA%90R1D%1D%C2%0E%AC%1C%A3%0E%B9%00%C7G%A8C~%01%F1%FB%D4!Q%C8y%F0Ir)%E6%B9C%C0%14%A6%20%86%FD4r%06%B2%19%98%C4%CD%84%19%24Wq%04%B2%1F%AEA%CB%981%E4F%B8Tr%04r%FEt%05l%196%84%A0E%C7%DE38%22%0B%A1%E5%87%E0%B1y%BDF1%3E%D7%89%B5%AE%1F%85%92%7F%8F%01w%7F%FD%1D%A3%18%FFw%E0m%7D%E38%B1%09%D0%13rr%B3B%8B%AC%AF%18%C6%F8.%E8%98%995%A1%23%BC%E4%A7%A7%EB%C2eRjo%04%5Cc%CD%BDF1%BE%91%2B%26%0C%AE1%EA9%BB%F7%1E%C4%BE2%5E%E9%10%5C%9A%99%84%E8%E7%F1%A7%18%A1br%E7%1F%A2%EE%24%B0%3A1'%BCN%EBF%C6%F7%EE%C2%F2%A5)%88.%2Cum%82I%88o~%F7%FCL%18%EE%C1M%E09vvb%F9%ECn%EF%C8%5B%BB%24%80%1C%DD%99%E6V%C3%E4%E5%D2%AC%F87u%D3%D4%12%FD%10%E0%DD%F0%EF%C6w%E3j5zdu%EA%1D%804%5D%92%A7%9E%DCvj%1FU%B1%CE%E0%E7%023%DD%9D%8B%01%B4Wm%AF%D7%AFJ%D4%C6%D7%C1%F1%CDS%DFI.R%B6.v%A1%EF%CB%E9%97%1F%E5%8B%5BuoJ%A0B%C8%1D%9F%F5%FB6%D6%2B%3E%E2%C2%C6i%F2%3C%BB%D3%A5%BB%C7Z%7F%FCY%DD%3B%B2%1D%09%B8%FA%A7%07%9B%3D%81Y%EA%A3r%06%10vk%DB5%7D%E1%23%C1%FF%7B%C5%CA%1B%DE1-%7F%EC%09%ECpe%82HJ%DC%A1%2F%BBX%C9L%BB%5E%1F%AC%8C%B5%DC%9E%AC%96%2F%A9%02W%A6%BF%81%E15%1C%E2sS%D7%EB%C3%BB%C5%E0%9D%A3L%EC%CE(%F6'%BC%A1%0C!%CCk%B2Q%F1%91%C9%AD%FA%C4K%00%E5%93I%A7%3A%D9%25p%83%8A%D11%18%88%F1%CF'L%85%DA%8F%A1g%E7_%F2'2c%FC%7C%E0%3E%01%7F%2B%FAn%2C%13%08%BF%92xV%7C%C3zy%E2W%05%7CA%ED%5E%94%015%86%0D%CF%CDD%17-E%89%FFN%B4%11%5B%14%5Eg%F2F%9E%B9%D0R%2B%5E%DC%B2%C9%3B%B6'%0A%26%E9%12s%E5%60%7F%18aB%ECT%8A%8F%2F%86%BCLg%0E%E8s%B2%05%2F%DF%B4%1BC%04%97%94!%24%E3%11%1BZ%85%1C%7F_C%A7%E6%A6*%BAKf5u%E6%9F%A1%BD%8C%1F%3C%03%09%FAk3%17%1D%82E%B4%AF%16%F3%B8%06%A2%F5v%C8%84%F2%EE%C9f%26K%CB%A6%22%26K%AC%2CJ_a%F6%3F%DC%86%14Kn%F6%20%A6%FA%1Fc%CAy%EBp%20Wn%00%00%00%19fcTl%00%00%00%0E%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02_%95%7F%9A%00%00%09%C3fdAt%00%00%00%0Fx%9C%ED%9C%7Fp%14%E5%19%C7%9F%E46%B9%CBfw%2FB%D4%A0%81%DC%20%12u%A2%80%0D%15%DB(Grc%22Pr%D5%B4%8D%9DTO%E9%20T%2C%88%80Lma%01%81%83A%2F%F2c%FAcl%B3%A0V%FFp%9A%03%87%D6N3%C3%9B%842%09%04.%22%C5a%C6iVB%D0q%18%F3%13BB%F0%BAw%094%3Fv%F7y%F7%EE%DE%FC%95%EFL2%B7%FB%3E%EF%FB%D9%BDw%F7%7D%DE%F7%D9g%0F%60%B4%9Cc%F6%00t%E8%EC%8BK%2C%20%E1%D1%EA%A61%B2%A68%0FqB%13%D2%95%D04%0E%90C%AF%FA%983%C4%3C!%9F9%24U%81%0B%845%24I%05Nf%0D%D1%C6%C1%0B%CA8%406%AB%AC!%B6%CA%C6%EB%AC%19%20%84%BB%14%E6%108%B8%C2%1Bg%0B%F6%E2f%C4B%C8%DB%FD%20EC%A2%C9%B8%F0%8F%E3w%23%B59o%C5%06%9C!%BD%E0)0%2C%DC%0D%87%90S9%A0%96%7C%AA%A2%90%14%1Fl1%2C%F4BJ%A5im%E9%01X%C8%C9(%A4E%853%C4%A8p%258%CC%5Bp%B8!%9B%9F%86BB%1A%C7%10%B2%13%83p%B9%CD%03%F0%04%82%F8%E6%B5UD%9AkT*%3DUS%174%AD%2F%AC%E9%EE%23!%F3~K%CF%E9%CE%EFY%F0%B8Q%B1%AD3%E7*r%94p%BE%DB%B3M6%B5%A8~%13%0A%9E%DF%A9%1A%15o%BE%86!4%0D%808%DB%D4%E0NHw%B5%FE%02x%FD%FBI%BC%D2C%05%01%F3%AFk%00%EC%5EiU8%EC%D2-M%C9%D2%9Bk%8E%96%F1%5D6%A4%B2fN%06%C1%EF%D7%3F%94%967J)%20%8B1%83%DAl%0Db%A8%EA%B3%ABT%1C%B2%103%10%7Fn%06y%81%0B%10%94!mWP%1B%BB%0F%F6%19%B5%E4q%3Cm%3E%A8D%F5%FE%0FP%13!%03%16%0C%18%94%15%0By%DF%C7!%A9%3F%C6%DC%01%C0%FDP2%DD%A0%A8D%BA~%06o%40%CA%F1%A16%B5%A7oT%11%FD%A2b1%E7%D7h%7D%80%C0w%A8%09%7F%5Be%BB%A2_%F4K%08u%1B%F0%87k%0F%DE)%B0'%98%EA%D3%2F%F9%04%F8I%A8%03o%3A%99%B5%D7%DCB*%26%20L%E3%5D%86%06%B5n%84%E1%88%AC%18%CD%3B.%AD%A7'%08OJ%C63%A7j%0C%12~)g%83%1F9%8E%8E%FA%AB%A4%04f%19%0D%E8b%8E%82%40%02%FF%C9F%2C%80%EF%80%BD%E1%3E(%DCiP%9E%8A%0E%C3%97J%B1%C3%00%A1%1F%E0%8B%D3%C6%E5!%A3%FB%F4%96%CE%F7c%16%00%2F%99%17o%F2%E9%EF'%B7%3EQ%DC%89%98rd%DD%DD%9F_Qo~%0C%D3%DC%AE%A6%12%C2%F7%A9z%BB%A7TU%F8%FD%A7%A2%9F%DF%EE%7C%2B%5E%CA%81%B0Og%AF%C3g%0F%CF%98%1F%8E%F2%C5%B5%AB%A3%FB%C6D%5B%F4%A6%07F%91%19%BD%CB%2B9X7%C0a%01%1C%2B%A1(%3D%DB%10%993%D0%BE%DA%A0B%A2%20%01xo%00%F5%99%F1B%3C%10r%CFB%18qC%0A%FD%B7%9D%1C%DD%0B%09%EF%F8%BAp%BF%BD%8By%E4.%E9%AA%CD5g%99%87A%CB%C3%C4%3D%B7%E9%C3%AE.t.%1E'd%FB%15%5BI%23%3Ax%C6'%FBl%C2%C9%17%EEQU%96%10%C7%0D%E0*_%A9%7D%9A%E9%B9%F0%7D%90%DCtM%C8%A1%98_%C6.%E9v%A8%E7%A6%01%CD%9C%3F%0EU%D7dW)%D0%C0%16%C2%E7%FCm%12%5BBT%A9%14%BE%3Dn%B5%F4%8E%03%A4a%962%0E%94%CB%F8%A2bB%13%9A%D0%84%10%7D%BDs%1C%86%92%E5%7F%7D%8C%3D%C4%05%3B%983%04%2F%1Cf%0A%90%F6y%3C%85r%24R%CDP%17%BB%96o%99%EF%86v%EB5%8F%D1_%2C%DA%9A'%A9fY%D3%3C%EB%10%E1Qj%D3%7Cm%A5B%C4%22%C5%3A%04%DA%D0p%EBM%95f%A9%1C%81%A31%DD'%076R%1A%D6%9D%CB%D6%20%C9%EEX%20%D2%E6JH%CF%FF)~%80%9CRn'%C0%DF%88%05%02%E2R%92%A2%A6%60%0F%AE%B4)c%EE%03%0E%19%A4%FBc%82%80%B8n%03%C0Z%CCJz%B7%9B%F0%3E%0AC%1D%C0%09%FF%0E%8FG%5B%95%9D%C5%2C%AB%BA3%40p%01%D4Z%87%B4%F4x%FC%BB%9B.%95o%C1%BE%AEK%FDv%1F%08%DFi3%60%EB%90Z%15%C4%FD%C5%CA%BFk%B0%8E%AF%F2~I%00b%7B%C6%FB%D5%5Dp%F4Z%7D%86%F4g%CC%D0%EE%5D%AF%FD%A7y%2C%A4%A3s%99%9D%CB%BFG%C0%F1%5B%CC0-%F2%94%EF%C9%D8%20p%99T%BD%E8y%86%B4%E5!v%D1p%CD%7Fc%84%88%87%0B%40%DA%D3%F9%0C%96%16R%1Cc%FB%11%09%83%09R%0D%9E%DF!%86%99%A7%2C%B7%ED%D4%09%D4%C8%06%B6%9C%8E%ADQ%60g%24Dg%DF%60(J*%AB%A0%B05%DBO%01q%B8%8F%9F%C6m%E3%84%D8%09%DFJXC4%9F%C1%25%0Ab%D8%F1%BCW%AD%1E9%C6%C4%DC%F1%C6%92%F2'%DF%15%7BmZq%25%25%1F5%19%A73%24F!R%5B%E2%0F0%86%2C%04!%1B%EF%D48%D5%01%D2%7C%95%3D%C4%11%C8c%0D%99%0A%B5%ED%5B%8E%9A%3C%80J%84%B6C%81%F3b~%11%D3%E0%22%D8%5E%ACt%FE%10%60%3DS%88%D6%BC3%03X%E7%EA%B5%92%E4%20%60y7%F1JpEFH%C6%10%E8%E0%14m%12%C7%18%92%C1%3D%A8%8D.l!%82%CC%05%CA%B7%F6%B2%85%B4%AAI%DF%FAw%A5*L!%EFG%87%C7Q%EE1%C1J%CF%1B%07%88%E3%DE%B7%C6%E1L%06%9F%B4%B1%85%00%8C%C3%D75%01%89%05%C2%DA%01'%1E%22%AAz%90%A6%D3%09%85%24%13%1DH%5B~Q%15Me%CF%E8%B5%8C%AE%048%A8%EA%404%1F%BFI%BB'u%F8%23%24f%1F%C6LR%9AAj%5C%F2%23%9D%12%A7%17%A0%1D%AB%1E9D7%92%C9%19m%A6%FE%BD.%97%1ED%038e%0A%88%0B%5EGLR%7CP%20U%E9%A5lD!%14%13%2F%E1%06%1CGL%C4%01%DE%07N%BD%A0%8AS%19%04%A1%EA%85c%98%C9V%BB%0C%87%F4%0A%9C%8F%01%5D%FC%B7%AB%7C%26fb%DB%26knP%0F%12*%DFJ%95X%D1%11%E8T%11%13if%D6%0E%DD%243%A7%E4%DFEu3%CE%16%9ER0%9B%BA%C2.%A2%0B%01%8AaE%D0%FE%96%AC%FF%1AM%11%17f%B9u%F7SA%9C%DA%1DV%B8%DAA%F1(%5B%3F%E7%88%0E2'%A8%9D%8D%BD%0Ce%08r%9A%5E%EC%99%0A%C2-%BAC%FBo%C3%E7g%82%7C%E6%F9%87%C7ZQA%F8%81%CF%9E%8DDa%97%E0%90%DF%B7%7F46fM%E7OfHKU%F8%15%1CS1%88wqu%E5%D8%D4%13%3AH%B5g%C1C%92%0B%1C%3E%0C%E2%EE%98%2B%C7%0A%09%F4x%8A%8E%13%90%A6%0Em%1B%A5%5EI%19%FD%BB*b%84%EC%5B%8A%A5%5E%DDl%22%AF'-olB1%15%E4%11%EAx%D7%F6%5C%A1ol%86%1A%8D%8F%17%5D%D4%90%B6%EB%D0U%40F%14%B5i%A7~%04%F7%F1%8EJ%2B%91%BBM3F%A66%17%11%E0%EE%D6v%23-%D8%C8h%88Q%C7G%D4%A2%8C0%15%F3%B2%81%A3%F0%F1u%A3%23z%A6%D6%81%91%BE%D1%E1%CD%8FNQ1%1Fo)%E2-M%1A%05%91%2F%90(%C4%DC%C7%8B%96%9Em%F1%B7w%8Fx%1D%A7~%A3%5D%89%AC%E3%11%1F%2FdX%81D%9E%3B%0C%DB%10%17%1FnP%A2%EBx%F3JB%3C%2FU%A7%06%F9%19%24%B2%8EG%7C%FCAw%1C%10%ED%BA%EC%04%EE4%E6%E3%C57%E3%60D%20W%A3WWr%5C%D1esq%CD%E9S%A3%10%96%2B-%E1%F5%CD%F5%3E%D6%10%98S%B1%A5%3C%25%C8%16%22%E5%C1%94C%91%80%1AKH%9A%2F%FDF%A8%811%C4.%DB%BD%CC!%C92%A7%84%D6%B2%84%88%05%DA%90%95%04-%9Dr%C4_0%82%D4%3E%0B%CEw%EA6%DA6%C8%EC%82%05%7C%96%B6%C6%0B%87s%B5%E1%3E%C1%EB%F8!%A5%97%AD%84%B7%23c~%D3%A9%10q%AC%A3%5C%C7%5B%94%ED%9DU%EB%86%DE%18%E4%DC%8E%EB%B8%8F%8FE%C7%E0_%7DC%1F%C5~%3B%E5%3A%DE%AA%1A%00nen%BDrQ%A6%5B%C7%5B%D5%B9%C8%802%A4%2F%D7%C9t%EBxk%92%D6%96%D6%7C%EC%BE%B9%95%D6%AB%00%24%91DCZk%E6%05z%D5%5B%9B%D3%B3%01%8F%02XV%7DhD%8E%C4%C7%9A%8F%C7_%7C%B6%AA%B6Q%EF%C4%8A%BD%BB%12%CE%00a%F2%7D%EA%FEa%DB%0Ew%E2%19%90*%9F%9F%5C4l%3B%92%08%93pi%97%D2%DC%23%C3%B6%DF%60%C0%D0%86%5C%BB%3C%EC%0D%3D%09%7D%AD%EF%96%3E%FC%8B%05%C8%D1%AB%C3%5E%2COs%D3V%3C%FB%9B%AD%D4%10%7B%FE%9D%9C%EF%FF%9B%12%5Db%DD%17%8D%FE%02%90%5E%A6%A6%FC)Xk%F9%B7%20%0E%86%F3%3D%DA%CAy%1F%7D%0D%E9Q%97E%86-%8B%80%D0%ADJ%DB%E8%AB%A4eZ%5C%0B%08%99eA%E0%97e.%A0%BFH%40%FC%E3Jk%90%B3%1D%E2OT%D1u%B2G%B5R%0B%0B%BE%8E%14%9F%1B%84%D4J%98%07%F5S%ACP%92%E9.%A9%C1%F7%BF%85%7B%9B%E1%AB%E9%04%AA%09%FC%FD%8A%7F%115%24-%C7%E4%A7%1C%A4%9B%E9_%8E%0Fd%ED%FF%F9%87%15%E0%EF%20%DA%B5%AF%B9%D3o%CA%F4B%F11h%CDkC%0D%7D%CE%3F%A4u%E0L%02%D2%1A%12%D9nLL%FB%11%09%8F%C3g%97%A3.%E7%89%A2%C9%04Z%23K%0Bw%E2%9A%1F%D4%FE%20%A4%AF8%E1%D3%FA%7Ba%F3%1F%16E%BD%E6%A7%8F%246%2F%5Dz%F7%08%01%FB%CF%88%02P%A7B%DBs%25%1FH%DAW%F6%89%92H%06%3F%FF%E54%1F%EC%FDv%FE%8A%A6%13%DA%FC%2F%7D%F7%AB%5Bu%93%8C%A9%D2%A6J%0DR%AC(5%B6%C1%18~%B8%ED%9F%96%FB%80%C1%AF%C3%FD%0F%BA%CCn%86%20%12%A6%14%00%00%00%19fcTl%00%00%00%10%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%3D%D0I%5B%00%00%09%92fdAt%00%00%00%11x%9C%ED%9Cml%14%C7%19%C7%1F%DBk%DF%FA%3C%B7G%12J%A1q%8C%8B%5CJh%08%A6qy)5%BE%D8n%E2%26%10(%B4*%8D%D2r%A9S%02%91%8D%5DAS%A9%85zi%EC%E8HL%0C%09Q%F8%105g%E2H%E9%07%DE%83%C4%87H%EC%81%A1%94%5C%7D%84%B4%A1j*y%C1%18%DAH%15%B1%8D%DF%C0t%3B%7BN%EB%BB%DDY%E6%B9%97%B9%AA%92%FF%92-%EF%B3%CF%CCo%BD3%BB3%F3%CC%CC%02X%E5%B5Y%00%3Ec%D8R%92%08%88a%D5%00%C6)1%A5x%89%93%9A%D4%FFR%E4e%F1%0C%CF%B7%9B_%11%0E%91T%F2%BAp%C8I%80N%E1%10JxG8%84%FE'%1B%85C%AEk%CA2%E1%10y%C6%E9C%A9%E5%B0%B7%95%EF%D3q35Fhk%B3%CEu%CA%1A%C3dE%02%3B%1C%B2%9A%0BW%FD%DC%E4%FBn%60%20%BB%8F%3F%EBPt%B4Q~%80%9B%7CZ%13%82A%C6%40%BB%9F%7D%AA%14%609%2F%B9%FB%7B%BF%D1%10%90b%80_%40%98u%AA%0E%94%FBx%C9s_%EB%08%22%20%3EP%1E%F70olg%B0%B3%91%97%DC%1B9%AB%F2!%CA7%C2G%FD%DB%99%F5%F0%9D%01%87%FB%18%A3%88%F7%03%04%04%FEa%7C%F5%D5%C1%F3%8C%13%05%83%A3%3A7%F5%D1%EE0%06B%3B%5DC%1A%CB~%E9'%B7%F8%89%9B%23%1A%06B*%C3%3A%F3D%DB%89%1A%14%84%9D%DA%02%A9v%F0%9A%F56%02%D2%11%D1%10%0C%20%8F%06%D9%F6%A1%E6G%F8%A9%3F%F1%A2%20%EE%E5%B4%12%97%3Dn%87%8C%AC%ADF%24%97P%2Fa%D97%17r%FC%1Dv%C8%CD%9Ag0%C9%FD8H%FB%F9Z%D8c%B3%2Bc5%DB%11%C9%F3%FF%85%81%B8%7C%D2%C2%22%B0%DF%19%F7%ED%EA%08%229%19%C5%40%24%9F%D2T%B5%D5%EE*%7F%D6%F01%06%C2%1A%EF0%20%40%60%BB%FDm%EF)%3DQ%8AH%AE%18%AC%B7%85U%B2%8F%FE%CA%F63%CE%14%0C%23%92%83%B1%0Bs)f%1D%CCc%16%9F%C1%AE%9ED%8B%3D%9A%E9%C7%5C%8A)%F7T%CDnTJ%D8%CDI%E8%EEX%E7%95%C5X%08TM%B1%DBr%8B%BE%CF%F4%ED%24%F3%26%0E%8E%0C%E1%87%CE%E5%0C%DBA%F5gL%DF%10%F4%B4%19%F5%E3%7F_%EDSQ%DD%15S%1E%D6%E5%AC%FBt%88%E9%9C%7D%DE%BB%89%7CW%8F%FE%5D%F1%0A%A0!%B4%1E%DB5%18awc%E4%5D%17%00r%A2%95%CAE%2B%E0%1C%2C%24%12%B4%DB%C8%F0%5D%1A%D3%D9c%D0%AC%AF%AB%D1t%AB%00%D6%60!%5E%BF%DD%D6k%14%B2%9D%E5%E1%16%80%86%E8%05%AC%D6i%D1a!%11F%07%AB%CD%08%B2%9D%B3%DAv%D7%9D%194!%C4%7C%5COt!!.F%9F%C85%B0%C2%E1%8A%5C%85%15%FD%FB%17%D4t%81%AB%9F%A2%0E%0E%DBc3%23%8CdN%91%19v%3F7%A27%F0%028%89%84%A2X%BE%F4v%05%B9mn%EA%10%D7%83l%7BZ!%B00%13%90H%83%C5%20%A0%E0A%EE%CF%40%E4%CE%3D2%DF%18%14%92s%8C%B2%7D%E4%CB%AAhHd%E7%CAz%D1%0Cxk%DD%AF%853%A0m~P%3Cd%7BhD%17%CDP%CA%3CM%F7%0Af%5C%9C%FF%18x%FE(%96q%ED%C6o%C5%02LET%F1%0C%90%B4%0C%40H0%03%90I%FD%9F%2B%3F%13%90Kj%06%20%F9%B73%00%81E%99%80%5C%C0%8C%8DSU%BE%F8%20%3B%D5%FAL%40rUb%0C%EB%82!%CA7%AF%E8!Lh%23%25%F5%EC%85%7F%CE%15%CCP%5E%2B%018%23%18rx(r%00N%8Be%F4%0E%9F%CF%5DP-%B6o%A3%3C%AD%81%BB%9E9%13%90%3E%C9%F7%01bVa%5C%24%DC%05%7F%A9%0E%26%01%F1%D3_%9Bq%8C%0A%A3o%C3%E8%19F%20%89%0B1%A7-z%FC%18%D7%AC_%85O%1AAH%A2%B6%13%F3V%91i%18W%3Atl8%B1%0B0ab%AB%9E6'%F8z%1C%A2%0Eq%8A%C0%955%DE%D9%CD%A8%0B%B2%884o%A3E%BF%C3j%DEo%F7%ECV%16gK%CF%F4oJ%02%02J%05%23%10*%AD%D7l%B6%DC5%8D%D7%25%BF%3D%9C%8FR%FE%B0%3D%C3'YW3%B3%FF%A1%AB%C5%1F%EAIA%3Cw%0F%04-%26%E20U%D64u%2C%CF%9F%0C%83%AC%2B%FF%B3%19K%8A%95%EB%3C%C8v%CFs%81Yw%8D%12T%E8%DF%22e%DDt%1D%3A-Ql%09%E0%3D%9Bg%A7a%DC%A8%AB%02%FE%5C%9D%5D%3D%D1%E8_%DBSZ%AC1%B7%F5%AC%3D(%B8Z%23%23%87B%DAO%93%804%2C%D1%C1%7Ce%F8c%8D%9E%E6G%EC%9D%98%FC%EA%B01%E6%5E%F6%09%3Eo%2F%23P%A3%FE%F7%AC%F2%86%1E%E3%2B%25%16%D8%89%810l%13%A1%A8%93%FD%B1%CF%8ES%5C%2B%B5x%97%7B%FA%D82%8Eo%EA%90%C3%A7%1B%03%A2!J%A1W%ED%D6%D2%01%B9C%C1%BB%7C%11M~p%C27%E9%82%BF%E3%05h%11%0Dj%F5T%B2%E0%8B%40%8E%1A%3E%3BG%13K%01%D7%2Cc%ECcV%2C4%9D%92%0E%C1%0F%E1%92%26%18%A2%C11%D8%22%96%019%1At%13%D1%A3%C9n%08%87%BE%AE%0A%86%AC%EF-%AB%EC%D7%C52%0A%C6%96%02%24%D3n%24%A2%D0%BB%AB%00.kB%19%9E%2F%98q9Y%15%0A%F9h%95x%88%E7%1E%C8%09%02%E4%09%85%90!%F0%96%8B%8E%97%CA%F4-%1EY%FB%C2%B0P%08%95W%09%BC%24%B8%E0%C7%DB%BC%8C%40%84%87%97'!%93%90I%08%06%12%EE%C2AR%88%2Fy%7B%CB%AA%F6%60%20%D2%E6%E4W%3C%7Bi%1B%DF%A4%23%1C%03%04%19%C6bAV%99%8B%BF%11%8E%2B%A0%25y%08%05xU%BE%9F%FB%09%DAEK%09%82X%7B%E6%FD%25d%25%0F%09%8E%83x%CA%3E%A2%E7%24%0F1%DBx%C4%B2%07%E9%DC%D2S%C9Ch%1B%8FYX!i%9DCj%D2%10%DA%C6s%87%9D%60%AE%F1%3A%D6P%944%04%10c%5B%13%D22%9A%B7P(D%DA%04%EE%BE%A0%DC%AC%09%85%D4j%9EV%90w%AEBdx1YH%DEV3D%9C%B3%EB%25%8E%9FF%7F%DA%ACFE%C3A%DC%B7%3F%0A%02%7C%A8K%FA%1D%DD%3C%E6%B0%F0%05%AB%B5%97%3E%20%1A%A6%E0%D7%2B%1B%CD%1D4D%E5%B8%D1%1F%DBz%CD%9A%23%D1%06%8B%0F%E9~%FF%B4J%7C%00%9CHqH%07%5B%EC%9D%14I%3A%0Er%D80F%3Ai%0E%7F%FD%FC%D8a%E9%95%D4x%AD%DA%BA%14%93%F8%24%0D%05%F9%FB%02%DE%D2%AB%F1%2C%3C%B77%9E%B3Af%B8p%90%A3%D7y%1E%9Fg%D1%EC%07k%5C%FC%F0%A9%D7)%24%DC%C5%85%1C%C7%06%D5%A4F%08X%CE%DCO%EE%D1%A4ceUo%F1%B2h%C5B%DCcn%CB.%032%05%1At%E9%5E%DA%C6%F3%B2%A8%B3B%1C%0A%1E%94%F9%86e%91%16%AD%93%DD%20a%DA%F8%15%12%AF%E0%FF%A3%02%EB%A6%22R%0A%9D%E3%CF%89%CA%81%14s%CE%C7%C86%0FVD%1F%CF(%84%D7%C6'%B0%17%D9%E6z%A4r%05HA~%1Bo%3E%EBX%15%2BK%E2%0D%9E%E7h%A5%9BgNa%A5%0DB%7C%B2uq~%2B%85%B4%F1%DB%F8%04F%C7%C4w%A9%5D%B7C%BA%F8m%FC%E5%20%1A%02%BE%E7O%2C%8D%B7%BC%0C%90%7B%88%FFZy%03%CF%80y%03%AB%2B%B48K%60%FCV%60%3A%12XM-%CC-%B3%40%C8%8F%D2%0D%D9%A2%C9%7Dz%9C%A5%E5rm%BA!%B4%EC%FB%AA%B7%C5%1Ew%2C%89%BC%9B~%C8%D4%0D%3Bc%8F%23%A5%DE%40%DA!%92%1A%7F%DC%7D(%C7%84d%A58w%11%2F%B3%A1%8F%95%17%24%13%92%DE%D1%EFW%2C%90%9C%A0%B46%DD%90%7Cc%5E%BCAY%2C%97%A4%1B%02ak%BF%A9%E7%C0j%15%3B%8EOZd%8A%FCs%E48%3E%05%DD%92o!%DA%F8%145%C7%85%1D%C7%A7%A0QI%C5%8D%E3S%90r3%0A%C1%EC!K%5E%9E%99%15%14%92%A5%09%CA%9ED%F7%DCx%16%EC%2C%17%F8%11%82Ef%9FUi%A8%07%3A%8EOz%E8%CC%11)%26O%D0%FE%DE%97((%C0%1B%09%26%0F%F1%C1%EF%00%5E%15%BB%FC%92B%CE%C2%9F~%2C%94%01%EER8~%8C%BF%E3%3E5%B5%F7W%97%B0%16%F88%09%F1%C5%04%9B%3A%8D%C4%D6%A9%9E%1A%D0%13f%90i%0B%12%2B%F2%A1%83%C1%84!%A1%F5%AC%3D%93%F1%F2%3E%FC%B7%89%03-%CB%9F(CY%B4%5B'%25%9C%FF%E5b%5E_L%E5%93%8B%80T%F4%D5%25%00%E990%0A%ED%BFw%0C%F9%EC%8D%E2%CF%16%DC%9E%1Dc%9C%0D%A7%1F%08%EF%F3%E3!%8F%C9%C5%05%83%C7%7D%0Eg%DD%3F%88n%BD%0C%9F%DC%3D%3F%E6%9F%0DU%CE%7D%16%94D%A6%A2%0B%0A%B7%04%E68A%24%B8b.%2C%7B%FF%3B%9E%EC%98%05fJ%D8%9C%87%CEnyNGS%F6l%82%19N%90%2B%E3%BB%5Cw%14%83%7Bz%DC%AE%7C%DA%DFp%7F%8B%7C%1ADS%40y%CA%09rA%8B%8Ev%DF%A6%99%BD%19%B7%073%5B%83%BC%F2%84%86%C2y%FB%9D%20%EE%2F%BEh~%85%E1y%DDz%A2%19%E0%D2%E6z%25%81%C5%A4%11%E7%2B%3AS%D9OK%7C%83%D5%EC)%04x%B1%B1%BD%D61%9D%5D%1Dw%18%9CK5%B4z%2F%B6Zs%1AA)%DAg%18%DC%2FsL%E8Ix%C8%F1%8B%24%EDG%DE%5B%EE%B1%EDS%AE%8D.%D4%0D%7FP%A2%A3!%2B%07%3B%B69%9C%DA7%40%BE%D6%5Bi%7DV%F3%87%5BA%DA%10h%85k%85%8C%00%0Ek%E8%B1%D2a%89%15R%F6%0C%13%FCp%5B%C1%0E%F39%FFC%82%0D%88%80%AF%C3%FD%1B_%F5Z%E6%C3%146%83%00%00%00%19fcTl%00%00%00%12%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%13%80%80%DB%00%00%09~fdAt%00%00%00%13x%9C%ED%9C%7Fl%13%E7%19%C7%9F%24%17%FBl%BF%3E%93%852%AA%04%C8%986h%C5fh%23F%5BJ%9C%C4PF%19A%5B%B61%86%16WC%A8%D3h%13%A4l%AB%04%5D%5C%02%AD%C9%10%89(%7F%A0%0E%81%5BZ%A9R%D7%25%AD%26TU%A3%9C%13%08t%F3r%01%FA%C7%26*%E5%08%23%AB%26%A4%C4%24)-%24%BB%BD%8E%A1%F1%FD%F2%3Dw%E7%8B%D4-_%C9I%FC%DC%F3%DE%E7%EE%DE%F7%DE%E7%7D%9F%7B%2F%00J%05T%16%80%11%0D%9B-9%01%91%94%1A%C58%99%93%CDC%9C%D5%AC%FE%0F%F4%F7%B8%F3%0C%AE%ECG%CEC%BC%9B%0B%9D%87%B0q%AF%F3%10%17%3F%03%90b%DEe%A78%89%89%08%2F%96%B7U'%FE%AAr%84%97%E7%F9%D7%EC%40%5C%3B%ABE%C4%A1%94%AE%B6%03%E9%85%C2.%84%5B%7D%C4%0Ed%2B0Q%84%DB%FC%10~%977%FA%95%96r%60%3A%8C%CB%91%F0r4%C3%5D%BFLa%E1%26%A1%40%05V%CB%D3%8C%1F%86%5C%86%17D%B9%85%8C%C0%EB%88%82%C5G%F0%90W%C0%BDYa*%23%98%26%5C%94%C0C%0E%A6%8F%5C%A6%E1%96%D18%A2%60%40%A8%40%22Hr'x%2B%FCI1%CB%D6%3E%86%A8%11%0A%09lDB%F6%EE%BF%05%EF%CE%AD%92%F8%2C%5B%B0%16U40%80%84pk%12%3F%D82Wn%F3I%02%EEL%84%9D8%88%E7%F8%A3%DCQ%C5%3D%E1%92%8A%E2(%C8%E0A%1C%C4%5B%DB%A4%B2%15J%8C%B2%B9iC%DC%BF%C0A%B8R%B5m8%F8%C9%1CL%D9b%EFz%1C%04%5E%7D%5Ee%12v%1D%9CD%95umEB%12%C1G%94%A63m%0B%CAPeY%F5%A5%D6V7%E1%95%A6%F6%BE%D5%CF%A1%CA%BAPW5%ED%B8'%A9%82%F0uaTY%E6%0E%12%02%8D%D2(%2F%B7%9C%E0%13%25%EA%9A%D2P%D1%A7X%C8%8D7R%13r%8B%C0%93%FB%EBxMg*%DFt%DF%19x%18%0B%A1%01e%5C%FE%DDO%DB%DC7u%BD%D9%87%C4%2F%20%9Dx%88%FFkq%A5)q%5B%D7%DB%B5%23r%EFO%A1%0A%0F%19%DA%BA%40%89-%7DU%C7%B7%7D%F4pr%9E%94%E9%87%FCu%F7%A3%19%E7J%F8%7D%0A%D3%D5%09%BD~x%99%B7%AE%FFaq%9B%98%FE%5B%90D%2C%83%95%9E%81%A2%A8%DC%D6%D0%A6w%B9%26%A0%FB%81%DB%F0n%FATH%C9%09%2C%03Z%9E%A1%FE%F2h%EB%19m%D4%1B%87L%C0%BE%A1%C5%C0%A6%0F%EA%E2m%01%CB%F0N%1D%B3%7C%DC%C0%A4R%A2.%E4%25%B2%82w%A5%CF%E4%CCr4%84%99%3A%09!v%3C%CBF%82%BA%8D%EB%BBd%15W%D9%D1%B9%9B%1E%84%2F*%7C%0F%09%F1%06%D3%B1%83%0D%1F%CA6%5E%D4%EB%94%C8%CD%A0%24%95%3CQvj%EE%01%9E~%3B%A4%CE%CD%7C%A6QJ%2F33%A6%0D%F1%18%26p%CC%A4%A2%B4%7C%E9i%97T%F5o%D3)%917%08%FBt%5DnD%3E%20%9Ep%8B%F3%10%08(%EF%3F'*%5E%F8h%062w%3Fwd%A">
+<!-- FIXME: alt=" " is a workaround for bug 1505657 -->
+<img id="i" alt=" " src="data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%C8%00%00%00%C8%04%03%00%00%00_v%B3%AD%00%00%000PLTE%9D%0B%08%1F%20%1E231%3F%40%3EOQNefdnpm%7F%81~%97%99%96%9F%A1%9E%AE%B0%AD%CC%CE%CB%DE%E0%DD%FE%FF%FC%00%01%00%0F%11%0Di%C4%2B%A9%00%00%00%01tRNS%00%40%E6%D8%0f%00%00%00%01bKGD%00%88%05%1DH%00%00%00%10acTl%00%00%00%0B%00%00%00%00_v%B3%ADi%C4%2B%A9%0D%7Biv%00%00%09RIDATx%9C%ED%9C%7Dl%1Bg%1D%C7%7F%8E%ED8%CE%F9r%99x%1B*k3%95n%7Ft%0D%A1%A1%A4UI%14Q%10%8C%0D%16%A6%F1%07bJ%B32%40%1A%D2%9A%B5%EB%3A%A8%D6%1A1i%7FtL%E9%10%FFP%91%1A%A11%ED%0F2%B7i%95i%DE%1C%0B%26U%02%AD%98l%EAx%99%8A%9Bvi%DAd%97g%0C%8DVE9%9E%B7%7B%B3%EF.%CFs%F6y%DA%C8%CF9%FB%9E%97%BB%CF%3Do%DF%E7wO%7C%06%A8%B6%0E%C7%FEO%BF%C0%3E%2B5%B9%EA4'%A4%D8%D3%18%88%5Em%B3%8E%C4%EE%9CO%269%0B%BC%80%D6%A5%7C%9DE%10%B0%89%BD%D1CR%FF%8AG%0Fi%D1%9BP%12(%9Ch%02%04%3A%1A%04%09%3CM%B1!%90'%E0p%D0y%8A%8D%60(w%C0%9B%D7%03%D2%CF%EC%2F%D5%0FI%E2b%7C%2B%20%3D%B1%3CR%3F%24%8E%B7%23%F5%9FfeHC%EA%3D%C8%12%B8%BA~%135%24%DD%03%E5%AFF%0DQ7%C0rO%E8%A3%DBG%C5%F2%BD%0Ec%A1%19%B0%7B%BBX%BEc0%18%9A%A1%5C%FF%7DI%24_r%00%A4j%EB~%A7%3C%A4%86~%FB5%91%83~%B2S%0A2%F3%C0%0F%1D%A1D%EE%D5%1D%02%07)%0B%EB%E1%AA%04%E4qx%C5%11Jf%D5%B7%04%0E%8A%0D-%C0%F4%9D%E2%90%EDp%0EZ%07%CDP%BA%A7mA%E0%A0%F1%3Fu%822%F0ia%C8%1Dp(%F3%99%9C%19%CA%CC%1D%12%E9%C3%3B%D2r%83%E4%E7Ss%CFo%B4B%F1%E1%1F%8B%1Ct)5%24%C3P%EF%D37%5C%B3%83%FB%9E%12%99%D2%94%2B)%C11%CB%2Cq%B1w%5B%D9%0E%F6%AC%13%19%C8%CA%A2%24d%D1%19j%BFsN%A4%1E%14%24%07%99%D0%9D%C3%24%F9%E8%8D%5D%02%07%A9y%0C)%BC%2C%CAP%8D%D3%CB%B7%DB%CD%10%7Bv%7BE%E8%B8%D4w%40_%1A%14%84%A4%16%E0%AFw%CD%DEk%06%3B%A6%FAE%86%09%40%9B%0E%1BAPK!F%DAy*k%06%8BS%5D%97%C4%0E%9C%04%ED%85M%82%90Iw%B08U%E9%15%3C%12%E2%FF.%AF%9C%89%DA%14%C0%1F%0F8%20%85%C5%DD%A2%90%E7%07Es%9E%84_%9F%DF%60%07%CF%E4%173%A2%87%BE%2B%DC%8B%13%BB%B6%E6%1DU%D6%D2%BF%BE%E4%97%F5%25%D5%99t%02%DE%10%86%A8%FB%B6%FCj%AF3b%E6%B2O%CEV%FD%9B%D9%87%0Ffy%E8%95K%10%CF%89B%C4%ED%E0%93kwe%E3%5C%0F%D2%E7%F3pN%B4%DD%25l%1E%BAg!1%C2%02%1D%FD%00%BFh%3C%03%DEV%DE%99-'x%3B%A4%AE%00%049%F5am%B1u%EF%DA%B1%E9%2C%0F%3D%9E%86%91%08%20%0B%DAk%5B%F4Y%AB%1D%C6%23%40%00%7C%F9%A1%13%07%E6%BB%CCP%E6%3F%91%40%5E%D7%F5%BE%CB%D6%B8Mv%06%DF3%86%B4%17t%5D_%3A%96%E5!%AD%0F%A4fyA%D37%8D%8F%8E%FFm%9E7J%FB%8E%DA%B5%99J%FD%90K%AFI%2C%E0%84%86t%E0%B9%1D%94R%24'7%EDZ%C7%CAy%EA%B7%F7%05%12E%C3C%BC%09%0D%BFj%AB%B6j%0D4%03Id%C6y5y%84%06%12%0C%24%93%B9%E9%10%8DT%17%02%03%0C%03%13I%5D%E0%18%12%89%0C%92%8Ew4%BE%917D3%19%B2%10zq%F8%94%1A%D28%84%9D%1C%0C%8D7%80%C1_%F4ZH6%E9%E2%D8%10%00%C4%20%C8%8C%E7%10D%03l%8Ff%0C%09%D1%B4*%08%AE%3B%D6%00%B8%9A%0C%C3%A0%9B%05%09Y%5D%1A%3D%BD%0D%D1%CC%92%D8E%05%1B%02%B2e%E1%10%DC%9E%B4U%C85%1A%24%D6%B0!%3C%CE%0D%91%C2%F0%1AF%B4%86p%BB%02%EF%5Df%9B%D0%9Ee%D0%8D%D4%1D%85%90%FD0%7DY%F6%98%10%C3%1E%B4p%83L%C0J%F6%AElw%11%B7f%FC%1B%EB%FD5%EFF%8D%AC%D5%82%20!%D4%25Z%88F%86%BA%C1%86%B2%C6D_%A3C%90%C9%B2)%F9d%18%D2%D1jP9%23%8A%AF%89O%A9%9A%25!H%B3%F4%98%08%3BW%19%A6%F1Ts%90%C6%B5%07%D84%20U%12%AE%E5%F4hS%CB5%06A%A6%B6%819%178%B4KfJ5%5C%10*%FAD%D8%11BL%E5%5D%10%83H%3F%92%87%A0*%88y%F1%A4%FAL%95w%96%C2%9A%D0%24%20%06%B2%9B%00%98%E8%5B%CD%C0%E7%5C%ABMX%B3%85%80h%5C%CF%11%BFLD%3D%056%BF%D0%1D%C4.%C5%EC%5Df_%94r%D8%C2%88%B6%B4E'%C0%B6E7%93%ACZc%8Du%5B%AA%87d%DC%D0%DE%1B%19%04%8F%15%EE%86%D7%D7%3FL%99%A7%E2M%AFY%A3%0A%C5%05%07%19a%9C%DF*%E3%9Aj%EB%06%D1s%AEW4%1E5%10%E2%D6r%13B%D5%98%EExs%F4%0Bb%14%03%F9%40%0C%26%C7%B8%26%03%D4Pt%BDK%F3%830q%C4%82%D8%18%88%E6~%01%9FGp%83%B0%3B%3D%FF%DE%25%061e%DE%D9%BB%D8%9D%22%A2%FD%8BBxl%1D%25%E1%C5%09%25%FA%A2%0D_%17D%CE%9A%02%F9%F0Xuu!%9F%FDp%0A%A3yA%D0%07%15%C2%E4%9Dm%40%BD-%B2P%C3g*%EEq%D9%DE%BF%E1%9C%14%C4%98%1Au%0F%C1!%F4%60.%D4P%7F%D1%99%60y%9An%87R%0C%E2%12G%C7B%0D_%C1%B1%12%98%B3_%E5%E0%87%80%B0%5B%1E%06%A1%F3%A3%E5%CB%23%B6%8Ac%03%88%C7%1A%16%82%1C%25%01%2B%91O%C6U%A5%90%818d%9EM%81%F6%8D%17XUop%1F%DF%D9%1E%C2%10%C3p%F6.v%1C%5D%A8%01%E6N%B0%DE%85%98%F7o%B8z%97puy%94%ACA%99%02L%C8%8B%AB%13%22%D6%F3%FF%7F'%05%E9%95%D1P%90%95%D3%EB%BF%17k%0A%C4%1C%8B%88%DF%C2k%C4%8F%A7%1B%5B%BC1%EF%B1%EB2%8D%2B%3DX%8B%CE%86%F5%0Av%1E%E5%20%96%04%3A%97s%EC%AD%B1%10%B3%BA%22%858%A7%26'%A4~%B3%17%CA%18%C4p%BD%04%20g%F5%AF%0B%40%2C%97%9D%2F%D6%BBz%17h%2B%F5%AE%BDpJ%A40Uf%FF'C%C8%AEC%98%C7J%24!%15h%ED%8C%1Cr%13%B4W%E4!%92%F6%BDr%BC'r%C8%99O%0C%0FE%0Ei%BF%B0%24%F2%DD%EB%FALYX%FC%C6H%E4%90%8BC%13b_%5D%0Dk*%FE%5B%CA%17%A3%AD%AF%C4%85%3C%5C%80%89%EEH%FF%A9%14%FF%E5%BB%E5%05%18%9E%0C1%1C%C5-14%BD%06%D4ee%3EJH%1A)7%40%EB%5B%B03J%88%BA%003%A3%E3%A3P%1C%8B%12%F2N%EF%E6%F7.%03%B4t%F1%88(%BEzu%9F%CCC%93am%DDp%B9%3DGv%A2%AC%AEO6%E3%EBpG%9A%019S%FD%80Y%14%0D%1F%FBn%13%1A%3E%CC%F4.m%99%2BM%80%C0%96f%40%8A%A5%26%40%E2%D1%3B%11%003%A2%0Fi%D4c%0F5%81%01%DB%9A%01%F9%F0%7Fcd%D5%3E%80%F6%CC%A9%B1%18%D0_%7B%88n%DESo%82%DBN%12H%E1eYH%06r%829%D3%230%F5m%FCyq%FD%E6%A7%24!%007%0B%8E%CEd%0E%E2X%F6T%3C%1F%3D(%0D%99%F8%AFX%3E%7C%5B%FEg%7C%3D%A9%0A%C09I%D5%98%06%5DP%95%139%20%B5%15%C7%90%8EQ9%C8fxR0gzP!%EEA%82%40%B2r%90%BE%C0TW%B5%7Cq%80%04%DB%B0%E7%D9%91%93%83%7C%3F(Quy6%CA%F1%DE%DE%CF%1F(%DC%06p%7C%AE%2C%059%1E%94X%F5Tp%9C%BE%17%BF%B2%E7%ED%3F%C8%3C%5BM%0E%1C%018%FD%A8%F7%95%25%DD%0D%DCB%DF%D5%FD%3F%C2%D7%B6%D1%2B%BF%9F%A9%F0%B1%F2%D9%8F%3F%5C%EB%F1%3D%87%B7%98%BB%AB%C6%1D%FB%87e%20%00g%AF%DER%F6x%B6%ED%9F%25x%E3%A0%BB%80%F1%9AL%C2%A6%90%DF%A3%F8TMtr%0C%EE%D9%D5%D5(%C8%F4Q%F2%94q-%BBS%E9T%DD%0FE%86%5E%DC%CC%C0%1A%FCn%3F%F3n%DB%B6%B6Q%F8%9C%2B%26%B4%C2%B7%02i%F3X%B66e%FA%F4(%B8%1E%F6%0C_%5D1z%EF%E8%E5%1F%A7o%1D%82%FB%DD%90%B0%DE%D44%7D%FF%92W%D2%D3%F3%2F%5EsE%C4%7F%F7%C4c%A1%20%CF%90%B7%CC%7C%C1%23IY%BB4%E2%8AH%AD%EB%DB%E7u%8E%A9%FD%3F%0B%86%3CBO%A7%EB%9E5%D1%EF%0Ef%0Aw%7B%3E%F5%DAW%B8'%B0%22'u%D8%EA%2Fv%0FTG%A4%0Fz%9D%AD%07%5E%AA%04A%D6%FF%03%F6%F8OZ%8FTG%24%1E%2Cyd%EB%F7%1Ag%0E%23%BF%0F%B0%D57%F5%E9%EA%88%9D%7B%BC%B2%1D%3F%BC3%87%3FR~7%8Ad)%F2%07%BE%90bUM%26%E7o%F7%CA%96%B9%FB%3C%F98r%D2%A7e%F4%1C%A8%FE%0F%FE%9E%CB%B9%C3%C3%A3%DE%F7%E73K%25%DC%7B%E6%8E%FA%2Ci%DF2%00%9F%F5%BF%87%8C%8D%B4%3B%2F%EE%E4u%C5%F34jw%1F%1E%D1%A9%8Ft%FB%2C%D1%1E*%C3%A4%7F%EFJl%DA%B0%DBNM%CD%96%DA%3C%2Fh%E6%BD%03%B8%84'%F2%99%81%C7%DE%F4J%FF%CB%10(%83%BE%90%D4%F9%7CK%D6%0AM%AC%81%96%8F%96js%FD%DD8z%F5%C6%C2%A99%DC%86K%9E%3F%13%82%FB%5E%CD%02%8E%FD%B5)%E52hlYl%A0%26%97%94%E1%CEQuu%B6%A2%AB%CBc%C7XuU%7CK%CB%EC%D9%15%D2k%CC9ml%E7%8FQ%AF%04Y%C1%FE%07o%F8A%AA-%A1%E6%92%00%00%00%19fcTl%00%00%00%00%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%94'%03%1A%00%00%00%07tIME%07%D7%03%10%13'06*4%98%00%00%09%FAfdAt%00%00%00%01x%9C%ED%9C%7Fl%13%E7%19%C7%1F%9C%B3%7D%B1%CF%17%CARu%A0%8C%98%B6%ACe%A2%FC%A82Z%AD%40L%E3B%60%2Cf%1B%9DhG%87)%EA4%8D%AC%09P%B6I%9D%C6%A5%FCJiJ%A2%89J%FC%01%E5%A0%D34ihN%A7%89U%FBc9%13%83%C2f%E2%AC%B4%1A%D3%D8r%10RX%D7.8%09%E4%97%C3%ED%CE%B1%E3_w%E7%E7%3D%E7%22M%CAW%89%7D%EF%FB%3E%EF%FBy%7D%AF%EF%7D%DF%7B%EE%7D%0D%90%AD%92%B4%E3c%DF%98x%BF%93cU%A0%D2!%11%CF%D4%40%A4l%0D%A4%25V%B6j%18%91I%B7%02%F6%A8P%E0G%40%A8%ED%80%F9%10%FA%0B%94%F9%90%22i%1A%3E%09%84%DB%A7%01%02%25S%04%D1-%262%25%90%E3pB%AF%9C%C8T0%98%AD%F0y%99NzwcW%E1%10%9B%00%F0%7D%9Dtky%7D%E1%10J%FE%3FSx1%F9!Sr%DE%F5d%15%00~o6%C4%E1%01%F1%05%B3!%EC%0A(%F7%18%CE%ED%E4pv%BD%C0%1Bf%C0%AE%8D8%BB%D3%B0%C90%83)%BB%82%BA%8Al%3E%F0%90%94%BBWH%0B%D0%FE%3F%7C%17%93%E9%17%DB%89%20%3D%AF%FF%2C-dm%FD%D7fD%26%26V%01s%09%20%EF%C0%C7i!%5B%0B%7B%0F%91%C9%E2%8FA%F0%25%3Cd%23%F4%81%7D%B2%11%1D%9E%E2%18%22S%E0%9A%1B%18%DFW%D1%90%AD%D0%E0Z%DE%9A%0C%B9%86%1A8D%A6%CD%F2%C5H%A2_v%0C%BD%BFr2D%D5%BD%85%C94L%FBI%18%ECni%C5%BCT%F0%D0)%01%91%89%19%A39%12%88%F5%AEw%83%98%0Az%16%F0%18%C88!d%3C%3D%E4%7Ci%C8%8F%81%CC%26%83%B4I%E9%97%89%ED%CDE%CB%10%99XA%86%84%3B%B1%0C%F6%81%AB%E5%2F%0A%93A%CB%07%1Bq%F3p%BA%16%A4(%B6%F7%A2c%F0%EFo%0E%FC(%19%2C%E9%A8%C1%5C%26%00%C5%12%AC%04d_%0A%16%5E~%E9hI%06%23%1D%CB%86q%19C0%EB%D2j%24%24%94%19%8Ct%DC%F1%22s%02%F5%A0%88%B4%EC%00%F8GS%1A%24%3C%BE%0B%0By%1F%3D%A0%5C%80%DF%F5%AFH%05%BB%85q%176k)%87%B5%B4%EEY%2F%A4%9D%B2%A2%9A%0A%CD1%EB2%9B%9E%D4%0E%B7%D1%10%F6%D0%DA%DF%1EH%8F%E8%19%D5%B0%B4K%2F%B7%1ClN~E%3E%1E%06%AAU%C3RE%CC%B6%91%8Cp%1D%AFn%D7%7Cr%E9%9E%16%CA%3F%11p%F4%0B%D0'%E2!%CA%A5%92%AEnN%D5%8A%1D%81%CA%01%B0%26f%B8%255%00%BF%22%60%00%9Dy%8D%2FW%3F%0B%CC%7Df%CE%80hM%D4%80%1E%03%D0%9B%D4%E7%C86%3B%3D%E4%A8%10%D4!%E3%F6%03K%F9%60%B2M%DEq%00%D1%B4%3D%E8I%0FY%02%EA%1066%EB%E6Zi%40L%86%03%24%08%B0%0FnI%2F%B6M%EBF%EC%3Bo%B47%8DLv%D1%AE%2F%12A%EA%3C%19%C1%DDZ7%04%BD%92T%3D%3Ay%DD%DA%DC%FA%F7%8C%99r%0C%8B%19a%AF%16%E4%92%24I%D1%D3%C96%99U%0D~%3C%C4%16%F5fT%E9%91%C8QU%BBbiu%80%0B%7C%3A%92%A8%92ss%AEoF%AD%FF%D6%F2%CCDU!%F4%F0%CD%7C%0E%9C%92%DC(%0DWT8%D4%A7%1A%EF%1C%96%CB%60%80%D1%99%8E%E3!%EA%B6%B2%E6i%C4O)D3%DETHA%0D%3F%A8%01%A1%08%3Cw3%9A%D1%8Cf4%A3%2C9%1B%09%26%C8%86!%DER%D1%7C%0A%04%B9i%80%D8%3D%D3%00%A1%DD%26%03%AE%5DZ%07%1F%1AwM%A2%C4%94zO%09%DB%04s!%96z%B0%BC%FA%A0%B9%0C%F9%D6%19l%D5%F3a%0A%9Ei%E8H%BE%E9%B0%97%B7%C2%9A%96%FC%A6%C6UR%0F%1F%0E%C9S-%A4%E3%C4%98%1C%83%87%97%0B%00%C3%CBE3)%17%7C%FDr%83%BC%10!%FF%16%B3%AF-F%DB%B6y%FD%F2%AD%B7%7D%24%AFa%B6%ECo%7F%0Bm%DB%F07%B9%FC%EB%FF%5Dpm3Y%E3%3B%7F%0D%01%1Ek%FC44%D7%82%7DYd%CD%A0%88'%1C%F0z%2Bc%40qHs%D7%7D%F9%AE%AF%C2%5B%E6(%F7%E3%190%B6M%AA%1D%03%3B%16R%2C%B7%F8%ED%A5%D1!%F8%8C%E4%82%F4%F5%BF%0D%83%C2u%01i%5E4%D1%12%01%A2%06q%CE%A9%07%B8W%8Ey%0C%11W%F7Dm%AC8_iB%96%A62%0E%C6%F0%F6%FB%26%DE%98%BB%24%90%12%08%B8a%1D%DE%FE%91%C4%7B%A5H%00)%E2%B7%FB%A1%01m%CE%0C%25%0E%EAH%A6%2C%CC%C2G%1F%96%AA%FCXs%F6d%E2%A0%99%23%80%C0%8D%C0%CE%F6W%7D%D5%24Y%14%B5%11A%E0e%A8%13%5CaRH%84%0C%F25%03%9D%1D)%84%99%7FZ0%1DB%BD%B5%CA%00C%07%C2%AE%C9%7DRq*%C4%1B%81%04j%B5R%EC%AD%B6%9C%B8%3A%A9T0%00i%93%BE%A4%91R%222%9Ff%C7%FD%FD%DD%E3%22%BE%EC%12%15G%0D%97i%12%01%B8%19%3F%A0Tl%F5%1C%3B)H%F2%80I%C5e%B9%A2%FA%00%0E%02%B3%CC%5C%7F%17%C5%7DR%E6%AC%AC7%17%C2H%2B%FE%D9%5C%ABS%D8T%40%AC%D1%CA%E8%CF%F5%0A%CB%0F%C9%DF%F0E%AB%98%CB%F1%03%C3%0D%8FP7%99%F7%DD%98%827%F13E%C3%0AA%F3%D7M%87%5C%01W%83%A9w%16%8A%A6aQ%A1%3C%C9%22%98%FB%18S%F8%CF%C30%CA%9B%CB%E8%ADx6%BA%F2%CENS%19%EC3%E0%DA10%FB%03S!%B4%3C%1B%BF%E1%F3%FF%D4D%82%DCc%08%F2%DBa%C1%DC%8BQY%E3I%BB%8B%3D%E6Bx%00%DB%9Dv%D1%5C%88%3C%F1%09%C5%B0%2B%1E%8CB%22%5B%F6%CF%8F%95%A2V%8F%19%87%B0%8DG%1Cf%3F%DCQ%C6%3C%B2u%3B3%90%19%C8%0C%E4%FF%19%12%EE4%1F%D2%5BQu%1C%01%B9%25%7D%AF%00%C83%00%BB%10%90%03p%B1%00%882%C6%23%20e%86g%80%891%9EB%40%EE%80%DDm%0C%02%133T%0A1%0F%5E%02N%E3%BB%95(%1E7%15%FE%B1Hy%8CC%9E%C0m%18%E9~%BC%CEo%1C%D2%BCe%FF%00%02%E2%1C%8C%A2%9D%9E%99%A2G%80%EAl%3C%829%5DLl%7C%9B%B1%1D%1F%3B%7B'%1A%1E%03%B9%EBo%23r%C7%26%E5%E4%E8%16%14%84%95%FF%A2B%C4%D0%F9%B2%8A%EC%12%14%C4%3A(%C0%20%B4U%E6%B3S%13%05%CC%7C%14%84%FAM%A9%18%83%BA%90%DB%00%C4%D6U%C4%E1%3E%89%3F%B8%18%D8r%C6%88S%92%AD%BC%87kx%C7l%E6a%B0%DF%83%ED%06%20%E0%9C%8F%83%B01%E8%E1%02%1CDx%03%90%9EE%13%90%1F46%EAC%E6x%AB%1E%1A%05(J.SD-%BDJ%E8%F4%93%22%0A%B2%3B%AB%C8%5C%0B%1D7%D2%B1%E7%9B%02%F5%F9O%17%B3%A0Nt%C6%1D%FD%BC%96%89%0E%24%D4.Uq%E1%CE%7C%90%E0W%0C9%D5%12%BA%02%9F%DC%DE%5BQu%2C%0Fd%EB%99B%20%96.%D7%C21%80%7Dy%20%7Cw%F6RO%92%86w%3E%06%ED%CA%18%9F%EF%C1%8A%E5%B5%7C%0D%AF%A7%F5%9B(%0E1%C6%170%BC%CB%3AW%AB%ACg%CE%3B%C6%BB%0A%F2%22Y%8E%2B%B3%C7%FC%E3%C9%DAB%20t5%8D%1A%E3%23%85%ACKp%C5h%1Ff%8CO.w7%24%FB%E3%F4Q%CC%18%DFS%88%CB%A2%3D%84k%937%0A%60%B8V%1D%C2A6%14%00%B1%09%1B%14%88%25o%B3%E6%AD%85%8E%FA%3AG%2Fr%08w%7FA%FAH%EE%22%FCfC%9C%7C%FC)%87%B9%10%BAe%1A%20v%C1l%08s%19%A8.%B3!%E7.%F2%160%19%C2.%81U%17%14H%B8%93%14%E2%02%EC%F2%01G%3Dt%FCP~%BF%5BQu%8A%10%02%F0%A4%80%B3%B3%B5%02%25w%7B%EC%D8%E4J%0D%02%B5i%3D%E0%CD%92%DCa%FDU%98%D8%15%D4%87%ACWRA%90%90%BD%B2%B5%15%94%B3E)%0D%CF%91A%AA%E0d~%A3%B8%1C%9B%18%B7%C2R%20%84%CF%B3%F4Wg%08%E9%81o%FB%94%601%2FC%08%97%C7%FED%2F%91u%A7%87%98%F3%5E%EF%BA%A6%F0*%80%F3C%22%11%E4%BC%5Eb%D6%AE%60*%FE%1A%D9%B2%FF%FEG%24%7B%AB%95%8C%F2%2C%FD%EA%9B%EA5%B3q%19%C1%A2%F8%2B%DBxD%AE%DBJ%15sM%B1%F0e%F1%D6c%07%DD9%09%7F%94%FF-BV%85R%3AA%02%01%B85%F7)Qeo%DB%F5.%B8%DD%2CjB%08%C5(%BFG%F1DN%B4%8D%87W%F6d%EE%EB-%00%12%3C%AB%EC2%CEe%BB%197%9B%B9)r%96Q%84%0B%94%E7l%A9%3D%EF)m(%E6%E0%B9%8C%18%C3%3D%BC%1D%DC%F2%ABE%E5%12%0E%5E%E5%20c%B3%A7%F1%D3e%89%DF%3B%AA%CD%8F%1DO%FBao%26D0%08%09%C6_%9FWKzo%E4%2F%F32%22%A8%3F%1DW%DF%2B%97O%E7%94%17%D7%88%DA%DA%2Ffi4%D3%2BF%2F%A8%3E%A4VFG%E3%BB%FA%90%C3%F1%E2%E2%8E%D8%5C%D5d%06%5D%E1%1D%AA%BB%5E%AB%C3%AF%A8fO*%24%C1z%B5%7C%13z%3D%3B%C2%D1%ACV%9A%07.%EBzg%2B%3E%83%FD%DA%83%D6%E1%EC%08%EB%3E%B5%A9v%8D%DAu%96%26%E5%F7%01%D6k%A6%BE%97%1D%B1%7D%BF%9A%D9%F9%13%DB%95%01%86%D6%BAQT%5C%91%DA%8F%D6%23bf%D86%F2%A2%9A%99kG%BF%F2v%E6%82%A0%5E%8C%D4%0A%AC%F6%C6%DF%BE%AC%11%B0%8Es%AB%DA%F5D%BB%945%9Ag%3D%EA%C5%3C%E5%83g%FD%9A%10K%BD3%BDr%17%CA%18%D5b%D8%CAj%5E%3E%5B%8FVj%B8h%1BD%08%89%9A%10%EB%EA%15%BBR%A9%F4%40W%B1j%85z%1Ejr%CB%B7%93%82%CBw%F4s%B5%F4%1B~%60%B4%17%9D%D3%FDBQ%AAWk%5B%0CE%0BU%BE%5D%FFy%E0%EC%DCE%E1%8BCr%1BFU%7F%26D%FE%EE%E9%2C%9BbFa%16%1F%3F%F2i%2C%B1BJ%FErd%D5.%D5%A3%B3%E5%FCi1~%94%EFQ%08%F1%0A%93%F4accb!W%81%BF%0E%F7%3FB%09%85%E9%1Cj%D9V%00%00%00%19fcTl%00%00%00%02%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%BAw%CA%9A%00%00%0A%13fdAt%00%00%00%03x%9C%ED%9Cml%14%C7%19%C7%1F%EE%D6%F7%BA%BBg%A5%14%C2K%B0!%B4%B4%89%83%1D%C5%16%B4%25p%0EN!%C1%C1(%15%C1m%1A%7C%A5m%40%0D%89%1D%88H%3E%B4b%C1%07v%89%5B%13%8A%E0K%80%B3jW%FD%80bS%C0%FD%12%D5k%03%09%A9%AE%9C%23%DA%A6%A9%D2%B0%60%14%91%C8*%18%1B%02%B6%F1v%F6%DE%7C%B7w%B3%FB%EC%9E%D7%AD*%FF%A5%BB%9D%9Byv%7F%BB%3B%3B%2F%CF%EC%CC%01%A8%E5K%86%5CB%22t%23%C3*G%A5%40%02%13%05%91%D5%1AL%26y%FDT%23c%D2%E2sc9%5E%00J%0FM%06%248%19%90%CB%22%17%7C%DAj%88%7Bqg%F8%98%D5%10x%F2%19%B8.Y%0D%E9%0B%8A%1B%ACf%00%F0%8B%16%5B%0F%81Z%D1z%06%7B%D3z%06%7CX%3BQG%E2%7F%22%D0RJ%7D%94%14%C3r%15%8FPR%F2%96G%26%0A%D2%FD%FE%5DJJm%E5)%AD%1D%CF%8Bx%C8%1F%A1%86b%7D%B0%E0%EB%1A%FBy%1E%5D%8B%874%C2%95u%94%24%F6%9B%1A%FB%F9%FA%9F3%02q%E6S%92%F8%7B%AA%88%FE%0BG%92%E1%AB%60%13%D1%90Np%15R%92%3C%25%AA%88%0D%DB%9B%85D%F8lJ%03%AD%AB%1E%F1%C4~J%12%A3N%A8%04G%B2%C1%BF%08N%DAm%CE%D4N%99z%E7%BB%25UD%1B%B0I%88%EDxw%08%CBp%0C%88%D4%B4%D5%19%C6K%EB%13g%CF5L_%85e%40%F3p%1D-%C9%3D%AA%8A%60W%0C%7C_%F2T%C6x%E5%F8%9B%C5%CD%CC%F7%D3%D2%9C%EA%8Bl%3F%B0)%E4)%0ED%C3%D3n%0Bh%88%7B%8B%9F%5E%A6%3EN%87%B0%A3%D7%8F%2F%5Cp4%F6%23%B2%10%0FaN%D5%ED%C3%DA%BA%96w%F5%F6'%B8%ED%15%06%20g%EB%DE%C3%DA%B2%C5%0B%C6%7Flz%CD%00%A4%CD%3FM%C2Sf%25%C3%8F%06%03h%88%AB%2C%3F%2F%84%B6~*%19%E2%E5%06%3Fz7%A8%1A%C9%A8%3C%E8%AAL%86X%B9%9AV%E3)%A9K%1B%D2%BA%20%9F%17%ACy%00%0D!%0Fb%7F%2C%E4%1E%A8T%D7%9E)%3A%D3%0Bei%11%C7B%7B%D1%90J%F8%2C%EE%090O.%1E%A6%DB%FD%0E%60wZ%84k%EEU4d%87%EB%AB%BB%E2%90g%EE%D0%CF%ED%DC%80%04%DB%D3%A3%9E%08%A1!%EE%07%3F%8D7%96%CE%B1M%7F%A1Z%C9%F3E%A7%AAJ%DA6%D4%8B%858%03%8Ex%06%F2G%18%EA%ED%3A%F6m%9B%3C%24%A6%C7%ED93%17%0B%E1%FD%5D%1D%890'%0B%D9%8D%B8%19%A0%BE%0E%C5%D9%D9%84%85%C0%E1%94%EA%FDG%94%A7%D2%B1%18%BCC%EA%C8%0Dp%85rN%99%B2%0D%04%92%E1%AE%17)6%A4%ED(8%9E%1E%C7%CF%06%8FF%B9J%97%E7%FE_%25%F7%7B%EC%20%05%12%20%F5%8F%9C%9E%CF%EEy%00%F8%E2X%94%0C1sfRN%E4fQ%D5%80%AA%AB%DE-%00%FC%0C%0D%19%2F%1C%5D%7B2r7%AE6%F9%8D%DA4%EF%9D%ED%1C%94%94%BE%17V%E3%BD%E3%9A.%3F%CD%E8%87'%E4gS%7F%17%CB%1B%C1%08%C4%96%7C%84%CB%BBB4%23%AF%BC%7BSG%CAo%B9I%F9%DE%FB%5BjoB%A5%BC%ADR%3C4%BDV%A2%19%D9n%AE%9A%99%DA%CD%A8%8A%9E%CE%EE%E7%91%0Cp%25%8A%20%2F%D3%FBR%5C%D5%CC%3B)%05%3Cc%B4%E5N%96%7Dh%233%19%25..Fo%00'%9BoE%1B%8A%A2%F9a%BA%FE%D9%14D%2B%FE%BF%93%F1S%9A%D2%94%A64%A5)%E5%AA%9E%8Awr%D9%9Do%C2X5%3F1(%E6%00%E9%3B%89%F1%D8%FA%E1%04%BE%7B%9F%A9%8D%9C%88%B2%F3%DEV%BE%3D!3%0C%B2%D7K8%CB*%E5%CBv%DB%0C%24O%84%3D8%CBf%91%7C%F9%0AD%13%10F%C4%BDj%F3%1E%8D%08dc%0B%FAM%40%1C%FBa3%C2%8C%DD%5E%DE%A3%F4%F8%99%26%9A%0F%A5%A1%FE%F3%0Fx%E7!%ECZ%BF%F8%F8%2B~P%DE%FAj%8D%D1g%D7%DF%0Bd%0D_%22EkH%C6%2B%10%B6%B0E2%C8p%DD%16%23%EB%2F%60%2C_!%19%AF%40%A0%E8r%C8%20%E4-%11J%BBQ%96%D7D%A8%89%BAu%87%9C%85%06!_%03%CF(%D3%A1oG%BC%B0%C7V%16oU%02%7D%DCp%D8%18%E4%1B%60%F7%BBq%A3%D1l%B8%BFf%E6%F1p%B8%FD%E5bT%26%8E%AB6t)%C4j%0C%E5%A5%C9%FB%CE%01%D2%D9%9F~h%FA%CB%86%18%E0%1Ai%97%E0~%AC%B1%00%5C%98%DC*%03%2Fyb%FA%D7%1E%F5%88%A0%06%24~_%0D%3F%5Ep0%0C%97E%24%C4%1F%DB%BA%D1%E3F%09%D9%E5%3A%2F%EA%F1%22%F5u%DC%3F%E4%D1%83y%09%B1%B4%81%BC%2C%A6%89%D9%17o%18%85%40%15%F2%3AHQIT%8D%7F5%0C%89%88h%D3%C4%10%A9%DD0%E4z%00m%9Axv%1D%A2QH%3B~%9E%CB%B1x%8F%C3m%18%B2%9E%F6%9E%3AS%97%84%D8%96%0D%19dp%23%F8%F9%14v%7F%1C%22%18%840%25%BFA%DB%26*y%EEM%D1%18%E4-%F1%92%84%B5u%C5K%23%2B%DF4Fi%BEyr%8B%80%B4%F5e%19%A8%A1%ED%CBd%B1%D5%1A%D8%19%87d%89C%0EEqB%F6%F8%09%85%E8%C6%FFoB%3E%C9%09%82%CBxvh%E3%2F~y%D6l%C6%23E%1A%C1%D2%83%E2%04%1D%8C%A6%C3%00%AB%B5%A6%82L%88%D6%00_%80%1D%DE7%A8q%9F%B0%12v%15i%18%E6%A2E%C9P%B0%FCK%C9%22%C8%C5%C7%13!%FB%BB%E8w%93%86%F5j(%1C%F3%0F%AA-C%90%E2q_%E9Je%C2%8C%13%FFv%DD%B8%F8%EF%00%EC%00C%3D%13%E3Rz%B1W%08%60%A9%85%8C%E8%3C(%D2'%7F%BF%D0J%88%2F%06%A9Aw%16MAB%A4G%16%80z%AB%0Ab%0CB%0AJ%E4.T%A3%A7%BA%98%82D%AA%EB%07%E7%FFi%EE%DF%2C%85%F0%8D%FB%98%0F%A6%E7%7F%D7R%08(%035%C1%86%5C%86%C5%90%10h%11%AD%87x%F0%5Dk%B3%10%1F%1C%0BM%02%A4%FC%05%EB!V%BF%3A%F4%01%A2W5%05%89%8A%25%99!N%C2%950b%F8%82%F5%90%D3%A5%2B%AD%5D%99%C0%EF%07f%0E%C0N%84)%5B%F1s%93%903%3F%00%86%B4%F1%D7E%7DS%DB%DB%A7i%D3%83u%B4%CC!2%02%C9xA%DF%D4%0Ep%D4%14%C3%13%80%E5y%0A%04q%8E%8C2%B5%D8%8CH%07%A2RYV%A5t%26%F4d3%FB%A4%BB%05X%ECz%24u%CA%92%C6%09%05%E0%B2)%08%B7%CE%1DpUU%D7cjGn%A8%A1L%DF*%9B%DA%07E%D7%AF%1B%F7a%EE%03%FB%D4%AEW%CDu%FB%D9%92%E8R7%14%24%FF%E4%B5%80)%88c%1D%0E%C2%92%CF%EC%22%97%89w0D%BE%19%BD(%88o%19%40M%C8%85%9F%F7%98%AA%C8%BE%19%9D%18%88%A3%ED%15%E8%07%FB%7B%82%19%C8%89u_%EC%F5%23%20%5C%E19%11%A0%95%C3%BE%1FHS%F0%E1%5E%16%03%81%87%A0%09%F8G%E053%90%86%ABC%2BQ%90Vpu8%04%E8%0B%99%804%C2'%1F%A0%20%B6%8A%8A%BB%07%C9S%96%98a%9D1%F8%92m%EAU%12%02%A8%DB%E5%5D%A17%F5J%E3%10-%15GQ%90%96.%3D%0B%8DCpKO%B1~D%1B%AF_%F1h%1987%B3e%886%BE)'%08lfG%10m%7C%C6%95%18%C9x%D2%00%2B%AB%87t%DB%F8%CE%9C%E6%DC9%C6%98%1B%B1%D1%60M3%BBd%EC%B0%E9%3A%EC%CF%BB%91e5%92Z%1E%FC%12%9BLyWu%B8oD%DD9%1Dm%C9%012%ED%7Be%9F%DE%C3%0C%DE8rXc%1B%CDO%E2%C7%EBB%E0u%F3%10Ec%C4%8F%D7%87%20g%7D%D0%84%CA%130%B0%3C%D0%3C%24%C7%B5%EE8H%8E%FA%3F%81%FC%3B%0A%B1Y7%22%AC%E8%CD(%C4b%9F%F1%5B%93%00%E1G'%01%E2%19%B3%1A%D2%2FA%5E%80%40%AC%F4%E3%F9%D5%0D%81K%E4%B1%BAe%A5%1F%EF%0Ap%A3%7B%09%0B%D3%C6%9B%16%23%40%E7%9C%D8%9Ba%8C%1Fo%1A%D2UH67p~%BC9%11'%BE%8A%1C%5Ci%E31~%BCI%AD%DF%A3%BC%A2t%87H%2B%2CZ%06ak%95%01g%FEqe%0D%B6u%90%19%D1M%A4%BA%1E3%7B%CF%A4%5C%3B%25e%C37%D6%5B%F4%0ESQ%DE%B9x~s%86g%19%E1e%FFga%3Ct%40%B2%0C%E2%E3%17%86b!%C6%EC%FDbu%E7%F1%9D%81%CF%0Bb%5D~S%F7%8B%0F%AE%BE%D0%B2b%96%8E%D5ir%26%8D%B1l9%60%02%C2%AC%09W%2F%E3%C7%FF%8B%20%BBRV%D7%B1%26%20%1F%91%82%BC%1F%D8y%E75%AD~j%E2%C8%E3%F2%06%08%84%E4%E5%8Fgk%9Au%97Vl%A5%24%B1%CF5J%DA%0CNY3%A9L%82%FB%87%A8m%F8%FB%BD2%C5%82%11%CF%0A%DA%FB%06%E5%00%F9V%5D%05%1F%7DJ%C3%AA%0E%D6%12%CA%B3%CB%80%23%A4%C9%E0f%0D%2F!%9B%F5%E9%B1%D1%09%A0%7D%AF%2B%CBo%9Db%D2t%99%3F%FB1%CE%C2%87%92%5B%0B%E2%DEV%12%E9%CD%F8%9F%23%5E%A9%04%9F%87V!%15%D2%F6g%8A%2F%D8%DA%F84%D4j%BD%0Dv%15%EFW%C6y%D5S%7DOJJ%EFG%19%E4%88%24%EE%D9g%82C%C8~%0C%F6V%80%1F.%D4%80xeI%81%A8%C7z%1Dk%A3%5D%AC%7C%F0%26%96%DD%B2E%F4%D6jt%98-%D1r%13%F9%5B%B0M%CA%D2a%7BV%84%22%F0%D6As%3C%B3%D9r%11.R%8E%C1%8D%95%E7%F5%EE%3ABIU%0CdY%99%A9%3FM%1D%EF%98%05%AD%E2%D5%DE%EEe%F1%DF-%95%00%B4%D2%EA%2Ci%DE%E1%91_%5C%24%D2%20%EC%BDp%0F%D90%19%15%E4%1F%1E%F6%CA%95m%C9%3F%AE%F9%92%7C%0EQjQ%7B%5D%E4%CE%EE3%FE%8F%EE%7B%A9%2F%FB%A3%E1%C9%07%3B%C9Zf0%23%E5%F4%92%F9%F2-)%F1k%C1%0B%00%ED%94%D1%8E%EB%1D%EE%81%8D%CE%DBp%AD%802%5DZc%DA%14%BB%B61%BEO%15e%8A%15R%D0%23%A8%A8%E3%8F%80%3BY%C0u%9CYR%2B%BF%ABm%A1%96%05%7FA%F7%1F%B0%1AU%A1%96%23%FD%A5%00%00%00%19fcTl%00%00%00%04%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%C8%86%90%1A%00%00%09%E3fdAt%00%00%00%05x%9C%ED%9C%7Fp%14g%19%C7%1F%92%FB%B1w%D9%DDcFPD0A%98%14%0A6%94FE%25%E4%0C%A9M-m%C8%B4NQ%DBr%AD%ADSmf%8E%AA0%C5q%9A%85%80%0D%90%9A%40%DB%992%83f%83%0C%A3%D3%D6%04A%FD%07%CDB%00%83%9E%5CZ%CB%F4%C7%3F%D9%90d%AC%8ECBr%F9E%92%AE%EF%DEBH%B2%EF%BE%EF%BB%BB%B7%94*%DF%3F.w%CF%FB%EC~v%EF%7D%EF%FD%F1%BC%CF%06%60%A6%22%26%0B%40%1F%C6%E6J%5E%40%B4%99%1A%60q%B2'%E2%05%F0%AA%CB%3B%20%EBo%06%E4%01O!%87%14%9Dq%E0%88%A7%10~%A9%0A%F0%2F%E8%F4%14%02%3D%CB%01%9E%C7%B6%B4Lj%DF%A3%B0%19z%3D%86%88%8FK%2Ba%8B%C7%10%10v.%7Da-%40B%C9%E09%FFn6%BD%D0%A6%FF%926d%8E!%2C%92M%B6Jt%1F%89%F6%CC1%20%10%BEb%B2%AD%CF%E0%F9%D3j%83%0Au%A6-%E3%7Do-t4%7B%0E%89B%B6d%1B%F2j%BD%5D%88%CF%04%B9%DF%C2%F7%F8%DDj%FAo%F6%D2%9F%D8%83%3C%02%B3%E4%99%B6%EF%AB9%B9cfW~%E4%9C%E1%FA%0A%F0%F6%20%07%60%9F%3A%D3%D6%94%DAu%E2%5BfWn3%ACL%BFy%14%7C%8A-%C8%C5%C4Z%93M%DC%B1%B8%CCl%05%BF%A4%D7%16j%26%B3%81%BF%C3%16%A4c%9Bj6%0AjR1%5B%031~6%F8c%3A%04~c%87!%AE%C2%9A%F9%5C%0C%84%1F%3D%13%E3%EFlN%F7%08mv%20%D9)%AC%F9%E4*L%AF%C2%17h%85%05E%E8%CD%5B%AAp%AF%1DH%D2%DC%A9%E8%FA%D2K%18c%BCp%F9Ce*z%F3%AE%A6%D9%AA%93%96%09%AC9%B5%C0l%E3%06%3A6%A7%EF%8F%5Bt%E0E%C2)%DB%24%D3%D5%E5a%1D%1B%9E7%DB%92k%9B%FE%3C%9C~S%2C%13%18%C1%2F%1FS%A6%5B%04-%86s%14o%C3%18%2B%D4%E2pz%BA%16%2F%97%08%90cjx%7C%06v%D5%40-%A6%8A%83%2B1G%8F%08%83%81%5C%FDMi%01i%3C%FB%01%C0%BA%E9%96%CE%C3%B5%F1!%D5%E4%D8%A4%98%0F%E6%C7%C3%23Y%F1p%19%C0%3DC%B3%09%90%EF%A0%C3%A7%5B%1A%03%92xx%B3%C9q%10s0%9F%0A%8E%F7%B6%C4Q%93%9F7%3A%8E)%BF%E6%B6%15%B5%A6i%16%F1%D3!3%01).c%8C%C7%DF%9E8%96%1C%FD%24%FA%DE%C6pUfH%D8tY%991%D7%09%E6%F1%B8o%1F8%EC%A5%FA%FA%B6%C5%13%A8w%1E%99%D7h%099%B9%E8%AF%A9%D2%85%D3L%DD%0A%AC%C0%FA%FE%09g%8CD%97h%DFD%D5%91%FF%DD%2C%D9%82%11%BE%7F5%2C%DEmjJ%C5)%C5%F2%B2f(%FB%5E%AD%E1%D9%18%C0%8E%8E%D7%F3%2C%5C%B6%C0%044%9A%9Bk%D7%FC%7BX!~%ED%CA%FBz%EF%DCu%E4C%EC%9D%A2%1B%99%40%FD%B4%CF%5C%03%E2%5DY%AC%10%40s%B1%1D%FA%DF%EE%01%05%EF%C0%8F%F1Q%FF%DCy%E6%82%AE%0Af%08%92q%DB%F1%CFZ%14%EF%E2%FA%5ENV%99%2FA%9Cc%83!%8E%A4%BF%F0%CEQ%2B%07n%7Ca%D3%19%D3%F7%F5%FE%93%C36%209Z%FA%C7%CE%8DX%3A%F4%7F%BB%BC%F6S%D3m%C2%8F%B4%C5%F8%CE%1E%2F%D1%98%EB%8B%96%10AK%A5*Z%94i6~%E8%0D.j%03rU3%FB%D9)%DA%9FH%A5%F4y%C0T%0Da%A6%5Dte%11%EE%9E%D3L%D3%CB9%D0%A8%DA%87%B4%60%3B%23CUkL%A6K%90o%9F%01%E5%8AeQ%8F%86%2B%1B%F8%ADmF%CE%90uY%1Dv%89v%16%17S%A1%400%13%E5kzWKM%E9%BBL%D1%16%5C%B3%B4%8A%CC%E0gkh4%A0%05p%EC%84%A2%AC%82%09%11%C81-%A9%3C%80P%F4%B1%85%7C4%15%7FK%B7tK%B7%F4%7F%A8s%AA%F7%8CP%05%26%BE%90i%1D1V%15%9E%8A%DF%00h%7D%94%C9X2F%BEv%04%09%10%96%DE%99P%2F%40R%AD%8B%91%5C%3E%A89%E8%12%D2%0AP%1D%26L%2C%D1r%23W%D3nw%07yS%11%E7%9F%8C%91%3C84%ED%2C%8F%BAa%B4U%CF)YM%B8%91%D3%A52%87f%3E%C1%81%7Fc69%18%F5%D6mm%C35%BB%15k%87%BAr)%BDpj%CCu%DE6%0E%A9%BE%3C%A2CEv%94%BF%2C%A3%D5%DEA%E7%AD%FC%1FkZ%C8%D1%FBD0%1A%EA'%B6%0B%BA%C4%1DZ%E1s%C4k%E4%A2%FEh%95%EC%8E%02%9F%AB%A9!BB%7D%BD%F5%1Dy%EE%18%02-%18%C0%F75%AAn%3B%04%1E%1F%5E%9Er%15%E3%B7%93%16%E6l%10%EA%F1%051%06'%0A%84%BAy%A4%EF%20%B8%84%88%CBX%AE%E4Cw%10%A8%AA%A4%FB%E4%90%22%BD%2Cj%AD%5BN%2C%0F%CD%F9%FA%DE%60%CC%25d%3B%1C*%22%95%A3a%F3%D9N%C5%25%A4%04%B8%85%A4%F2%9Dh%3D9%D7%25%03%86DB%BC%C5%80%C4%DD%26%5E%84%C6%BB%C8%BF%F9%93%EDP%F0%15%97%90%8E%BC'%88%91%88w%8A%E7%AC%1B.%C6%07%BA%99U~%8E%1Cd%7CB%DE4%A8%84%0B%247%0Ca%D0O%EC%BC%04%A3%F4%9F%98%5D%14v%05%26%F8%87I%E5%5C%9E%F1%F7%D4c.%20%9D1r%F9%AC%AB%15%26%7C%D1%05%A4%E1%11F%C7%8B%E4%40%15Q%174%89%CD1%DC%84%09%D4X%1D%EB%C3%F8%92%02%3B%93%FA%D8%C6%BB%FE%97!7%A2%E2o%0Aq7%02%E2u%F6%DAG%06%B9%E49Dh%B7%97%EF%C1%AC%E4%F9%EB%EF9%05%CEx%C1%E8)%5Cw%7D5%E5W%E0%B4%07%0C%F1%AB%00%5B'%3F%F9%00%FE%E2%01%84%DB%80%86%1Ce%0A%E4%D7%1E%40%F4%3C(N%BA%F6)R%DF%BE%D7s%C8%D9%E3%17%AC%F6%98%5DAd4)%B9%06%E17%408%CF%0B%C8%E7Q%23%9E%84H%10%C8x%F6%9F%0E%A9%DBX%3D%2CA87%3D%DF%90%C0%EDz%19%ABY%97j%F6%04d%98U%12%D5%3F%EDM%94%CB%1E%40%F4NE%AF%FC%60%1A%12(dX%BE9%87%08%E9%85%9FO%F5%821%09%81%9F%E9%9F%9E%F6%80%C0%1B%3BmiHNiY%E2%1869%C8%BD%26%EF%04%20%BB%86%94%A8%96!%88%CF%23%C44%88'%23%09%AA%93W%EA%A7%400%19%A5%99P%0F%E4%E9%10c%00%0Ea2J3%A1%B3%B0%FE*%24%BC%2CQ%ADx%03%D9%0D%D1%08%24%CE%23%08%3F%AFF%F6%86%01%AF%89%B1%08%1A%E3%1B%20%9D%FC%EA%91%82K%D4%08%1A%E3%AB%D0o2F%F6%14k%14%A7%10q%25D%D0%18%DFK%3F%01%F7%F4V%A7%14%1F%82%A0c%23%12%DDS%81%03%0E!%1D%F9%06%84%9E%84%EEk%87%1C%D9%19%E4%A5%C2%C7%22%E8P%1DDQ%B0%DEqZ%FE%C6%3D_%AB%D2%C7x%BA'%3F%1FDB~%0EIe%3D%1F%14%E7n%ACfH%AC%10%3FQ%AE-R%1CA*sb%11%B1f%0F%CB%0Ae%BB%CA%17%13%12%B3%08%3A%03%F7%5D%EF%BB%C8%EA%AD%FF%5D%2B%26G%91A%5C%F3%A9%24%0B%C4_%09%FEeW%7C%DB%1D%ED%C4%08%D5%CF%C4Y%20%D9w%CA%FC%A2%E6%AC%EE%A8%13%08%08%F9%0D%2C%90%C0%0A%7D%93%AF%95%B7%93%908E%EB%8BY%20%FCx%97%0C%F0%1C%7C%CF%11C%98%60%82%C0%12%F1%1B%00k%E1MG%95%C2%3D%D9%C4%04I*%AD2W%AF%3F%DF%E1%40%5D%FB%D9%9A%F0)MK%FD*%DDk%1B2%05_%2CSA%91v.%60%82%04si%A9W%A4S%94%DF%C1%049%9A%D4%1F%2B!y%10O%F1%60%D2%18%E3%C9%3A%E1(%A8vU%1C%BA%F5%DF%1Bc%3CQ%097%10%24%DFg%D0%18O%3B%05%E7(%E7n%0A%84e%8C%0Ft%D3*%9E%2C%7D%8AJ%1D%E3%05%9A%03%0B%84%3A%C6%B7%A9%EE%202%CB%18%2F%B0%06%ED-%20lc%FCEw%90%3A%A61%DE%EF%0Er%9Ei%8C%B7%F9P%DDL%88%02%90%E5utY%87%D8%7C%2C%EF%26%85%F8%9Bo%00D%0F%A8%DD%82%DC%7C%90%EC%1B%01%F1%7C%DF%81%93%18%C6x%E7%12%AA%EFF%E3%08%B7%85a%8Cw%AE%80%22%A2%A1%F7%F11%861%DE%B9%DE%01x%00%B8%2F%B0%AD%E3%B1z%88%FE%3C%7F%1B%C0%1A8%FA%B6%C4%B4%8E%C7)%24%BF%A7%D2%7CN%83%D0%C7%AF%F0KL%EBx%9C%DE%03%FC%B3%86S%E5%3B%D1%FA%DA%83JH%06%98%A58%82%1C%04a%98%B6%96%10_%EE%CF%FD9%88E%E0t%F3%A7%16%BA%86%E6%AA%14%A7%D0%FE%D7%91%CB%A6%8D%D5%0Ew3.%D4%14o%E8%A6%85%FB%BArJ%91%D6%0F%EFq%C6%00~%C7.%19%96R%9C%5EM%BF%3Ay2%ED%AA%3A%B2%148E%F11%9E%EE%B2%C8i%22%2FG%0C%EDB%FDQ6%D9%C5%D8%02%D0S%8E0%E2w2%3C%FA%BD%3C%0B-%C2%C8.%7CT%7F%15%F1)%DA%CF%C0%1F%A8%8C%40%9E%8F%BA%07nTF(%8A%2B%CB%891%B4%EB%A4%84%08%94%87L%0D%88%88%FD9%05%258L%85%FCP%15%A8%A3*%A9Y%05W%C2%7DTH%99%FE%E2%8B%91!%ABw%96ZuZ%E2S%BB%C8%07%EB%3A%91%86%FC%94%E8%C3k%DA%80%E5%B3%C1%E26*%C3P6m%AF8%D1%B0%C4%F2%0AX%9F%0B%E8%A4%FCP%D0%BDZ%E6%13_d%7D%E6%F2%B0%8F%D2%11%8Bu%96%5D%E3S%97%FF%A30A%1E%E6%C8YW%7C%FC%C7%92E%91pe%A8%CA%AAl%9A%C4%B10%D9%EF%D4%2FN%AA%16E%81%85%2B%06%A3%2C%90%F0l%9E8%D0%87%17%88%96%99%FD%BD%95Ec%A9_2%40%FC%92H%CC%B1m%92%02%96%17%D1%90%18.%E9%EFW%A8%0C%E1%A8%AA%FF%5B%06k%DD%05%B8%7FYb%A8%84%EF%DFW%DA%B4%94J%E1%D0Z%B3%89%10W%E1%B5m%DB-w%2FG%A1%BF%A8w%F8P%FE%1F-%1C%98%D2%A6%CA-R%AC%18e%3E%A1%93%7F%DCV%0FoP%3C2%00%A1%E8%BF%9A%1Ah%826%3A%E2E%00%00%00%19fcTl%00%00%00%06%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%E6%D6Y%9A%00%00%09%DFfdAt%00%00%00%07x%9C%ED%9C%7Dl%DC%E4%1D%C7%7FI%EE%FD%7C%BE%B6%8CV%5B%D2%5EV%3AVJ%A3%EB%D2j%82B%93k%12(%DB%BA%BE%20%D8%8AV%20%84%F4EZ%D7%04%08b%7F%C0%E2%D0v%0D%A5U%C2%84%A6j%AA%88%E9%0A%AA%26%B6t%1B%AD%F8%03-N%D2%D0%97%99%CB1%C8%A6I%95p%08%D9K%D5%A9%B9%BC%BF%E2%3D%BE%5C%12_%F3%7Bl%C7gWj%95%AF%14%9F%FD%FC~~%3E%8E%FD%D8%BF%E7%F9%DDs%06%B8Q%C1Y%25%00%3DHYZ%B2%03%22%DF%A8%3E%23NsS%9A%878%AFy%CD%EB%D6U%E0%C3%9B%00%E9%DA~%C6~%C8%8B%AE%5C%DB%19%81%A50f%3B%C4U%09%3F%B6%AE%B6%7F%1EE%8B%B3%CE%C0Ac%15%B0%1F%EB%BA%F8%96%1C%8Ea%E5%24%26%1EN)%B8F%AB%AB%B9%98%D7%83%B4%C4%BC%5Bp%08%BBzj%7D%3F%F9%F3%F7n%AC%C4kX%19%C8%99%5C9N%85%AD%02%B8%1F%2B%CFz%EA%CB%C8%D4%FA%B3%12%40%26%CF%E6%A0%150%3D%D0%24)%2B%EE%1D%CFR%18%CC%04%E0%E7%3E%10%EA%97%A6%D6%1D%05%00g%01%BE%8F%D7%B0%00%82%82%B2r%5D%F2%F0%14%C8W%00%EFc%86%BF%F5%CF%AC%B3k%01j%01~%88%D6%C0%8E'!m%C0PN%E8%FB%A3%E4%B6%C3%0C%8F%C5U%1B%CD%95p%F0%BD%B3%B9x%15%2FHu%E2!r%00%1F%01l%40%1D%98x%9F%C4~%1D%3B%BE%BC%01N%E56%20%D6%C9K%24%1C%E2T%3A%3A%A5%00%9D%12lF%1D%9A%07%E4%FB%0E%60%7C%DF%CE%F1e%AA%CDVy%E02%8E%00%B6lT%14%05%B2%E2.%20%97%07%D3%D6%B1%C1%F0%20v%84%AE%A3%3D%E5%EAmf%A2%8D%02q%AE%CFM%AEm%CF%170%07%7F%7F%0F%E5%01%E5xo%C2%A9%BE%7F%1C%5C%06%8F%7B%FE%AA%BB4%F1%D9%16%96%0BQ%87%AC%EC%9E%FB%F0%5D%83%E2(%3C%AF%AA%F6O%92o%F0%2F%A8%E7%EA%8AI%B7%D03%83%ED%A8%C3%E7%2F%F7%3CD%81D%07%81)%E2%A6%B7%F7%00%9C%0B%C9%C8%85e%BE%2B%0B%C0%9C%E7!Z%B1%E5U%B4%AA%06%B1%A7%86%02%E1%2Bb%C0%CE%3C%D5%EEM%2C%C5%D9%8E%9E%FE%0A%F0%87%E2%DB%EF%3E%24%FFo%10%AD%AA%8C%E9i%12p%08%D7%C9%A9%B7%C7%F1cQ%D4%CC%96%93%3A.%84%E2%CE%09%D4%FE03%91%85%DF%A5%0E%8E%E1S%20Lm%3D%05%F2Y%8B%2C%0F%82%7F%14%9Ax%D4%FE%3Dv%2CP%40%D9%D7%F7%23A%B55P%5E%F2%0D%8Ac%C6%B0X7%0E%9D%BC%9F%E2%B0%13%96P%F6%24w%CA%87%DBT%5BUb%80v%C6%5C%C2%BFe%1E~W%BE%91%DA%F1(%A3B2%EB%7F%A3%DA%BAZ%B8%22B%F3d%C2J%B3%A8%C0%23%81%A2%F6%C5%7F%A0X%3E%17R%EEq%A6%B0%94%E2%C8V'%CESw%9C%A7A%9C%FD%A1%1F%E0%96%C6X%A6z%D35%B2%9CR%85g%40J%7C%B6QG%AC%EC%DA%AB%85%02j)%02%87%DAP%C1_%C7%FD%C8%5D%F2%A4%F2%11%A8%C9%A5A%E0%93%CA%2C%B4m%92%26%99%12%E8%06%A1%5D%A2T%D12%A0%2C%DF%90y%8A%9D%9C%EB%EC%0A%F4%08%9B%D7%80%B7T%B5%FD%F4O%FB17El%94%2CZ%97%8FR%19%E4%DC%A3Ff!y%22%E5%AA%0A%DC!%8D%9B%9E%FC%E3%C3u%BC%86%B9b)V%FA%C7%9CD%3FdF%1Dq%CD%FEw%D3%09%FC%C1%95%DCY%C6%8E%B0%A3W%00%F0%AA%2C%07%E5%FDZ%0Ch%AC%8A%D0%8D%7F%97%EFG%3A%90%AC%FC%14Y%FA%0B%A7%BBw%9F%C9%B4%87JRY%F2%1A%AA%CD%DF%BB%08%2B%F6N%FE%EF%CC%91%A9%82%AB%FD%826%04%DE%A1%B6%0Bp%8C%0F%A97ge%5B%86%A7%2C%1F%08t%A7%A4h%14%87%5E%02g.%A9(%CC7Y.%0A%14%9B%95%10m%DD%B2%10%FA%85%D7rJ%F7%C2%CFk%5E%F3%9A%D7%BCni%097%81%D1%BD%F3%26%40%5Eg%F4s%87i%2B%17N%DB%CE%60%22J%9E%EC6%81%AC%B7%1D%02K%7D%F4~%B8U%F2%2F%2FF%93%CEV%8A%C9%DF%F8%1606c%DE%E6VpP-%D8%CA%F0%8D%07%C6%22%0C%7D%DCb%89%1C%95%DE-y%ED%B4%04%91E%F2%AEr%D4W%24%D3%15%F6%E9%7C8vM%40%CA%19%D1%CA%C6%D0%84~%A1%E1%0F%CB%B4%04%9D%19%05_%C3J%BD%2Fo%97%2C%8488%B4%98%5Dl!%03%7C%0F%A2%C5%1E%3C%23jV%CF%95%94%F0%B3K3%22%96B%A0e%EF%B6%D9%85A%04%9C%96%EA%90%ACx%B0%94%2C%FEZk%5D%3Bv%20%17%D99%22%8A%1F%ED*%D6%CCm%CDIMH%3A%8D-%96%E5%BE%1Cx%DC*%06%13B%AE%09%88%A2%18%3B)%18%FC%B2T_%5DX%26%C0%2B%CB%7B%05O%8Ee%90%E7%B0%7C%9Fg%F8pX%96%87%AD%820h%82%D3%3B%0A%CC%E9%DA%A3%BB%ADa%B0-r%1F%F6%2C%8C%26%8Cw%BEe%09%C45%7Ci%2352%3AW%DE%15%BB%5C%B5U%96%C3H%A2%86%A3%EC%E4%40%7C%B5%12%3Bo%C4%1A%8B%BE%F6%08ih%D7%11%A3E%F9.%DF%10%9C%1A%A1%3AX%04%E9%FC%098%EA%ED%86%FC%FA%08%B4%0BvC~%DEz%ED%EE%A4%83%7D%17~%8FSF%7B%00%96%AAY%B8b%3B%03%7C%3A%89%F9%14%05%CCR%1A%E7%D0%B7%EC%14LB%98%BB%8C%FBV%99d%00%7CZj%D4%93I%A3%7Bs%C2%98%9B%18up%E6!%C6%D4%BD%AE%F8Q%C9f%06%FB%00%C0.%9B%19%E0!%9D%84%2F%04%9B!%CAW%AA%1E%EEv%80d%F1%24%C2%DA%0D%09n%00h%B7%15%E2!O%F1%F6%1D%07%86l%85%10%05%D9%DA%23%B6_%13%25%E6%D9%0B%F1%3D%92%80%A4%CC%0C%B0%5C%AD%DD%9C%FD%90'%FD%B93%90%B6%90%95%23%F3i%05J%A1%40%F5%9F4Kv%40%FC%1ClQA%D0%AC%40%DA%F2%D4%B3kT%90%23%9A%CE%A6!B%8B0%0D%F1m%3Eg%0B%C4%BF%EE%C1%E9%26%EC_%98%93%A9%E7oN%1D0s%9FD%7F%EB.%9D*g%AC%84%3C%A1%40H%8CW%20%E0%BE%E7%A5d%AF%80%DC%A3%16%8A%8C-%82%24%C6%BF%99%80%C0%9F%E5E%11%E5%93%E9%B0%92%C1%F4%F2%10%241%BEZJ%16%B0%D9%CA%E2%F9e%1A%FB%CC%1D2%20%AF%A8%231~f%1ASK%8C%5C%A1%C3%7B%11%DF%0F%F0%C9%D5%06%20%3D%FB%12%B3k%83%DCT%89%2F%07%E0%DC%FAO%10%DFM%87L%0E%12%D8%89%7F%9DI%40f%1EZm%FB%A1%5C%C0%86%3C%118o%0E%02%C5%F0%D2u%1E%92s%85'u%AEv%01t%22%AE%9B%C1o%F2%F9%E9%FA%D6%CE%A7%95%18%9F2%ED!%07%B0%16%FCn%CC%8B%CF%24%D6Wk%5E%90%C4%F8%D4%89%15%0F%1F%C0%92B%9D%B9%19q%C1%1C%24%F0%95%12%E3S%AF%C1%15q%0F%92%8F%F3%C9%BD%BB%F1%A9%C4%BAr%E5(%80%1B%2F4%BBk%D3%AC%06%EB%A8l%F9Xk%1E%9B%86%DE%DD%87A%C8pb%D6%B7~%8E%D7%B3!%DF%1Cd%F3%02%1C2%5B%EEo%0A%EC%1D%E6~h%B2Q0%0A%09%1C%03%FFf%ACE%E8%2B%9Cg%14%02J%B7%F9%B8%19%86%D2M%15%0CC~%09%0E%C9%0Ce2%60%E9C%D8%E3%B5%92%2F%02%BER%3B!5%FD%F2%03%BB%24%60%A7%12%3F%86%A6%5E%CD%11%E2%0A%E9M%BD%D2%AE%C2%10%E4%02%96%FD%9B%13D%8C%EAB.%9B%9A%0E%A7%82%9C%5DW%DC%A0W%85%3B%5D%08%09%EB%D5zU%B8L%CD%B9SARb%3C%0D%F2%A5%DE%85%D7V%E2%C2s%3ANf%83b%0AD%B7%8EH%9A%10%3E5%C6%E3%DA%97%26%24%8F%C4x%5D%AF%B3iB%EAn%8C%F1%A8W%9A%90%E8%8D1%DE%06%88%F3%8C%91%07%A4%D9%8E%5DRJ%A2%40%1F%E2%BA%19%904GE%C6%20i%EA%F6%82d%D0%BF%B4%B2%0Ebo%02%C7%12%08%23%D9%0AI4lf%C71%03%90%A9q%FC%DC%E5%E0%C8%E2%1F%06%1C%3D%2FN%8F%E3%E7%0E%89%90%05%0F%20i%F8%9C%FA%85%02%193%10%E3)%F2(%BF%08%E1%20%C0%D1%5D%02%E3%FF!%0FG%B7%91%18OSu%BD%124%5D%F5%F4%A8%E6%8E%C0%D2%C9%F3%AA%1B%E3ib%F2O%88%BB%C5%E6%18%F8WS%3CH%E0%1DOBL%F7%13%7C%8F%95%D4%C8%2B%E1%BFa%DA%C8%85%B4%A9q%7F%EDV%02%C9%10%CCB%88%DA%2F%1C%BD%B82J%B3%BA%24%FFP8~lC%9A!%E9%10%9C~M%A2Z%3D%D1%EAM%85%3F%032%8EO'%2B%84On%98%96%FB%3B%D9%DEW%C8%F8%A66%AD%04%A73W%CB%CA%16%AD%93%1A%84t%EAO(%A89%22%EE%DA%BF%D8%3D%97%AFn)%D2%EE%B3%BD%7Duh%91%A0%5D%C1IZ%EB7%0Cy%B5%26%CEi%EF%CF%E4%B5%EAOz%D2n%FE%17%17%E2%BFf%9E%91%83%F7%A1%BF%C9K%91%A7T%CB%AA%D3%F6%20q%B7%EE%D0%85%B0%9A%F3%7C%95%F7%03h%CA%F3L%BD%91%E9%C8_%AC%D5%98%84%C3%8C%5C%AA*%114%F6n%18.%AA%BDG%1F%C2%EC%2B%A3%D7%C2%86%E3%B2%9CG%DF9%10Z%E5)1%92%16z%82%7D%85n%BC%22%B0%974f%B39z%2F%1A%20%10uj%7F%F1%C2%9E%D4%804%0Ci%FDNS%A5L%A0%FC%20xR-%7D%F4%17S1%0BG%B4%7F%2C%3A%25%F6%F1%80Vn%D2s%AF%8B%9E%25%CBz4%3F%1E1%02%E9*pr%1A%E6%0A%A1%93%A7%1Ak%DA%E5%B0%91%17p%B1k%A5%17%24%BA%D99%02eT33%DEpg%99%11HWA%AB%D6%DC%95%EB%DB4n%FA%AC%CA%86S%A7%0C%A4%1C%C9%3FR%F4%7B%0D%7B%BB%E4%1A%93(%B6%C0Z%A9%23%EBS%CAk%3ER%0Ef%19%BC%19%FE6%DD%5E%F7%D0%3Br.%ED%00I%CF%20%D8x%07%ED%18f'p%B0%A1%C7V%CA%14%2B%83%9A%A9%88I%BE%CC%C1%F4%8B%DB%18%FD%EE%FA%B4lx%3B%DC%FF%01%1C0w%1Fb%1D%1A%C7%00%00%00%19fcTl%00%00%00%08%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02-d%25%1A%00%00%0A%15fdAt%00%00%00%09x%9C%ED%9C%7Fl%13%E7%19%C7%1F%92%B3%7D%B6_%DF%01%0Bj%A1%94%98.%ABh%96%90%90Fm%B7%011!PJ%D3%26%AB%D8%94%AD%A9%F04%D6Ri(i%AB%22Vm%8A%93%00u%A1%5B%22%D6%7FZ!b%B6%96v%D2Z%D2%C1~I%D3r!)M%A9%89%1D%986mc%E2%E8%C8%CAVJ~%92%90%C4%F4v%E7%1F%18%DB%F7%BE%F7%CBg%A9%15_%25%8E%EF%9E%E7%F5%E7%F2%DE%DD%FB%BC%3F%9E3%40%BA%D8%8C%3D%00%A32%FB%0C%C9%0C%88%90%AE%095N%DAd%F0%10o%E9%96n%C9%88%BA%0A%7C%A63%98e%D0h%3A%04%D5%C3%99%80%D9%10%BB%0F%ACYo%BB%D3%E5l%06%BB%E9%10%E4%06z%BE%E9%90k%40y%09v%A6%E2Q%E3%10j%EC%D0%F7x%92%3D%B8%CB0%83i%89%D4%11%0F%F5%2C%7CK%F1CPe1%D1%EE%10%14%CE%FA%AF%E0BX%09Bu%DA%F7%90%ECyJ%90%1F%82%CDGtp%9D%86%100%23%3C%C1%A5g%82%00%F9%DF%3AA%98%05%9A%0C%E9%12jC%1C%88%3Fx5M%E2!%D6%05%2F%9C%14%E6%C0J%AE%AE%B6O%EB%B6%DE%16%EE%22%B9%14%CC%E2!!%1F%B4T%1D%A8y%9C%C8%80%1E%AFs%81%20%2C%25x0%D3%91%CF%B0%C6.%0EM%173A%9E%0Cq%DC%03%5D%EB%0F%DA%97%E0%3D%D0%B5H%04kl%0D%E7o%AA'%13b%AA%B6xC%CB%F1%95%8Af%E6%DE%C6%1A%AF%00%7B%98S%03%99b%EE%5D%FE%B1%17%0F%89%3C%40*%1D%0A%A9a%A0%19%B80%83%AEc%ED%CEH%3F%11%D2%A7%0A%12%81%D0S%CD%B7c%ED%B6%08%1B%20AzUBj%00%B6D%DF%0FJ%DB%7C%AA%9D%1A%A5H%A7vdP%15d%0E%DD%09%D0%11%7D%BF%5D%AC%9D%86%CET%BB%BD%9E%22%05%13%CA%93%BA%ED%E8%96u%AB%A8%10%F7%C7%EE%F9%5E%1E%FA%F8%D7%D2%ECaz%8Ex%8C%A9%DBC%F2%D7%E9%C7%D2(%E6%CCX%00%80%B7%D6C)%9CIw%A0%A7%09%10%A8%E6b%7F%99%D8%9F71n%7DbS%1F%BDk72%C5%C8%939%3Cs%8C%93%20%7D%0Bc%15%24%05%CF_l%E0Kp~%1D%F1%98t%C2%DB%FB%AA%072%AEX%24p%24%CA%B6%CA%A8%19%DD%0D%AE%D2%B3%AB%3D87%B4*V%91%CC%BDoW%AF%86%1FeB%7C%24%88%B5!v%F4%FF%F6%DA%7C%CC8%B6%E9pE%EF%92%2B%00%97%16%3E%2B%7CX%9E%01%99%C8%D8%95%A2%BBjcn3%14%97y%847D%B9%A5%D7%3E%B1n%3F%D9%7B%F5%25%3E%DDLO%E3%DB%03%F1%B3%9B%26%3D%B1wu'%A4(%89S%07'%BD%B2%B3b%85%B5vf%9A%A9R%7C3%0C%A8n%AC%3A%5EE%F9_z-%88%BF%A5VD_%AD%85%9B%FC%5B%E5.%8E%D0%11%C2%DD%D84%DE%968%04%A6U%A8%E1p~%CEhP%3Aw*RX%F4%5D9%7Bu%C8%8Be%5C%9C%3C%B7*%F9%C1%EF%E1%0F%C6%EA%11cl%8D%20%8C%97%C9FH%E7%ECr%1E%5B%B6enher%EB%05%3C%84-%05%B8vbbb%A3%FFe935y%0D_%B6%AA%3Bt0y%08w%E2%1Dm%C2%83p%3F%BB%ECo%98%3E%DEy%A1%91%97%B7%88*%EC%EE%17J%13%1Bb%CF%1C%AF%93%1B%E0%18%3D%C6%05%E5%ADH%10nn%EB3f%5B%26%B9%84%C9Q%8FuJ%08s%9DRJ%138%C9%B6.%D9%C7%C3u%A2%E4%A6%ADH%FBe%1C%2C%B9%80P%B9%81%F46g%07%92q.%93%178%E5%7F%DA%83qJ%5C%24%18%88%E2%89O%8A%5Eb%F5%91%ECY%91%EB%ABC%BC%9Er%9Fj%F2%EE%DD%A4%87%01%03%80%E4%FB8%B2%B2.%D3%09%E9%D0%00%C9%23%04%1E%82N%C2%8C%06%EF%03%BA%C6%DA%FF%DD%E3%D3pph%D6%AF%07%D2%C8%2C%D12%E1Q%F6%BA%0E%06*%87gU%0D%A4%E2%BA%DC%AE8%A0%97%81%F8%A0G%A6g%81U%3F%B9%EF%84%814C%0F%A7%DE%DD9%A6%C19%A9%95%F0%8C%06%EF!%D2(%1A%AF%F6%CE%BB5x%7FS%C7%19%11uQ%20u%1E%D3%D5%D1%AC%0Bb)%F2i%F1%D67%BF%97%FF'%5D%C5%B4I1%2CfC%F9%B9%80%10%E7%09%3EW%90Wr%01%D9%FD%85%81%B4%E5%02B%9C%9C%CC%96%88%D3%AC%D9%12%AB%25d%E9%95%C5%9B%03%08%5D%9B%03%08Z%94%03%08%94i%E8%3F%EAV%97%3B%07%90%0B%FAz%B7%DAd-%C8%01%84%DE%AA%AF%07%A2%0D%D2%96%833oi%0F%98%0F9%7F%D8%7C%06l%CBAlD%91%15%E6C%F2%1Asp%9Ft%FC%D5m%3A%03M%E5%F9L%87%D0%93%BD%BC%E9%10W%95%B4%18%A1%20Vf%A2%C6%87%F1%A5d%7CI%13%3BI%88%CC%3E%8DSQ%83J%1D%7B%E7%88q%88%E2%E8!t%3E%07%90%07%B3P%5DJ%10%C7%B2%1C%9C%F8%BC%00%D9%9E%15%E9%99M%D1*W.%FA%00%B1E%24%D34%B0%1F%E0%9F%7C%97%A9%D1%99.Z%B7%96%5EPD%CEF1%AA%EF%F3%F0%83%F6%CB%05%3C%D1%09q%E2KP%D5%12%B4l%F1%EB%E2%20%7F%25s%8C%EC5%D4%FE8%0CW%AE%D7%3B%FE%B0%94%8B%BF%CD%A0%B0%18%FF%01%F3%EE%95o%00%EC%04Fv%8DII%AC'%BA%92q%9C%EC5%08%B6%81z%80%8F%06%5Bu%0DAXN%FC%AD%87%CDd%AFn%B0%9E%10%1D%E9U%FA%869%F9%9D%AE%D3l%C1%1E%859G%1F%7C%24%1D%0D%BDZ%17%03hA%B8%C6%BE%FA%12%A0%17I%B7%BC%FFT%89%94%60%A1g-%C2%B6C%84%AC%0D%EE%B2x%60%A0L%F0%12%3C%877p%EC%9Ah2%90f%CD%BB%0AR%12%DEvW%A10%F94%B9%D3%EF%036%D4%D0%3E%AD%03%C2%0A%1C%E4%7B%E1%0E%B8%8CY4%BC!T%0F%2C%E3%DF%A7%90%99%25%AB%D0%B1%A5%D0%C2%11%F2in%C8%D2%1D%8Dyz%20%87Q%A1%B0%14%1Cne%CF%11%BF%BFC'%E4T%B4%9E(%15%25%7B%FE%FC%87%8Ep%F4%1F%D2%A9wye%9F%B6%95%D1%EA%A28%9D%0C%BB%9A%C5%9B%DD%CF%F1%86%20%A1Y5%10%EBm%1DF%20%CE%87T8%1D%80%DDu%BC%01%88*%85%C2%C6%CE%89*%E5%ED%7B%C7%7C%08%AA%7D%CB%7C%08%D8%B6%B3b%8C7%19%E2%9Ae%C5%18%FF%8A%B9%10(a%C5%18%DF%12%87%0C%9B%03%A3%23%AC%14%E3%E3%CD%0A%E5%C3%7B%FEe%A3%EE%B6%A7o%B5%14~%13%1FN%1AJ%9F%0C%FEX'%03%15%97G!%F1%8E%17K8%D8%F7%E1%22%AF%0Fbm%EB%96b%FC%3C.%B69%8F%E0J%01M%C8%DF!B%26b1%3E%BEIJ%FE%CC%0B3%3AG!.%E1%11)%C6%17%C67%CFpxW%E7%8A%3Dj%9A%5C%19IC%C4A%FF%BE%C4%B0%D3%E6!%F8%B6%D6%D4%E9%BE%BE%A4%BB%3D%0EA%FF%22%A4%25%C3%8A%7F%3C%A7%F3%A4%A4%40%9A%7C%A1%80%BC%13z%02%1CS%8B)%E5%F4%7CE%88u%91%CF%85%E9%3B%D3w%05%D0f~%5E%BF%DE%FA%8AB%A2%03u%CB%B0%07%8E%CA%3B%D9%1F%F9%9A%F8%3Ar%D9%AD%13b%0D%DC%A8.%BA%1C%EA%02%B2N.%F7%B0%17%C4q%08!%9D%8E(%A9%CF%15%87%B8f%3F%F8%BA%5B%DE%AB%16%9E%04h%80a%E3%10x%0F%9B%1F%FBK%7F%FBZT%0E4g%1C%22%EA%0DY'W%93%20%8C%EF%E6%81%F1%C6w%10R%AFT%40%F2%C2%7F%7F'%D3%E9%C2%3A%A5%D4%2B%F24R%1A%C4%B1%7F%E2%CB%7C%86%D3OY%A5%F1%81%12%24%982%F9W%F1%98%B0%26%C3%A9VC%3A%9C%2C%E4%F9%CA%F57%2F%89%FE%0EP%DD%CF%D2%9D%1E2%0A%99%13c%FCM%DBbs%FF%F2%1B%814%A7%BD%1Ar%EE%E4d%13c%FC%08%97%DC%CEo%0C%EE%80%F4%A9%83%DFh%C8%B9%93%13%E5%13%FFW_r%9B)%1B%CF%9C%05!%3E%C9%A3B%D2%9Ak%CA%E2%EE%1F%E5%9C8c%10%BB'6%7DqC6%3E%D3I%EF%9D%9E%10*M%C6%F8%98d%D2t%1C%3E%83%90%C2%86%F6%D4%13y%89%CFt2%0Ay4%19%E3cb~%92%E9%E45%08%F1%A8%C8%E3%91%9CL%87%D8s%01q%1AL%60P%051%AA%2F%0E%84%99%9F%8B%2C%B1%D1%5B%10uB%9D%9FH%90%A0%E2%02%9F%01%D9v.%3B*F%B9%AB%A91%3E%CB%F2%C3%E6m%D7%81I%8B%F1Y%D6J8%F0%157%D0%A3%A91%3E%CB%1A%85%D0%FD%5E%A0Fc%A3%3A%93%20%F3a%A4%2F%00%16%11%92g%5E%02%D7%13%D0%1F%E2%C1%1EH%8E%E3M%D0%EF%3F%5C%BCSlV%D6d%25%9B%12%9D%96%DFo%AFzs-%A0%A08%8E%C7%A6%F4%23%15%0BD%C7k%BE%C3%81%FD%01%5C%1Ec%EFF%1E%A4%3B%05%FF%10a%EFo%953%8C%DF%0A%06%9F%3F4%14%B6q%F2fi%C4%FC%A4%EBH%D9%1D%B8%F2L1%FCZ%11%22%E9%F8%16%C8%0F%C8%9B%A4%C7%05H%D3%03%60m%C6%3D%C8%99v0%5B%A6%E1%3C'o%13%AB%11%11%9F%B0%10%87%DF%F9%98%B2)%EA%5D%D4~%F0%DB%18%5B%9B%D8~y%F1E%1D%82%C0%C1Q%5E%05%A4%86G%15%B8y%84%AE0%B4r%F8%A2%3D%3F%AF%9Cz%91%F8%F8jB%0F%03%9C%C1%1D%CC%F9%A2%1A%B9o%FAI%E8%BE%91%E0.%BF%AA%89%8EZ%B1K%EE%C5%D8%9Ce%C2%C4%0ElI%D7gmHes%F3%14%9C%0Bb%9F%D1A%83%CE%AD%D8%92%8E%F2%7B%D4%F6%B3%87%AA%85%F1%FFx%F1v%16%7B%89%A2%E9%EBG%3C%EA%20%AE%C7%BA%F7%C2~%BC%BD%8B%C7%9A%8E.%D8%E2V%07%01t%1F%F6qbQ%8E)%BC%AD%A5R%E9%BB%23%92%0A%11%D6%7F%5DM%84%19%BFP%F8%AC%DA%F9S%87%10%C0%DA%DE%2F%9B%24%B4%1A%3D%CEB%B5%0B%CF%CFT%60M6%E1vR%CB%D4%BEu%FA%90%3A%C6%C5%12%FCs%EDU%F8%9BDR%97%E0%E5U1%06V8%B0%F5j%237%19L%D5bU%08%60%84n%8B%1Bgd%97%12%9Bq%EBB%8F%3A%084%95%B0%9Bq%1Fe%11%88%F3%E2%97%CA%04%FCZ%BE%AA%B4%A9%3AL%8A%95Je~%E0%E7%F5%DB%E1%FE%0F%95l%83%C1J%7D%EDy%00%00%00%19fcTl%00%00%00%0A%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%034%EC%9A%00%00%0A7fdAt%00%00%00%0Bx%9C%ED%9C%7Fl%14%C7%15%C7%9F%CF%EB%FB%B9%3BWJBi%A1%B6%95%D0%D4!%04%9B%E0%22%D2%108%FF%08%18J1%B4Ph%EB%D6GK%5BTQl%14%A8%92%06%85%0BN%E8%85%10%1FHP%A1%A8%09G%09%89%2B%91%18%08%10%A9%AD%F0%DA%1C%95)%17%9F%A1%FC%D1%FF%BC5%01%14)%8A%8Dm%82%81%C3%DB%5Dl%EC%BB%DB%9D%D9%99%DD%3D%AB%7F%F0%FD%8B%9B%F7f%3E%DE_%F3%DE%BC%9D%05%20S~M%0B%40%AFN%9B%25e%03%22g%AA%9F%C6%89M%16%FF%C4%07z%20%AD%D0%DF%A4%ECCr%3F%08f%1Fr%18%AE%8AY%87%FC%0C%7C%81%ACC%02%80%EE%8E%03%04%92%E3%00%11%86%B2%0E%99%0F%CE%FAl3%CEN%8A%FF%3A%DB%8C%D8%ED%1F%F4%1D%CD2%83%7F%F8%8B%89b%96%19%D0%15%F2%16%05%B2%0D%D9%07y%5B-%DF%C0%E8%DC%9BD%FB1%A9%E7%F4%A0U%08%F7%C2%2C%91d%CF%09%B5t%0EXCt%40%0CN%14%92%3C%5C%F9%9B%C0%1A%C4%F3T(%0C%9DSI.%C2%E4Jx%C4%12%C4%BDu%F6%3A%80%A5D%9F%C8%20%D4Z%82x%F3%AF%16%BC%CC%93%A7%D8%DCAh%16%AD%40%84A%A8%93%AF%93%9Fg%3E%09%DD%92n%E7w()eR%F9%D2O%0C%7C%92%20%E8%B6%0Bk%1B%E9%20%17B%EBf%18%F9%AC%C6%19%F8%B2%DDT%10%3E%D0pL2%F09%8E%EF%5D%1E%05%EFsF%FD%15%B5%E4-7%F0%D8%16%C4%18%C2%E1%ED%7D%1F%1EF%BF3%86%24%3A%E6%18x%CC%F9%8D%A4o%D8%5C!%CB%D7gB%5B%A7!%24'%DA%1A%24%3A%A0%5B%9F%3E%81%B3%F1'%E5%00%E4%8A%86%10~%DE%17%E4C%F1%25%85Y%18%93g%81%5C5G%DAn%7C%24%D0%3A%EF3%89dw%DD%5C%80%BB%01%23%8F%9D%06O1qV%1A%11%3FA%24%9A%D7%F6%2F%C1%FD%11%1FQ%0C%3F%A2%B6%7C%E5%9C%E0%0E%D9%5B%2C%87%B0%3D%2F%04%A9!%E8%97%1F%0A%A5_J%FAF%B7%5C%87%9Fu%F8%8A%CA%CA%DFR%5C%11U%DE%C1%83%C1%E3%B8%F3~%A0%40%24t%AD%ED%2B%1F%20%D9ST%B1%11%60OH%DF%96%2BK%84%9E%C2%F6%9Akw%A8%18%CE%89A%C5%7D%91rH%3A%87%8EH%0Bk%14%3F_%0A%DDT%90%BA%88%A4%CC%11MAp%88Z%23%AFW%0F%B8o%2B%96%E5%97%F9WhrX%E7%D4%E7%15%FF%2F%0B%DF%97%F4%8A%18%17%F0gC8%F4%AD%5D%E7_%95%9F%A6%60%40%AB%A8%B8u%D7%F4%FA%E7%FB%25%AD5%81%9F%CE%5D%FD%12W%F4%0F%91%86%01U%C2%CDF8%10O%E6%DC%F2%EBth%C5'%5D%BE%02%D1%19%A5B%00%9Ap%B2%EAMx%0Bns%93%F5%20hs%CA8%9Aj%CB%A0%CEq%E2*3jbU%94%BB%8E%0B%01%C4%DF%8E%8F%C5n%CE%A8%80%C3R%8AR%7DWr%09w%09%1C%9FV%F0pcZ%3BQ%AC%90wOq%1F%DC%E5%07%F9%94%E0q5a7%E4%E2b~%E6%EA%BCza%E6X%F3%5E%DB%8F%C4%99%0F%3B.%5E%12%E1%BD%B1%E6%A2%CC1%B4%17%5Eg0%D2%85W9%8B%D7*%AB%9EQo!ix%E1%D3%84%0C%EC%23%3A%BBV%84%9E%D1_%7C%D2%1D%A2%EB7%AC%5CJ%3FW%10%F5%8DAz%DDF%E9R%9A.R%FA%A1%D9%E5%CBF%7F%F8J%DC%01%16%C8%3EZG%3E%3E%F6%EF%83%CFpL%90%9F%B08%DF%E7M%85c%94%A7%0B%DD%0BDO%9A%80%B8%EB%A18D%ED%AA%E8%2B%26%20%B9%22%2F%8Bt%AE%BC%92%F0%B8%16%06L%40z%80%A7%AEi%BF%06%F0%07SU%9E%84%12.i%7Ds%A3B%907SSHHn%EA%82%1D%3F%D5s%14%D6%9B%80tu%14%D4%FB%DE%A0tnk%3F%0Aa%13%10%FF%B4A%E8%AE%0E%D19%F3O%04%0D%96%EA%98~%93D%08S%3F%8E%B1%D2%E7i%5DS%25%F4%02%9AO%0DA%2B%E2%C6NZyK%94%87%8C~b1%0Cp%BARfG%87H%0F%89%99%82(%E3w%01%17%CA%3A%E4%10%03%E4%3Dc%17%1D%B9za%9B%94K%0D1%F3%94(%D7%24%E9%91%03~%BA%CA%86i%88%20%CB%A5w%13%22%AD%FB%EB%A6%20pb%89%3By%E04%ADw%8D9%88z%C6%16%5C%17)%7D%CDL*%C3%90%3B%95%95%B4%90%C7i%1D5%10%86%10%B1ev4%FB%90%2B%DE%87(%97%F4%19r2%BC%F6v%89%D7%98R%C1Q9%18%BA%F1%F5%9E%A0)H%22%CA%E0%5C%12%11MA%CA%24%06%E7%A1%9B%A6%18.%A6%D7%0D%83%E6%DE%13F%E638%7B%E7%9A%DB%1CQ%BB%CC%D8gT%5CS%A1)%C8eB%5DE%A3%1Eg%C0%14%04%F63%3C%5E%EF%0A%8B%CDAXd%26%7Fd%16%B6xl%A3%F8%9B%D28P6%8B%E3%00y%A0%FF%13%F9u%0A5!%8C%2F%A7%E3%9BR%D8!%40t%DAH%A5(%96%F6%07%10%93%90%F1%B8%F0%A8%D0%C8%C3%0E%8D%0B%04%9Ff%C7%16%9AK(u%B4%15g%10f%C4%96%D8%05%D9%8538wC%7B%D6!%0E%80%7Ff%1D%C2%014%01%C4%3B%EC%80%04%08%90%EF%C3%95%D2%0A%EA%85-A%D8%F4%CF)y%EB%D13%00%BF%B7%CE8%23%071%16a%FD%8B%A0%D6%AE%BBE%AB%0C4%1D%A6%E3lNe%C6P%00l%95x%DD%81%EAa%15%D6V%03%EA%EB%2Bw%A1UH%8E%04%7F%C4%D9%B8O%C1%1Fe%5B%11%EA%2B%06%C27%B1%10O%D0%FF%AC%E2b%19%D2%16%BD%1C%C5B%D0B%7FbM%C3%90E%88%F0%0By%E0%DBXk%1E%5C%AEC%E1%9D%5E%E3%97%3BDm%BA%F1%97%1A%11ku%8B%D0%DCi%F9%EE%12n%88%11%C2l%EE%8B%DE%0B%AC%16!%7C%12%91%CA%EC(h%0B%A4%E0%3B%C4%F5%AE-%10%B8%24%CB%B7%09%E6%B2N%3B%20%D0u%E4%9C%88%B7%FEk%99-%90f%D8%F35%BC%F5%AF%A7l%81l%87%E9-%22%D6z%D6a%0B%A4%C1%5B%D8%83%1F%23%C6%25%EC%80D%1C%A2%03%3F%C6%89%E6.%3B%20%CD%DB%E3%1C%BE%22%F6%CA%14%BF%12%E3-C%12%B2%BC%A8%E8%E78k%B5%E4Wb%FC~%0A%88C%26d%02%8E%A9%F1%AFb%E3%2F%14%CF%EDQb%FC%26%0AH%D7'%84%CA%B5'%08%11%FC%AB%99%BBM%5Dj%8C%A7%81H%DE%20%DE%CA%D7%DE%C2%DA%DC%C31%9E%A3%808D%7C%FE%06%A8%F61bZ%C5%A9%10%8A%C4%CB%BD%1B%FE%835%5E6(%1Fr%D1a%90%91%84%99%E0%C2%1AW%18%0C%C0%3D%A9%DC%81%14%10%D8%01%9B%24%8C%897%AA%83r%915%0D%FD4%90%FFn%C0nU%13%FA%0C%F6%D9r%1D%E1%9D4%A7%0B%9A%DB%1E%C5%BE%9D%3EF%0A'0r%E1i%20%15%B3%3F7%BD%E3%9D%0A%12%DB%08P%B0%91%2F%97%B2%099%A0dUo%81wG(%9B%90%EE%B0%BA%FCp5bSQ%3B%20%DE%FC3Q%E5%A1%EF%FCS6!h2Z%25%C1%C7%90crENwwE%C2%0D%F3%F8gMG%B7%7B%90%F5%E1%94%D7%9Czs%F6%B6%87*%9F%3B%2B%01*%19%F9M%B5%F5%8A%04%B9%02%9A%AD%ED%BE%09F%5B%AF%C8e%24uoa%FA%E9%CA%EB%8461%DD%E9%C5%1E%A3%8BA%86%B8C%F1%8ET%08*~%A4%A9%E3%7B%19N%01SE%B5%14%C8%96%D2%8A%BD)%10%E7w%0F%CArf%FE%BC%D4*%E4%8ErYS%20%FF%96%CEj%9D%E6%99%DAs7%26%97%1A%E3S%F64%EF%87%CCs%A5h%88m%CF%9DF%5C(%3D%C6%FF%98%D7n%9C%12%AC.%5C%F3B%E91%BE%ED%E3%90%C6%C7%F2%07%86%EAC%9Cvw%ED%0Dj%7D%ACVx%DC%991%9E%0Fh%7C%A8%82%1A%11R%9D%11%E3u%20z%BB%AD%D9%20%8D%191%DE%A5M%CF%F5%B6%0F%B3AB%19%A7Cg%83%8A%FD%10%9D%11%3D%16%19%F7%20%8E%D4%E9%AF%D5%EA%88%99B%C3%90%B4I%23%06%ED%B6~%1A%89%B6)SD0%03%D2%EE%7Ba%9E%9D%90%3Cu%F3Go%E6%91%D4%D8W%2CV%D5%7C%BEP%0B%B9%B2U8%2C%D9%08Y%09w%B5%90%F6%F8%BE%9F%06%ECc%F8%A6%C0%12-d%17%F8N2%7C~c%A4%F7%E3%2F%855%10%F4%B8rYx%DB%18J~sH%85%C4%3BR!%DE%86%AA%F0%AF%EE%FF%B8V%19%B2%08%F1%84%20%B1%01%E0Fi%C5%81%94VGGSxt%05%FA%3A%B2%FAY%B4%F2%18%EE)%01%A4%C6%F8%94%D6%B4%07%BE%10%A2%AC%A3J%99%10T%10%05%B7rMz%C4%B1%D6%D7R%3C%94H%CCx%24he%C6%1EV~%EE%ABOI%12%A7%5E%F8%14Cj%DD%C1%13%60%DDv%E6%12%FF%5E%98%DE%D2%5E%7D%14%B6mQ!)%E15%F5%F3L%F7r%60%9Ca%9C%DA%B75%AB%00%CA%AFG%15%88%FE%8C%886m%F42n%0Bj%07M%B2%F34%C0%E2b%25%C6%B7%E9o%D08x%BD%AF%9A1%85%E0%A4%CB%19%3D%04e5%9B%8C%D4%ADi%18%BA%F4u%9D%0E%CE%81)%1B%18w%E5%FA%D6%CA%99%23%F1C%CA%C19%1E%1D%DC%A9%1C%8B%F6%DC%A3%B2%E3G%02%8C%8C%89%0Bn%C5%CF%95%A7%A5%AC%7C%2Fx%96%F3%C3%DF%13%FDY%DB%23%D9%AA%93%B8%90%84~tbF%7B8%FC%86%98%06%B9%0D%8E%85%95QL%97%9C%E0%5E%9E-%3D%FD(%3EI%D2%B6%D6%AD.%18(%C7%7D3%E0%ED%5C%CD%06%F1%E4%EB~%2F%C6%C9KQ%1D%FE%99%5E%C4%F8_S%08%B8%0AK%CB%14%7C%A7%95%40%F3%D5%E8%98%94%F5%85n%91%D0I%AAB%AD%90%AA%98%20-%2F%A1%B9%3A%CD%A8v%23%A1S%F5%FC%BDL%90%1Fv%9E%09%EA4s%FD%F8%E2%A5%F2%C4Wy%99%20%B1~%DDE%9DC%96%09%89%9C%03%FB%12TW%A8%60%81%A8%DB%1Eo%D2m%1F%96%8Fe%CF%A0Z2UWm%CC%AA%95X%BC%9D%CB%0D%3F~%D7SK%89%B1%CF%98P%19%DB%1D%3F%A2%3A%B6i%C5%115%C1%10d%A6%CD%C5%A7%BEa%82%01y%D3B%D4%BE%9FU%16%17%89f%20%CD%84%0Fd3%D5%10%3Eb%06%01%C2D%C2%1B%B7L%99%FB%F6%40%097%03%B3%24%9CMS%C0%E9%D3q%AA%C6l%B1%A2%94v%40%D3%FFq%DB%E7q%91%C6%CD%1A%04%AF%FF%01%D5%B3%93%8A%C0%85b%9C%00%00%00%19fcTl%00%00%00%0C%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02q%C5%B6%1A%00%00%09%E7fdAt%00%00%00%0Dx%9C%ED%9C%7Dp%14g%1D%C7%7F%09%7B%97%BB%BDg%F7(P%0A%92r%87Ti5%85T%228%25%90%0B9%C2%8B%91%0B%82%8AH%CB)%B5vF%A7%094Ef%7C%C9%A6I%3A%5BL%09%20%FA%8F%CCd%A1%C5Qg4%99%3A%3A8%83%C3%E6%A5j%86%2Bw%D2%81%EA%1F%CAB%A0%14eJ%5E%20%40%DE%D6%BD%23o%DE%EE%3E%CF%DE%ED%3E%FF%F1%9D!%EC%3E%BF%DF%3E%9F%BD%7Dn%9F%DF%F3%FC%F6%D9%03H%97_W%02%D0kPfK4%20j%BA%06%AC8e%26%9B%A7%F8P%0Fe%A8_%2B%F4%19%AE%C5%AB%E9Cj%94%13%D4%19h!%DCj%A3%0Dq%0B%E0%17hCr%12p%86%3AD%EBk%ABd%FA%10v%906%03r%5E%DA%B5%86%3A%C4%D7%B7A%A1%0Eq%A9%B2%ED%3A%D0%D7%08%0E%AD%25!%DB%90%AE%96(%DE%E1%89%B2%11%BB%0C%3E%3Fo%18%EB%80%86%D6%DF%25W%13K%E0%ACl5%FC%0C%7B8%3B%9A%7F%9B%C8x%A7v3%CE%CC%080%03%7B%BC%A7w%24Lbpk%7C%F7%B1%90j8O%82%EC%C5%99%B7%85%C3%1B~%DE%06%DBpux%E7w%3FJ%82%9C%C1%98%AF%865%95%C8%F0%22%AE%8E%8F%02%FD%12%16%E2%EE%1D%CE%C1%3Ah%B7%EB%3C%E9%3A%EE%DB%E3%9B%AB%3E%8F%AF!%B7%F0%9E%9B%00%D9%F3%7Cm%FF!%8C%BD%B5ix%B6%82%AD!%5Ey%8F%C0%B8%B6J%C0%DA%D1%10%3B%F3%FD%7C%AC%CB-a%03%9E%C1%2F%FF%8F%8Cu%98%11%F2%84%F8H5%CE%C5%A7%AC%C7C%DCk%3CxH%5Cv%87%80%7BQ%C1%3A%D5%E0!%DF%94%7DQ%ACC%030!%7C%15%DA%E5x%06k%F6%0E%01%7C%01%EB%B1%11%18%FCYh%E2%F0%0D%EF%2F%8EA%FB%CB8%8F%02%60%04%12%04%F5c%CD%1D%DA%CD%18y%06%D3%3Fr%020%07c%0A%1E%E2U%25%9CY%E4bGg%FF%0B%DB%09%03%A3%AA%95x%08%B3%18%E7%F0%CF%80%AA%CE%95%F15%00%BF%F7%2C%09R%8E%99l%EEU%D5%DB%3F%24%204%A1Y%841h%EE%1B%18%C8%E1%3E%85%8C%D0t)J%B0%9F%C6%40%F8y%96%18%D0%12%C2%DB%5Bob%20y%85%D6%20%CB%04%BC%BD%8C%C3%40%E2%B2%25%06%22%8CA%D1%7D0%1F%AD%F0%16%C6%18I%F5%10%12%15%AEQ%0C%C4%15%B2%06%A9%0A%E2%ED%ED!d%0E9%A2Xbx%07%87%B0v%14%90%D1%E0%9B%C66%97Z%60%89%01n%B5D%C0%D9%3D%EALxaQjS%97m%E9%1F%D4%F7%26f%99%19%93%B1%1B%EA%22%25p%FC%DB%F5ef-l%94%B6%D2%22%E2%B2f%13%7F%EC%81%99A%E2%C5%C6%E5NBNF%DA%A8C%7Ck%3EX%18O%2B%D35%A6Q%C8%CC%A4%E1g%24%E03%CD%B43w%5D%00%AF%8A%E0%0A%A8%D8%E1%92%7DH%D7%06%F0%EEZH%91%01%ED%1A%E4%A9%E4%EDN%13%92%D3%06%BF%1F%FD%5E%AB%C5n%23Ky%16%F2%25Qu%40%A1%0A%81%B5e%C57UuI%02hr%BC%0DA%A4%FEy%CF%3D4%9B%22%04%3C%23H%95P%A4%14%3B%02%CDX%C9Y%06%F7%DE%E4%AE%16%11%03%02%B0M%8E2%E0%C4%0B2%EC%9D%9A%C42AP%05g%09%9A%1A%7CCl%A5K%99%D8u%8DADr%1CR%07%9DoK%DCdj%8B%1D%86-%0A%C6%3D%1B%89b%95X%AF%B6%C1%8A%89%02~N7%3E%E9%92%85%3EY%AA%F6%AD%DF%25%C3%2B%CADI%7B%9F%E00%03%15A%AE%94%ECL%B6%2Cp%B8%E6I%B1M%97c%2F%BB%0B%C1%5D%C9%8E%1E%7F%8E%12%E4%CC%B7n%C3%3BgG%81%AFU%0Fq%BB%BEA%07%B2%D6%A7J%AE%E0%F8%40%11%95%D0%E9%7B%0F%5C%F9%C1%8A%7F%E7%EF%A4R%F7%94%EA%94%1B%25%23%F8%C9%A5mq%16%E7K%E6%F2%AE%93I.n%DB%A1%BC%FD%AF%F8q%BB%A6%CB%82%5D%C8%B7%A1%93%E4rX%B1%0By%0A%18%C2%24%9A%7F%D2.%E3%E4%20%5CQ%F0.h%CC%26%E3%84%FA)%11%9F)%82d%1E%C7%96.%A8%F9%3DspI%C8%94%08i3%82P%60K%1BO%FC%20p%C1%16%A4%FD%EEQm%12MH%CA%DA%14%17%906i_%9E%ADT%3B%8C%9E%BB%A9%89%BE%87%EA%90%B69%0A%A98%FD%AEL%11R%A6%E0%9F%068%A2%8F%B5n)%0A%A8T%A0%CCA%8B%CB%23%FB%B1OP%9C%10%5B%13%9E3%8B6%04%92%F9%13%E2%3Do_%F1%3F%3EN%9D%E1Y%C0%CF%A5%8C%60%1Bg'%A0%96.%C3%B7l%40%B2%9C%8F%CCV%F1%3B%C9%FA%E3ET!%17%D4d%A3_'%3C%CD%C9N~%83D%8D%60%E2%CBd%96%D1%9B%061(%CB%2C%A9f%5E%FE%10%92%25%C4%B4%E1%B9%7Dr%9Ao%D6%0Do%AE%8E%EE%AFg%7F%B0U%15%C3e%85%3A%A4%10%FC2uH%25%DC%A2%3C%A5%D2%14%02q%09u%C8%EB%DDK%DF%A7%BE%BC%0D%95%CA%B0G%8A%9D%A3K%D9%BD%5Dl%E8%2F*%A3%1B%F6%CB%F7%8BM%AB%00%F6Q%85%F4n%06O%25%C0%15%99%22%83%EB%EDTr5%80G%A0%08AAv%B3%9F6%C4%13%82%8B%CDRj%E5!%3DqZ%CC%F7k7J%9C%26%04%5E%87%9A%DA%F8%F6%FA%01%99%26d%C6%EC%0A%95%17%0F0N%40L%EB%F05%B6%95h%FF9%02Y%A0%7D%91%D6)F%16%24D%9C%82%BC%06%F0%D6)%C3%BE%C3%2B-s%0Ar%09%F8B%8F%E1s%7F%97%1C%00%0B%C3%04%2B%F2%CB%5E%09%89%DA%C6o%D3-%B9)%80%23%10%CF%1Aw%5B%F2!%DB%F5%D1tK%D7%03%88%13%8F%0E%F9rw%B5V_W%9F.%D9%F5%7D%E7%3E%09%5C%DD8%06%3B%D0bIg%88%0C%3B%07%81%23%03%8D%CF%D5%C8%06%86s%0EB%F8_%95%19%3C%FA%07%A45%86%EC%18%24921%16%23%C7%CE%D1%87%FC%A1%A8%AC%C5%C2%F1%FC%B6%1F%D9%80h%7D%8E%95%091Z%DDM%5EQo%0A%D1b%FC-%D9%02D%00%F2%F2%ED%A0%19D%00K%0B%F25%C8O%88N%DA%B4G1*w%25!%16%06%5E%1AD%B4%00a%EF%18%95'%07%11V%C6%F6%A8%12%0E%10%9Df%C2%E1%B7%0D!Ok1%9E%CC%004%88%C8%E9%CB%0Ao%FE%2F%0D!%91%ED%F5%96z%C7%06v%808%CF%D8%D4q%EEiC%C8A%F1%80%A5%9Bq_%5E%5D%94%E4%F3%EAc%8D%15%8A%11D%B0%D8%AD%CC%FB*%1B%24%F9%1C%17%9B%D7~)%5BH%DEA%40%7D%02%22%E6%2Fo%C0%C9%EEg%B3%850%B3%DA%B87%C1%BB%5B!%F8%F1G%03%FDF%FD%825H%C1%7C%ED%AF%FB7%84%B5%98%7C%5D%60%83a%DF%83B%16%20%ECh%8F%94%5C%EFS%8Cw%EB(h6%FE%02Z%82%C0%A7%F9%15Z%E4%83%0E%BCW%F3%B9Y%92%0DH%EB%E9%CE(_%40%1A%A0%9D%0F%F9%BE%98%3D%84%AFU%D5%BE.%01Pt%BC%C0d%E9%95%D99X%82tn%25-%BD%C2Wa%09R%E0%17%81Up%1E%24%089%C6%7B*%B3J%AAM%83%7C%9E%1C%E3%2F%CBv!%C3%E4%18_%A3%AB%C3%A4%E1%CD%E4%09%12c%BCo%24%3D%A3G8)%9D%98%DE%07IA%8C%CB%E5h%A6%95%A6%CB%95%84%E0c%7C%C4vR%CC%DBK%9Ai%DD%B0%B8%DA%18%23~%94%F0%20%02El%BE%9B%E5I%B6%22i%1E%DFe3SuQ%FB7%E6%D0%3C%DEL%D7%9F%94R%A3%3E%AA%90R1D%1D%C2%0E%AC%1C%A3%0E%B9%00%C7G%A8C~%01%F1%FB%D4!Q%C8y%F0Ir)%E6%B9C%C0%14%A6%20%86%FD4r%06%B2%19%98%C4%CD%84%19%24Wq%04%B2%1F%AEA%CB%981%E4F%B8Tr%04r%FEt%05l%196%84%A0E%C7%DE38%22%0B%A1%E5%87%E0%B1y%BDF1%3E%D7%89%B5%AE%1F%85%92%7F%8F%01w%7F%FD%1D%A3%18%FFw%E0m%7D%E38%B1%09%D0%13rr%B3B%8B%AC%AF%18%C6%F8.%E8%98%995%A1%23%BC%E4%A7%A7%EB%C2eRjo%04%5Cc%CD%BDF1%BE%91%2B%26%0C%AE1%EA9%BB%F7%1E%C4%BE2%5E%E9%10%5C%9A%99%84%E8%E7%F1%A7%18%A1br%E7%1F%A2%EE%24%B0%3A1'%BCN%EBF%C6%F7%EE%C2%F2%A5)%88.%2Cum%82I%88o~%F7%FCL%18%EE%C1M%E09vvb%F9%ECn%EF%C8%5B%BB%24%80%1C%DD%99%E6V%C3%E4%E5%D2%AC%F87u%D3%D4%12%FD%10%E0%DD%F0%EF%C6w%E3j5zdu%EA%1D%804%5D%92%A7%9E%DCvj%1FU%B1%CE%E0%E7%023%DD%9D%8B%01%B4Wm%AF%D7%AFJ%D4%C6%D7%C1%F1%CDS%DFI.R%B6.v%A1%EF%CB%E9%97%1F%E5%8B%5BuoJ%A0B%C8%1D%9F%F5%FB6%D6%2B%3E%E2%C2%C6i%F2%3C%BB%D3%A5%BB%C7Z%7F%FCY%DD%3B%B2%1D%09%B8%FA%A7%07%9B%3D%81Y%EA%A3r%06%10vk%DB5%7D%E1%23%C1%FF%7B%C5%CA%1B%DE1-%7F%EC%09%ECpe%82HJ%DC%A1%2F%BBX%C9L%BB%5E%1F%AC%8C%B5%DC%9E%AC%96%2F%A9%02W%A6%BF%81%E15%1C%E2sS%D7%EB%C3%BB%C5%E0%9D%A3L%EC%CE(%F6'%BC%A1%0C!%CCk%B2Q%F1%91%C9%AD%FA%C4K%00%E5%93I%A7%3A%D9%25p%83%8A%D11%18%88%F1%CF'L%85%DA%8F%A1g%E7_%F2'2c%FC%7C%E0%3E%01%7F%2B%FAn%2C%13%08%BF%92xV%7C%C3zy%E2W%05%7CA%ED%5E%94%015%86%0D%CF%CDD%17-E%89%FFN%B4%11%5B%14%5Eg%F2F%9E%B9%D0R%2B%5E%DC%B2%C9%3B%B6'%0A%26%E9%12s%E5%60%7F%18aB%ECT%8A%8F%2F%86%BCLg%0E%E8s%B2%05%2F%DF%B4%1BC%04%97%94!%24%E3%11%1BZ%85%1C%7F_C%A7%E6%A6*%BAKf5u%E6%9F%A1%BD%8C%1F%3C%03%09%FAk3%17%1D%82E%B4%AF%16%F3%B8%06%A2%F5v%C8%84%F2%EE%C9f%26K%CB%A6%22%26K%AC%2CJ_a%F6%3F%DC%86%14Kn%F6%20%A6%FA%1Fc%CAy%EBp%20Wn%00%00%00%19fcTl%00%00%00%0E%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02_%95%7F%9A%00%00%09%C3fdAt%00%00%00%0Fx%9C%ED%9C%7Fp%14%E5%19%C7%9F%E46%B9%CBfw%2FB%D4%A0%81%DC%20%12u%A2%80%0D%15%DB(Grc%22Pr%D5%B4%8D%9DTO%E9%20T%2C%88%80Lma%01%81%83A%2F%F2c%FAcl%B3%A0V%FFp%9A%03%87%D6N3%C3%9B%842%09%04.%22%C5a%C6iVB%D0q%18%F3%13BB%F0%BAw%094%3Fv%F7y%F7%EE%DE%FC%95%EFL2%B7%FB%3E%EF%FB%D9%BDw%F7%7D%DE%F7%D9g%0F%60%B4%9Cc%F6%00t%E8%EC%8BK%2C%20%E1%D1%EA%A61%B2%A68%0FqB%13%D2%95%D04%0E%90C%AF%FA%983%C4%3C!%9F9%24U%81%0B%845%24I%05Nf%0D%D1%C6%C1%0B%CA8%406%AB%AC!%B6%CA%C6%EB%AC%19%20%84%BB%14%E6%108%B8%C2%1Bg%0B%F6%E2f%C4B%C8%DB%FD%20EC%A2%C9%B8%F0%8F%E3w%23%B59o%C5%06%9C!%BD%E0)0%2C%DC%0D%87%90S9%A0%96%7C%AA%A2%90%14%1Fl1%2C%F4BJ%A5im%E9%01X%C8%C9(%A4E%853%C4%A8p%258%CC%5Bp%B8!%9B%9F%86BB%1A%C7%10%B2%13%83p%B9%CD%03%F0%04%82%F8%E6%B5UD%9AkT*%3DUS%174%AD%2F%AC%E9%EE%23!%F3~K%CF%E9%CE%EFY%F0%B8Q%B1%AD3%E7*r%94p%BE%DB%B3M6%B5%A8~%13%0A%9E%DF%A9%1A%15o%BE%86!4%0D%808%DB%D4%E0NHw%B5%FE%02x%FD%FBI%BC%D2C%05%01%F3%AFk%00%EC%5EiU8%EC%D2-M%C9%D2%9Bk%8E%96%F1%5D6%A4%B2fN%06%C1%EF%D7%3F%94%967J)%20%8B1%83%DAl%0Db%A8%EA%B3%ABT%1C%B2%103%10%7Fn%06y%81%0B%10%94!mWP%1B%BB%0F%F6%19%B5%E4q%3Cm%3E%A8D%F5%FE%0FP%13!%03%16%0C%18%94%15%0By%DF%C7!%A9%3F%C6%DC%01%C0%FDP2%DD%A0%A8D%BA~%06o%40%CA%F1%A16%B5%A7oT%11%FD%A2b1%E7%D7h%7D%80%C0w%A8%09%7F%5Be%BB%A2_%F4K%08u%1B%F0%87k%0F%DE)%B0'%98%EA%D3%2F%F9%04%F8I%A8%03o%3A%99%B5%D7%DCB*%26%20L%E3%5D%86%06%B5n%84%E1%88%AC%18%CD%3B.%AD%A7'%08OJ%C63%A7j%0C%12~)g%83%1F9%8E%8E%FA%AB%A4%04f%19%0D%E8b%8E%82%40%02%FF%C9F%2C%80%EF%80%BD%E1%3E(%DCiP%9E%8A%0E%C3%97J%B1%C3%00%A1%1F%E0%8B%D3%C6%E5!%A3%FB%F4%96%CE%F7c%16%00%2F%99%17o%F2%E9%EF'%B7%3EQ%DC%89%98rd%DD%DD%9F_Qo~%0C%D3%DC%AE%A6%12%C2%F7%A9z%BB%A7TU%F8%FD%A7%A2%9F%DF%EE%7C%2B%5E%CA%81%B0Og%AF%C3g%0F%CF%98%1F%8E%F2%C5%B5%AB%A3%FB%C6D%5B%F4%A6%07F%91%19%BD%CB%2B9X7%C0a%01%1C%2B%A1(%3D%DB%10%993%D0%BE%DA%A0B%A2%20%01xo%00%F5%99%F1B%3C%10r%CFB%18qC%0A%FD%B7%9D%1C%DD%0B%09%EF%F8%BAp%BF%BD%8By%E4.%E9%AA%CD5g%99%87A%CB%C3%C4%3D%B7%E9%C3%AE.t.%1E'd%FB%15%5BI%23%3Ax%C6'%FBl%C2%C9%17%EEQU%96%10%C7%0D%E0*_%A9%7D%9A%E9%B9%F0%7D%90%DCtM%C8%A1%98_%C6.%E9v%A8%E7%A6%01%CD%9C%3F%0EU%D7dW)%D0%C0%16%C2%E7%FCm%12%5BBT%A9%14%BE%3Dn%B5%F4%8E%03%A4a%962%0E%94%CB%F8%A2bB%13%9A%D0%84%10%7D%BDs%1C%86%92%E5%7F%7D%8C%3D%C4%05%3B%983%04%2F%1Cf%0A%90%F6y%3C%85r%24R%CDP%17%BB%96o%99%EF%86v%EB5%8F%D1_%2C%DA%9A'%A9fY%D3%3C%EB%10%E1Qj%D3%7Cm%A5B%C4%22%C5%3A%04%DA%D0p%EBM%95f%A9%1C%81%A31%DD'%076R%1A%D6%9D%CB%D6%20%C9%EEX%20%D2%E6JH%CF%FF)~%80%9CRn'%C0%DF%88%05%02%E2R%92%A2%A6%60%0F%AE%B4)c%EE%03%0E%19%A4%FBc%82%80%B8n%03%C0Z%CCJz%B7%9B%F0%3E%0AC%1D%C0%09%FF%0E%8FG%5B%95%9D%C5%2C%AB%BA3%40p%01%D4Z%87%B4%F4x%FC%BB%9B.%95o%C1%BE%AEK%FDv%1F%08%DFi3%60%EB%90Z%15%C4%FD%C5%CA%BFk%B0%8E%AF%F2~I%00b%7B%C6%FB%D5%5Dp%F4Z%7D%86%F4g%CC%D0%EE%5D%AF%FD%A7y%2C%A4%A3s%99%9D%CB%BFG%C0%F1%5B%CC0-%F2%94%EF%C9%D8%20p%99T%BD%E8y%86%B4%E5!v%D1p%CD%7Fc%84%88%87%0B%40%DA%D3%F9%0C%96%16R%1Cc%FB%11%09%83%09R%0D%9E%DF!%86%99%A7%2C%B7%ED%D4%09%D4%C8%06%B6%9C%8E%ADQ%60g%24Dg%DF%60(J*%AB%A0%B05%DBO%01q%B8%8F%9F%C6m%E3%84%D8%09%DFJXC4%9F%C1%25%0Ab%D8%F1%BCW%AD%1E9%C6%C4%DC%F1%C6%92%F2'%DF%15%7BmZq%25%25%1F5%19%A73%24F!R%5B%E2%0F0%86%2C%04!%1B%EF%D48%D5%01%D2%7C%95%3D%C4%11%C8c%0D%99%0A%B5%ED%5B%8E%9A%3C%80J%84%B6C%81%F3b~%11%D3%E0%22%D8%5E%ACt%FE%10%60%3DS%88%D6%BC3%03X%E7%EA%B5%92%E4%20%60y7%F1JpEFH%C6%10%E8%E0%14m%12%C7%18%92%C1%3D%A8%8D.l!%82%CC%05%CA%B7%F6%B2%85%B4%AAI%DF%FAw%A5*L!%EFG%87%C7Q%EE1%C1J%CF%1B%07%88%E3%DE%B7%C6%E1L%06%9F%B4%B1%85%00%8C%C3%D75%01%89%05%C2%DA%01'%1E%22%AAz%90%A6%D3%09%85%24%13%1DH%5B~Q%15Me%CF%E8%B5%8C%AE%048%A8%EA%404%1F%BFI%BB'u%F8%23%24f%1F%C6LR%9AAj%5C%F2%23%9D%12%A7%17%A0%1D%AB%1E9D7%92%C9%19m%A6%FE%BD.%97%1ED%038e%0A%88%0B%5EGLR%7CP%20U%E9%A5lD!%14%13%2F%E1%06%1CGL%C4%01%DE%07N%BD%A0%8AS%19%04%A1%EA%85c%98%C9V%BB%0C%87%F4%0A%9C%8F%01%5D%FC%B7%AB%7C%26fb%DB%26knP%0F%12*%DFJ%95X%D1%11%E8T%11%13if%D6%0E%DD%243%A7%E4%DFEu3%CE%16%9ER0%9B%BA%C2.%A2%0B%01%8AaE%D0%FE%96%AC%FF%1AM%11%17f%B9u%F7SA%9C%DA%1DV%B8%DAA%F1(%5B%3F%E7%88%0E2'%A8%9D%8D%BD%0Ce%08r%9A%5E%EC%99%0A%C2-%BAC%FBo%C3%E7g%82%7C%E6%F9%87%C7ZQA%F8%81%CF%9E%8DDa%97%E0%90%DF%B7%7F46fM%E7OfHKU%F8%15%1CS1%88wqu%E5%D8%D4%13%3AH%B5g%C1C%92%0B%1C%3E%0C%E2%EE%98%2B%C7%0A%09%F4x%8A%8E%13%90%A6%0Em%1B%A5%5EI%19%FD%BB*b%84%EC%5B%8A%A5%5E%DDl%22%AF'-olB1%15%E4%11%EAx%D7%F6%5C%A1ol%86%1A%8D%8F%17%5D%D4%90%B6%EB%D0U%40F%14%B5i%A7~%04%F7%F1%8EJ%2B%91%BBM3F%A66%17%11%E0%EE%D6v%23-%D8%C8h%88Q%C7G%D4%A2%8C0%15%F3%B2%81%A3%F0%F1u%A3%23z%A6%D6%81%91%BE%D1%E1%CD%8FNQ1%1Fo)%E2-M%1A%05%91%2F%90(%C4%DC%C7%8B%96%9Em%F1%B7w%8Fx%1D%A7~%A3%5D%89%AC%E3%11%1F%2FdX%81D%9E%3B%0C%DB%10%17%1FnP%A2%EBx%F3JB%3C%2FU%A7%06%F9%19%24%B2%8EG%7C%FCAw%1C%10%ED%BA%EC%04%EE4%E6%E3%C57%E3%60D%20W%A3WWr%5C%D1esq%CD%E9S%A3%10%96%2B-%E1%F5%CD%F5%3E%D6%10%98S%B1%A5%3C%25%C8%16%22%E5%C1%94C%91%80%1AKH%9A%2F%FDF%A8%811%C4.%DB%BD%CC!%C92%A7%84%D6%B2%84%88%05%DA%90%95%04-%9Dr%C4_0%82%D4%3E%0B%CEw%EA6%DA6%C8%EC%82%05%7C%96%B6%C6%0B%87s%B5%E1%3E%C1%EB%F8!%A5%97%AD%84%B7%23c~%D3%A9%10q%AC%A3%5C%C7%5B%94%ED%9DU%EB%86%DE%18%E4%DC%8E%EB%B8%8F%8FE%C7%E0_%7DC%1F%C5~%3B%E5%3A%DE%AA%1A%00nen%BDrQ%A6%5B%C7%5B%D5%B9%C8%802%A4%2F%D7%C9t%EBxk%92%D6%96%D6%7C%EC%BE%B9%95%D6%AB%00%24%91DCZk%E6%05z%D5%5B%9B%D3%B3%01%8F%02XV%7DhD%8E%C4%C7%9A%8F%C7_%7C%B6%AA%B6Q%EF%C4%8A%BD%BB%12%CE%00a%F2%7D%EA%FEa%DB%0Ew%E2%19%90*%9F%9F%5C4l%3B%92%08%93pi%97%D2%DC%23%C3%B6%DF%60%C0%D0%86%5C%BB%3C%EC%0D%3D%09%7D%AD%EF%96%3E%FC%8B%05%C8%D1%AB%C3%5E%2COs%D3V%3C%FB%9B%AD%D4%10%7B%FE%9D%9C%EF%FF%9B%12%5Db%DD%17%8D%FE%02%90%5E%A6%A6%FC)Xk%F9%B7%20%0E%86%F3%3D%DA%CAy%1F%7D%0D%E9Q%97E%86-%8B%80%D0%ADJ%DB%E8%AB%A4eZ%5C%0B%08%99eA%E0%97e.%A0%BFH%40%FC%E3Jk%90%B3%1D%E2OT%D1u%B2G%B5R%0B%0B%BE%8E%14%9F%1B%84%D4J%98%07%F5S%ACP%92%E9.%A9%C1%F7%BF%85%7B%9B%E1%AB%E9%04%AA%09%FC%FD%8A%7F%115%24-%C7%E4%A7%1C%A4%9B%E9_%8E%0Fd%ED%FF%F9%87%15%E0%EF%20%DA%B5%AF%B9%D3o%CA%F4B%F11h%CDkC%0D%7D%CE%3F%A4u%E0L%02%D2%1A%12%D9nLL%FB%11%09%8F%C3g%97%A3.%E7%89%A2%C9%04Z%23K%0Bw%E2%9A%1F%D4%FE%20%A4%AF8%E1%D3%FA%7Ba%F3%1F%16E%BD%E6%A7%8F%246%2F%5Dz%F7%08%01%FB%CF%88%02P%A7B%DBs%25%1FH%DAW%F6%89%92H%06%3F%FF%E54%1F%EC%FDv%FE%8A%A6%13%DA%FC%2F%7D%F7%AB%5Bu%93%8C%A9%D2%A6J%0DR%AC(5%B6%C1%18~%B8%ED%9F%96%FB%80%C1%AF%C3%FD%0F%BA%CCn%86%20%12%A6%14%00%00%00%19fcTl%00%00%00%10%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%3D%D0I%5B%00%00%09%92fdAt%00%00%00%11x%9C%ED%9Cml%14%C7%19%C7%1F%DBk%DF%FA%3C%B7G%12J%A1q%8C%8B%5CJh%08%A6qy)5%BE%D8n%E2%26%10(%B4*%8D%D2r%A9S%02%91%8D%5DAS%A9%85zi%EC%E8HL%0C%09Q%F8%105g%E2H%E9%07%DE%83%C4%87H%EC%81%A1%94%5C%7D%84%B4%A1j*y%C1%18%DAH%15%B1%8D%DF%C0t%3B%7BN%EB%BB%DDY%E6%B9%97%B9%AA%92%FF%92-%EF%B3%CF%CCo%BD3%BB3%F3%CC%CC%02X%E5%B5Y%00%3Ec%D8R%92%08%88a%D5%00%C6)1%A5x%89%93%9A%D4%FFR%E4e%F1%0C%CF%B7%9B_%11%0E%91T%F2%BAp%C8I%80N%E1%10JxG8%84%FE'%1B%85C%AEk%CA2%E1%10y%C6%E9C%A9%E5%B0%B7%95%EF%D3q35Fhk%B3%CEu%CA%1A%C3dE%02%3B%1C%B2%9A%0BW%FD%DC%E4%FBn%60%20%BB%8F%3F%EBPt%B4Q~%80%9B%7CZ%13%82A%C6%40%BB%9F%7D%AA%14%609%2F%B9%FB%7B%BF%D1%10%90b%80_%40%98u%AA%0E%94%FBx%C9s_%EB%08%22%20%3EP%1E%F70olg%B0%B3%91%97%DC%1B9%AB%F2!%CA7%C2G%FD%DB%99%F5%F0%9D%01%87%FB%18%A3%88%F7%03%04%04%FEa%7C%F5%D5%C1%F3%8C%13%05%83%A3%3A7%F5%D1%EE0%06B%3B%5DC%1A%CB~%E9'%B7%F8%89%9B%23%1A%06B*%C3%3A%F3D%DB%89%1A%14%84%9D%DA%02%A9v%F0%9A%F56%02%D2%11%D1%10%0C%20%8F%06%D9%F6%A1%E6G%F8%A9%3F%F1%A2%20%EE%E5%B4%12%97%3Dn%87%8C%AC%ADF%24%97P%2Fa%D97%17r%FC%1Dv%C8%CD%9Ag0%C9%FD8H%FB%F9Z%D8c%B3%2Bc5%DB%11%C9%F3%FF%85%81%B8%7C%D2%C2%22%B0%DF%19%F7%ED%EA%08%229%19%C5%40%24%9F%D2T%B5%D5%EE*%7F%D6%F01%06%C2%1A%EF0%20%40%60%BB%FDm%EF)%3DQ%8AH%AE%18%AC%B7%85U%B2%8F%FE%CA%F63%CE%14%0C%23%92%83%B1%0Bs)f%1D%CCc%16%9F%C1%AE%9ED%8B%3D%9A%E9%C7%5C%8A)%F7T%CDnTJ%D8%CDI%E8%EEX%E7%95%C5X%08TM%B1%DBr%8B%BE%CF%F4%ED%24%F3%26%0E%8E%0C%E1%87%CE%E5%0C%DBA%F5gL%DF%10%F4%B4%19%F5%E3%7F_%EDSQ%DD%15S%1E%D6%E5%AC%FBt%88%E9%9C%7D%DE%BB%89%7CW%8F%FE%5D%F1%0A%A0!%B4%1E%DB5%18awc%E4%5D%17%00r%A2%95%CAE%2B%E0%1C%2C%24%12%B4%DB%C8%F0%5D%1A%D3%D9c%D0%AC%AF%AB%D1t%AB%00%D6%60!%5E%BF%DD%D6k%14%B2%9D%E5%E1%16%80%86%E8%05%AC%D6i%D1a!%11F%07%AB%CD%08%B2%9D%B3%DAv%D7%9D%194!%C4%7C%5COt!!.F%9F%C85%B0%C2%E1%8A%5C%85%15%FD%FB%17%D4t%81%AB%9F%A2%0E%0E%DBc3%23%8CdN%91%19v%3F7%A27%F0%028%89%84%A2X%BE%F4v%05%B9mn%EA%10%D7%83l%7BZ!%B00%13%90H%83%C5%20%A0%E0A%EE%CF%40%E4%CE%3D2%DF%18%14%92s%8C%B2%7D%E4%CB%AAhHd%E7%CAz%D1%0Cxk%DD%AF%853%A0m~P%3Cd%7BhD%17%CDP%CA%3CM%F7%0Af%5C%9C%FF%18x%FE(%96q%ED%C6o%C5%02LET%F1%0C%90%B4%0C%40H0%03%90I%FD%9F%2B%3F%13%90Kj%06%20%F9%B73%00%81E%99%80%5C%C0%8C%8DSU%BE%F8%20%3B%D5%FAL%40rUb%0C%EB%82!%CA7%AF%E8!Lh%23%25%F5%EC%85%7F%CE%15%CCP%5E%2B%018%23%18rx(r%00N%8Be%F4%0E%9F%CF%5DP-%B6o%A3%3C%AD%81%BB%9E9%13%90%3E%C9%F7%01bVa%5C%24%DC%05%7F%A9%0E%26%01%F1%D3_%9Bq%8C%0A%A3o%C3%E8%19F%20%89%0B1%A7-z%FC%18%D7%AC_%85O%1AAH%A2%B6%13%F3V%91i%18W%3Atl8%B1%0B0ab%AB%9E6'%F8z%1C%A2%0Eq%8A%C0%955%DE%D9%CD%A8%0B%B2%884o%A3E%BF%C3j%DEo%F7%ECV%16gK%CF%F4oJ%02%02J%05%23%10*%AD%D7l%B6%DC5%8D%D7%25%BF%3D%9C%8FR%FE%B0%3D%C3'YW3%B3%FF%A1%AB%C5%1F%EAIA%3Cw%0F%04-%26%E20U%D64u%2C%CF%9F%0C%83%AC%2B%FF%B3%19K%8A%95%EB%3C%C8v%CFs%81Yw%8D%12T%E8%DF%22e%DDt%1D%3A-Ql%09%E0%3D%9Bg%A7a%DC%A8%AB%02%FE%5C%9D%5D%3D%D1%E8_%DBSZ%AC1%B7%F5%AC%3D(%B8Z%23%23%87B%DAO%93%804%2C%D1%C1%7Ce%F8c%8D%9E%E6G%EC%9D%98%FC%EA%B01%E6%5E%F6%09%3Eo%2F%23P%A3%FE%F7%AC%F2%86%1E%E3%2B%25%16%D8%89%810l%13%A1%A8%93%FD%B1%CF%8ES%5C%2B%B5x%97%7B%FA%D82%8Eo%EA%90%C3%A7%1B%03%A2!J%A1W%ED%D6%D2%01%B9C%C1%BB%7C%11M~p%C27%E9%82%BF%E3%05h%11%0Dj%F5T%B2%E0%8B%40%8E%1A%3E%3BG%13K%01%D7%2Cc%ECcV%2C4%9D%92%0E%C1%0F%E1%92%26%18%A2%C11%D8%22%96%019%1At%13%D1%A3%C9n%08%87%BE%AE%0A%86%AC%EF-%AB%EC%D7%C52%0A%C6%96%02%24%D3n%24%A2%D0%BB%AB%00.kB%19%9E%2F%98q9Y%15%0A%F9h%95x%88%E7%1E%C8%09%02%E4%09%85%90!%F0%96%8B%8E%97%CA%F4-%1EY%FB%C2%B0P%08%95W%09%BC%24%B8%E0%C7%DB%BC%8C%40%84%87%97'!%93%90I%08%06%12%EE%C2AR%88%2Fy%7B%CB%AA%F6%60%20%D2%E6%E4W%3C%7Bi%1B%DF%A4%23%1C%03%04%19%C6bAV%99%8B%BF%11%8E%2B%A0%25y%08%05xU%BE%9F%FB%09%DAEK%09%82X%7B%E6%FD%25d%25%0F%09%8E%83x%CA%3E%A2%E7%24%0F1%DBx%C4%B2%07%E9%DC%D2S%C9Ch%1B%8FYX!i%9DCj%D2%10%DA%C6s%87%9D%60%AE%F1%3A%D6P%944%04%10c%5B%13%D22%9A%B7P(D%DA%04%EE%BE%A0%DC%AC%09%85%D4j%9EV%90w%AEBdx1YH%DEV3D%9C%B3%EB%25%8E%9FF%7F%DA%ACFE%C3A%DC%B7%3F%0A%02%7C%A8K%FA%1D%DD%3C%E6%B0%F0%05%AB%B5%97%3E%20%1A%A6%E0%D7%2B%1B%CD%1D4D%E5%B8%D1%1F%DBz%CD%9A%23%D1%06%8B%0F%E9~%FF%B4J%7C%00%9CHqH%07%5B%EC%9D%14I%3A%0Er%D80F%3Ai%0E%7F%FD%FC%D8a%E9%95%D4x%AD%DA%BA%14%93%F8%24%0D%05%F9%FB%02%DE%D2%AB%F1%2C%3C%B77%9E%B3Af%B8p%90%A3%D7y%1E%9Fg%D1%EC%07k%5C%FC%F0%A9%D7)%24%DC%C5%85%1C%C7%06%D5%A4F%08X%CE%DCO%EE%D1%A4ceUo%F1%B2h%C5B%DCcn%CB.%032%05%1At%E9%5E%DA%C6%F3%B2%A8%B3B%1C%0A%1E%94%F9%86e%91%16%AD%93%DD%20a%DA%F8%15%12%AF%E0%FF%A3%02%EB%A6%22R%0A%9D%E3%CF%89%CA%81%14s%CE%C7%C86%0FVD%1F%CF(%84%D7%C6'%B0%17%D9%E6z%A4r%05HA~%1Bo%3E%EBX%15%2BK%E2%0D%9E%E7h%A5%9BgNa%A5%0DB%7C%B2uq~%2B%85%B4%F1%DB%F8%04F%C7%C4w%A9%5D%B7C%BA%F8m%FC%E5%20%1A%02%BE%E7O%2C%8D%B7%BC%0C%90%7B%88%FFZy%03%CF%80y%03%AB%2B%B48K%60%FCV%60%3A%12XM-%CC-%B3%40%C8%8F%D2%0D%D9%A2%C9%7Dz%9C%A5%E5rm%BA!%B4%EC%FB%AA%B7%C5%1Ew%2C%89%BC%9B~%C8%D4%0D%3Bc%8F%23%A5%DE%40%DA!%92%1A%7F%DC%7D(%C7%84d%A58w%11%2F%B3%A1%8F%95%17%24%13%92%DE%D1%EFW%2C%90%9C%A0%B46%DD%90%7Cc%5E%BCAY%2C%97%A4%1B%02ak%BF%A9%E7%C0j%15%3B%8EOZd%8A%FCs%E48%3E%05%DD%92o!%DA%F8%145%C7%85%1D%C7%A7%A0QI%C5%8D%E3S%90r3%0A%C1%EC!K%5E%9E%99%15%14%92%A5%09%CA%9ED%F7%DCx%16%EC%2C%17%F8%11%82Ef%9FUi%A8%07%3A%8EOz%E8%CC%11)%26O%D0%FE%DE%97((%C0%1B%09%26%0F%F1%C1%EF%00%5E%15%BB%FC%92B%CE%C2%9F~%2C%94%01%EER8~%8C%BF%E3%3E5%B5%F7W%97%B0%16%F88%09%F1%C5%04%9B%3A%8D%C4%D6%A9%9E%1A%D0%13f%90i%0B%12%2B%F2%A1%83%C1%84!%A1%F5%AC%3D%93%F1%F2%3E%FC%B7%89%03-%CB%9F(CY%B4%5B'%25%9C%FF%E5b%5E_L%E5%93%8B%80T%F4%D5%25%00%E990%0A%ED%BFw%0C%F9%EC%8D%E2%CF%16%DC%9E%1Dc%9C%0D%A7%1F%08%EF%F3%E3!%8F%C9%C5%05%83%C7%7D%0Eg%DD%3F%88n%BD%0C%9F%DC%3D%3F%E6%9F%0DU%CE%7D%16%94D%A6%A2%0B%0A%B7%04%E68A%24%B8b.%2C%7B%FF%3B%9E%EC%98%05fJ%D8%9C%87%CEnyNGS%F6l%82%19N%90%2B%E3%BB%5Cw%14%83%7Bz%DC%AE%7C%DA%DFp%7F%8B%7C%1ADS%40y%CA%09rA%8B%8Ev%DF%A6%99%BD%19%B7%073%5B%83%BC%F2%84%86%C2y%FB%9D%20%EE%2F%BEh~%85%E1y%DDz%A2%19%E0%D2%E6z%25%81%C5%A4%11%E7%2B%3AS%D9OK%7C%83%D5%EC)%04x%B1%B1%BD%D61%9D%5D%1Dw%18%9CK5%B4z%2F%B6Zs%1AA)%DAg%18%DC%2FsL%E8Ix%C8%F1%8B%24%EDG%DE%5B%EE%B1%EDS%AE%8D.%D4%0D%7FP%A2%A3!%2B%07%3B%B69%9C%DA7%40%BE%D6%5Bi%7DV%F3%87%5BA%DA%10h%85k%85%8C%00%0Ek%E8%B1%D2a%89%15R%F6%0C%13%FCp%5B%C1%0E%F39%FFC%82%0D%88%80%AF%C3%FD%1B_%F5Z%E6%C3%146%83%00%00%00%19fcTl%00%00%00%12%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%13%80%80%DB%00%00%09~fdAt%00%00%00%13x%9C%ED%9C%7Fl%13%E7%19%C7%9F%24%17%FBl%BF%3E%93%852%AA%04%C8%986h%C5fh%23F%5BJ%9C%C4PF%19A%5B%B61%86%16WC%A8%D3h%13%A4l%AB%04%5D%5C%02%AD%C9%10%89(%7F%A0%0E%81%5BZ%A9R%D7%25%AD%26TU%A3%9C%13%08t%F3r%01%FA%C7%26*%E5%08%23%AB%26%A4%C4%24)-%24%BB%BD%8E%A1%F1%FD%F2%3Dw%E7%8B%D4-_%C9I%FC%DC%F3%DE%E7%EE%DE%F7%DE%E7%7D%9F%7B%2F%00J%05T%16%80%11%0D%9B-9%01%91%94%1A%C58%99%93%CDC%9C%D5%AC%FE%0F%F4%F7%B8%F3%0C%AE%ECG%CEC%BC%9B%0B%9D%87%B0q%AF%F3%10%17%3F%03%90b%DEe%A78%89%89%08%2F%96%B7U'%FE%AAr%84%97%E7%F9%D7%EC%40%5C%3B%ABE%C4%A1%94%AE%B6%03%E9%85%C2.%84%5B%7D%C4%0Ed%2B0Q%84%DB%FC%10~%977%FA%95%96r%60%3A%8C%CB%91%F0r4%C3%5D%BFLa%E1%26%A1%40%05V%CB%D3%8C%1F%86%5C%86%17D%B9%85%8C%C0%EB%88%82%C5G%F0%90W%C0%BDYa*%23%98%26%5C%94%C0C%0E%A6%8F%5C%A6%E1%96%D18%A2%60%40%A8%40%22Hr'x%2B%FCI1%CB%D6%3E%86%A8%11%0A%09lDB%F6%EE%BF%05%EF%CE%AD%92%F8%2C%5B%B0%16U40%80%84pk%12%3F%D82Wn%F3I%02%EEL%84%9D8%88%E7%F8%A3%DCQ%C5%3D%E1%92%8A%E2(%C8%E0A%1C%C4%5B%DB%A4%B2%15J%8C%B2%B9iC%DC%BF%C0A%B8R%B5m8%F8%C9%1CL%D9b%EFz%1C%04%5E%7D%5Ee%12v%1D%9CD%95umEB%12%C1G%94%A63m%0B%CAPeY%F5%A5%D6V7%E1%95%A6%F6%BE%D5%CF%A1%CA%BAPW5%ED%B8'%A9%82%F0uaTY%E6%0E%12%02%8D%D2(%2F%B7%9C%E0%13%25%EA%9A%D2P%D1%A7X%C8%8D7R%13r%8B%C0%93%FB%EBxMg*%DFt%DF%19x%18%0B%A1%01e%5C%FE%DDO%DB%DC7u%BD%D9%87%C4%2F%20%9Dx%88%FFkq%A5)q%5B%D7%DB%B5%23r%EFO%A1%0A%0F%19%DA%BA%40%89-%7DU%C7%B7%7D%F4pr%9E%94%E9%87%FCu%F7%A3%19%E7J%F8%7D%0A%D3%D5%09%BD~x%99%B7%AE%FFaq%9B%98%FE%5B%90D%2C%83%95%9E%81%A2%A8%DC%D6%D0%A6w%B9%26%A0%FB%81%DB%F0n%FATH%C9%09%2C%03Z%9E%A1%FE%F2h%EB%19m%D4%1B%87L%C0%BE%A1%C5%C0%A6%0F%EA%E2m%01%CB%F0N%1D%B3%7C%DC%C0%A4R%A2.%E4%25%B2%82w%A5%CF%E4%CCr4%84%99%3A%09!v%3C%CBF%82%BA%8D%EB%BBd%15W%D9%D1%B9%9B%1E%84%2F*%7C%0F%09%F1%06%D3%B1%83%0D%1F%CA6%5E%D4%EB%94%C8%CD%A0%24%95%3CQvj%EE%01%9E~%3B%A4%CE%CD%7C%A6QJ%2F33%A6%0D%F1%18%26p%CC%A4%A2%B4%7C%E9i%97T%F5o%D3)%917%08%FBt%5DnD%3E%20%9Ep%8B%F3%10%08(%EF%3F'*%5E%F8h%062w%3Fwd%A">
</div>
diff --git a/layout/reftests/position-relative/1409114-1-ref.html b/layout/reftests/position-relative/1409114-1-ref.html
new file mode 100644
index 000000000..7668cbdef
--- /dev/null
+++ b/layout/reftests/position-relative/1409114-1-ref.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<body>
+<table>
+ <col style="background:green">
+ <tr>
+ <td style="width:20px; height:20px"></td>
+ </tr>
+</table>
+</body>
+
+</html> \ No newline at end of file
diff --git a/layout/reftests/position-relative/1409114-1.html b/layout/reftests/position-relative/1409114-1.html
new file mode 100644
index 000000000..1b984ab0c
--- /dev/null
+++ b/layout/reftests/position-relative/1409114-1.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+<body>
+<table>
+ <col style="background:green">
+ <tr>
+ <td style="position:relative; left:-100px; width:20px; height:20px"></td>
+ </tr>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/layout/reftests/position-relative/1409114-2.html b/layout/reftests/position-relative/1409114-2.html
new file mode 100644
index 000000000..de18ed40d
--- /dev/null
+++ b/layout/reftests/position-relative/1409114-2.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<body style="overflow:hidden">
+<table style="position:relative; top:-50px">
+ <col style="background:green; width: 40px;">
+ <tr style="position:relative; left:-100px; height: 40px">
+ <td rowspan=2></td>
+ </tr>
+ <tr style="height: 40px"></tr>
+</table>
+</body>
+
+</html> \ No newline at end of file
diff --git a/layout/reftests/position-relative/1409114-3.html b/layout/reftests/position-relative/1409114-3.html
new file mode 100644
index 000000000..3dc66122f
--- /dev/null
+++ b/layout/reftests/position-relative/1409114-3.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<body style="overflow:hidden">
+<table style="position:relative; top:-50px">
+ <tbody style="background:green">
+ <tr style="position:relative; left:-100px; height: 40px">
+ <td rowspan=2 style="width: 40px;"></td>
+ </tr>
+ <tr style="height: 40px"></tr>
+ </tbody>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/layout/reftests/position-relative/reftest.list b/layout/reftests/position-relative/reftest.list
index 880a38e8d..495588ab7 100644
--- a/layout/reftests/position-relative/reftest.list
+++ b/layout/reftests/position-relative/reftest.list
@@ -7,3 +7,6 @@
== table-separate-3.html table-separate-3-ref.html
== table-separate-4.html table-separate-4-ref.html
== 1115999-1.html 1115999-1-ref.html
+== 1409114-1.html 1409114-1-ref.html
+!= 1409114-2.html about:blank
+!= 1409114-3.html about:blank
diff --git a/layout/reftests/table-background/border-collapse-opacity-table-column-group-ref.html b/layout/reftests/table-background/border-collapse-opacity-table-column-group-ref.html
index bb03f1525..9ec969236 100644
--- a/layout/reftests/table-background/border-collapse-opacity-table-column-group-ref.html
+++ b/layout/reftests/table-background/border-collapse-opacity-table-column-group-ref.html
@@ -10,8 +10,6 @@
html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
body { padding: 15px; }
- .o { opacity: 0.5; }
-
/*
table {
margin: 0px 3px 2px 4px;
@@ -55,8 +53,8 @@
</head>
<body>
-<div class="color o"></div>
-<div class="imagetl o"></div>
+<div class="color"></div>
+<div class="imagetl"></div>
<div class="imagebr"></div>
</body>
diff --git a/layout/reftests/table-background/border-collapse-opacity-table-column-ref.html b/layout/reftests/table-background/border-collapse-opacity-table-column-ref.html
index 7b7df902e..82795ef8b 100644
--- a/layout/reftests/table-background/border-collapse-opacity-table-column-ref.html
+++ b/layout/reftests/table-background/border-collapse-opacity-table-column-ref.html
@@ -10,8 +10,6 @@
html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
body { padding: 15px; }
- .o { opacity: 0.5; }
-
/*
table {
margin: 0px 3px 2px 4px;
@@ -55,8 +53,8 @@
</head>
<body>
-<div class="color o"></div>
-<div class="imagetl o"></div>
+<div class="color"></div>
+<div class="imagetl"></div>
<div class="imagebr"></div>
</body>
diff --git a/layout/reftests/table-background/border-separate-opacity-table-column-group-ref.html b/layout/reftests/table-background/border-separate-opacity-table-column-group-ref.html
index ad6ca2453..6985dae64 100644
--- a/layout/reftests/table-background/border-separate-opacity-table-column-group-ref.html
+++ b/layout/reftests/table-background/border-separate-opacity-table-column-group-ref.html
@@ -10,8 +10,6 @@
html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
body { padding: 15px; }
- .o { opacity: 0.5; }
-
/*
table {
margin: 0px 3px 2px 4px;
@@ -65,8 +63,8 @@
<body>
<div class="color"></div>
-<div class="imagetl o"></div>
-<div class="imagebr o"></div>
+<div class="imagetl"></div>
+<div class="imagebr"></div>
<div class="hstripe" style="top: 46px"></div>
<div class="hstripe" style="top: 70px"></div>
diff --git a/layout/reftests/table-background/border-separate-opacity-table-column-ref.html b/layout/reftests/table-background/border-separate-opacity-table-column-ref.html
index e00193dc3..a6629347d 100644
--- a/layout/reftests/table-background/border-separate-opacity-table-column-ref.html
+++ b/layout/reftests/table-background/border-separate-opacity-table-column-ref.html
@@ -10,8 +10,6 @@
html, body { margin: 0; padding: 0; border: 0; font-size: 16px; }
body { padding: 15px; }
- .o { opacity: 0.5; }
-
/*
table {
margin: 0px 3px 2px 4px;
@@ -65,8 +63,8 @@
<body>
<div class="color"></div>
-<div class="imagetl o"></div>
-<div class="imagebr o"></div>
+<div class="imagetl"></div>
+<div class="imagebr"></div>
<div class="hstripe" style="top: 46px"></div>
<div class="hstripe" style="top: 70px"></div>
diff --git a/layout/reftests/table-background/reftest.list b/layout/reftests/table-background/reftest.list
index 68dc43e95..a89115ef4 100644
--- a/layout/reftests/table-background/reftest.list
+++ b/layout/reftests/table-background/reftest.list
@@ -60,3 +60,6 @@ fuzzy-if(d2d||skiaContent,1,95000) == border-separate-opacity-table.html border-
== empty-cells-default-2.html empty-cells-default-2-ref.html
fuzzy-if(OSX,1,113) fuzzy-if(winWidget,1,12) fuzzy-if(Android,1,39) fuzzy-if(winWidget&&!layersGPUAccelerated,82,116) fuzzy-if(skiaContent,84,5500) == table-row-opacity-dynamic-1.html table-row-opacity-dynamic-1-ref.html
== table-row-opacity-dynamic-2.html table-row-opacity-dynamic-2-ref.html
+
+== table-col-overlapping.html table-col-overlapping-ref.html
+== table-col-span-1.html table-col-span-1-ref.html
diff --git a/layout/reftests/table-background/table-col-overlapping-ref.html b/layout/reftests/table-background/table-col-overlapping-ref.html
new file mode 100644
index 000000000..37515fa28
--- /dev/null
+++ b/layout/reftests/table-background/table-col-overlapping-ref.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+ td {
+ width: 20px;
+ height: 20px;
+ background-color: green;
+ }
+ table {
+ border-collapse:separate;
+ border-spacing: 0px;
+ }
+</style>
+</head>
+<body>
+<table>
+ <tr>
+ <td></td>
+ <td style="background-color: blue"></td>
+ <tr>
+ <td></td>
+ <td></td>
+ </tr>
+</table>
+</body>
+
+</html> \ No newline at end of file
diff --git a/layout/reftests/table-background/table-col-overlapping.html b/layout/reftests/table-background/table-col-overlapping.html
new file mode 100644
index 000000000..69acab789
--- /dev/null
+++ b/layout/reftests/table-background/table-col-overlapping.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+ td {
+ width: 20px;
+ height: 20px;
+ }
+ table {
+ border-collapse:separate;
+ border-spacing: 0px;
+ }
+</style>
+</head>
+<body>
+<table>
+ <col style="background: green"></col>
+ <col style="background: blue"></col>
+ <tr>
+ <td></td>
+ <td rowspan=2></td>
+ <tr>
+ <td colspan=2></td>
+ </tr>
+</table>
+</body>
+
+</html> \ No newline at end of file
diff --git a/layout/reftests/table-background/table-col-span-1-ref.html b/layout/reftests/table-background/table-col-span-1-ref.html
new file mode 100644
index 000000000..dfe953ea4
--- /dev/null
+++ b/layout/reftests/table-background/table-col-span-1-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<body>
+ <table border>
+ <col style="background:purple"></col>
+ <col style="background:purple"></col>
+ <col style="background:blue"></col>
+ <tr>
+ <td>x</td>
+ <td>y</td>
+ <td>z</td>
+ </tr>
+ </table>
+</body>
+</html> \ No newline at end of file
diff --git a/layout/reftests/table-background/table-col-span-1.html b/layout/reftests/table-background/table-col-span-1.html
new file mode 100644
index 000000000..ee9f62d7e
--- /dev/null
+++ b/layout/reftests/table-background/table-col-span-1.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<body>
+ <table border>
+ <col span=2 style="background:purple"></col>
+ <col style="background:blue"></col>
+ <tr>
+ <td>x</td>
+ <td>y</td>
+ <td>z</td>
+ </tr>
+ </table>
+</body>
+
+</html> \ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/bug1375518-2.html b/layout/reftests/table-bordercollapse/bug1375518-2.html
new file mode 100644
index 000000000..c36737622
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/bug1375518-2.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Table border collapse</title>
+<style>
+ div > span {
+ display: table-cell;
+ background-color: black;
+ height: 100px;
+ width: 100px;
+ border-radius: 50px;
+ }
+ div {
+ display: table;
+ border-collapse: collapse;
+ }
+</style>
+</head>
+<body>
+ <div><span></span></div>
+</body>
+</html> \ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/bug1375518-3.html b/layout/reftests/table-bordercollapse/bug1375518-3.html
new file mode 100644
index 000000000..1d188e19f
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/bug1375518-3.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Separated border model table</title>
+<style>
+ div > span {
+ display: table-cell;
+ background-color: black;
+ height: 100px;
+ width: 100px;
+ border-radius: 50px;
+ }
+ div {
+ display: table;
+ border-collapse: separate;
+ }
+</style>
+</head>
+<body>
+ <div><span></span></div>
+</body>
+</html> \ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/bug1375518-4-ref.html b/layout/reftests/table-bordercollapse/bug1375518-4-ref.html
new file mode 100644
index 000000000..f9a8f07d7
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/bug1375518-4-ref.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<title>border-radius and separated border model tables</title>
+<style>
+
+body { background: white; color: black }
+
+table { border-collapse: separate; margin: 1em 2px; }
+table, td { border: 1px solid black; }
+
+.radius { border: 3px solid teal; background: aqua; color: black; }
+
+</style>
+
+<h1>border-radius and separated border model tables</h1>
+
+<table>
+ <tbody>
+ <tr><td>xx</td><td>xx</td><td>xx
+ </td></tr></tbody>
+ <tbody class="radius">
+ <tr><td>xx</td><td>xx</td><td>xx
+ </td></tr><tr><td>xx</td><td>xx</td><td>xx
+ </td></tr></tbody>
+ <tbody>
+ <tr><td>xx</td><td>xx</td><td>xx
+ </td></tr></tbody>
+</table>
+
+<table>
+ <tbody><tr class="radius"><td>xx</td><td>xx</td><td>xx
+ </td></tr><tr><td>xx</td><td>xx</td><td>xx
+</td></tr></tbody></table>
+
+<table>
+ <colgroup class="radius"><col><col></colgroup><colgroup><col>
+ </colgroup><tbody><tr><td>xx</td><td>xx</td><td>xx
+ </td></tr><tr><td>xx</td><td>xx</td><td>xx
+</td></tr></tbody></table>
+
+<table>
+ <colgroup><col><col class="radius"><col>
+ </colgroup><tbody><tr><td>xx</td><td>xx</td><td>xx
+ </td></tr><tr><td>xx</td><td>xx</td><td>xx
+</td></tr></tbody></table> \ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/bug1375518-4.html b/layout/reftests/table-bordercollapse/bug1375518-4.html
new file mode 100644
index 000000000..97aebd456
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/bug1375518-4.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<title>border-radius and separated border model tables</title>
+<style>
+
+body { background: white; color: black }
+
+table { border-collapse: separate; margin: 1em 2px; }
+table, td { border: 1px solid black; }
+
+.radius { border: 3px solid teal; background: aqua; color: black; border-radius: 12px }
+
+</style>
+
+<h1>border-radius and separated border model tables</h1>
+
+<table>
+ <tbody>
+ <tr><td>xx</td><td>xx</td><td>xx
+ </td></tr></tbody>
+ <tbody class="radius">
+ <tr><td>xx</td><td>xx</td><td>xx
+ </td></tr><tr><td>xx</td><td>xx</td><td>xx
+ </td></tr></tbody>
+ <tbody>
+ <tr><td>xx</td><td>xx</td><td>xx
+ </td></tr></tbody>
+</table>
+
+<table>
+ <tbody><tr class="radius"><td>xx</td><td>xx</td><td>xx
+ </td></tr><tr><td>xx</td><td>xx</td><td>xx
+</td></tr></tbody></table>
+
+<table>
+ <colgroup class="radius"><col><col></colgroup><colgroup><col>
+ </colgroup><tbody><tr><td>xx</td><td>xx</td><td>xx
+ </td></tr><tr><td>xx</td><td>xx</td><td>xx
+</td></tr></tbody></table>
+
+<table>
+ <colgroup><col><col class="radius"><col>
+ </colgroup><tbody><tr><td>xx</td><td>xx</td><td>xx
+ </td></tr><tr><td>xx</td><td>xx</td><td>xx
+</td></tr></tbody></table> \ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/bug1375518-5-ref.html b/layout/reftests/table-bordercollapse/bug1375518-5-ref.html
new file mode 100644
index 000000000..eaf1710bc
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/bug1375518-5-ref.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<title>border-radius and border-collapse tables</title>
+<style>
+
+body { background: white; color: black }
+
+table { border-collapse: collapse; margin: 1em 2px; }
+td { border: 1px solid black; }
+
+.radius { border: 3px solid teal; background: aqua; color: black; }
+
+</style>
+
+<h1>border-radius and border-collapse tables</h1>
+
+<table>
+ <tbody>
+ <tr><td>xx<td>xx<td>xx
+ </tbody>
+ <tbody class="radius">
+ <tr><td>xx<td>xx<td>xx
+ <tr><td>xx<td>xx<td>xx
+ </tbody>
+ <tbody>
+ <tr><td>xx<td>xx<td>xx
+ </tbody>
+</table>
+
+<table>
+ <tr class="radius"><td>xx<td>xx<td>xx
+ <tr><td>xx<td>xx<td>xx
+</table>
+
+<table>
+ <colgroup class="radius"><col><col><colgroup><col>
+ <tr><td>xx<td>xx<td>xx
+ <tr><td>xx<td>xx<td>xx
+</table>
+
+<table>
+ <col><col class="radius"><col>
+ <tr><td>xx<td>xx<td>xx
+ <tr><td>xx<td>xx<td>xx
+</table>
diff --git a/layout/reftests/table-bordercollapse/bug1375518-5.html b/layout/reftests/table-bordercollapse/bug1375518-5.html
new file mode 100644
index 000000000..7f123cd42
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/bug1375518-5.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<title>border-radius and border-collapse tables</title>
+<style>
+
+body { background: white; color: black }
+
+table { border-collapse: collapse; margin: 1em 2px; }
+td { border: 1px solid black; }
+
+.radius { border: 3px solid teal; background: aqua; color: black; border-radius: 12px }
+
+</style>
+
+<h1>border-radius and border-collapse tables</h1>
+
+<table>
+ <tbody>
+ <tr><td>xx<td>xx<td>xx
+ </tbody>
+ <tbody class="radius">
+ <tr><td>xx<td>xx<td>xx
+ <tr><td>xx<td>xx<td>xx
+ </tbody>
+ <tbody>
+ <tr><td>xx<td>xx<td>xx
+ </tbody>
+</table>
+
+<table>
+ <tr class="radius"><td>xx<td>xx<td>xx
+ <tr><td>xx<td>xx<td>xx
+</table>
+
+<table>
+ <colgroup class="radius"><col><col><colgroup><col>
+ <tr><td>xx<td>xx<td>xx
+ <tr><td>xx<td>xx<td>xx
+</table>
+
+<table>
+ <col><col class="radius"><col>
+ <tr><td>xx<td>xx<td>xx
+ <tr><td>xx<td>xx<td>xx
+</table>
diff --git a/layout/reftests/table-bordercollapse/bug1375518-ref.html b/layout/reftests/table-bordercollapse/bug1375518-ref.html
new file mode 100644
index 000000000..5d58d6839
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/bug1375518-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Table border collapse</title>
+<style>
+ div {
+ background-color: black;
+ height: 100px;
+ width: 100px;
+ border-radius: 50px;
+ }
+</style>
+</head>
+<body>
+ <div></div>
+</body>
+</html> \ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/bug1375518.html b/layout/reftests/table-bordercollapse/bug1375518.html
new file mode 100644
index 000000000..101d92548
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/bug1375518.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Table border collapse</title>
+<style>
+ table {
+ border-collapse: collapse;
+ height: 100px;
+ width: 100px;
+ }
+ td {
+ background-color: black;
+ border-radius: 50px;
+ }
+</style>
+</head>
+<body>
+ <table>
+ <tr>
+ <td></td>
+ </tr>
+ </table>
+</body>
+</html> \ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/bug1394226-notref.html b/layout/reftests/table-bordercollapse/bug1394226-notref.html
new file mode 100644
index 000000000..7c4b694a9
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/bug1394226-notref.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Table border collapse</title>
+<style>
+ table {
+ border-collapse: collapse;
+ }
+ tr.odd {
+ background-color: LightCyan;
+ }
+ tr.even {
+ background-color: LightSkyBlue;
+ }
+ td {
+ border: 5px solid DarkBlue;
+ }
+ .inner td {
+ border: 5px solid red;
+ }
+ .inner tr:first-child td {
+ border-top: 5px solid DarkBlue;
+ }
+ .inner tr td:first-child {
+ border-left: 5px solid DarkBlue;
+ }
+ .inner tr:last-child td {
+ border-bottom: 5px solid DarkBlue;
+ }
+ .inner tr td:last-child {
+ border-right: 5px solid DarkBlue;
+ }
+ div {
+ height: 10px;
+ }
+</style>
+</head>
+<body>
+ <div></div>
+ <table>
+ <caption></caption>
+ <tr class="odd">
+ <td>Cell 1-1</td>
+ <td>Cell 1-2</td>
+ </tr>
+ <tr class="even">
+ <td>Cell 2-1</td>
+ <td>Cell 2-2
+ <table class="inner">
+ <tr class="odd">
+ <td>Cell 2-2/1-1</td>
+ <td>Cell 2-2/1-2</td>
+ </tr>
+ <tr class="even">
+ <td>Cell 2-2/2-1</td>
+ <td>Cell 2-2/2-2</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+</body>
+</html> \ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/bug1394226-ref.html b/layout/reftests/table-bordercollapse/bug1394226-ref.html
new file mode 100644
index 000000000..11c72d4bb
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/bug1394226-ref.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Table border collapse</title>
+<style>
+ table {
+ border-collapse: collapse;
+ }
+ tr.odd {
+ background-color: LightCyan;
+ }
+ tr.even {
+ background-color: LightSkyBlue;
+ }
+ td {
+ border: 5px solid DarkBlue;
+ }
+ div {
+ height: 10px;
+ }
+</style>
+</head>
+<body>
+ <div></div>
+ <table>
+ <tr class="odd">
+ <td>Cell 1-1</td>
+ <td>Cell 1-2</td>
+ </tr>
+ <tr class="even">
+ <td>Cell 2-1</td>
+ <td>Cell 2-2
+ <table>
+ <tr class="odd">
+ <td>Cell 2-2/1-1</td>
+ <td>Cell 2-2/1-2</td>
+ </tr>
+ <tr class="even">
+ <td>Cell 2-2/2-1</td>
+ <td>Cell 2-2/2-2</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+</body>
+</html> \ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/bug1394226.html b/layout/reftests/table-bordercollapse/bug1394226.html
new file mode 100644
index 000000000..04c8ab173
--- /dev/null
+++ b/layout/reftests/table-bordercollapse/bug1394226.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Table border collapse</title>
+<style>
+ table {
+ border-collapse: collapse;
+ }
+ tr.odd {
+ background-color: LightCyan;
+ }
+ tr.even {
+ background-color: LightSkyBlue;
+ }
+ td {
+ border: 5px solid DarkBlue;
+ }
+ caption {
+ height: 10px
+ }
+</style>
+</head>
+<body>
+ <table>
+ <caption></caption>
+ <tr class="odd">
+ <td>Cell 1-1</td>
+ <td>Cell 1-2</td>
+ </tr>
+ <tr class="even">
+ <td>Cell 2-1</td>
+ <td>Cell 2-2
+ <table>
+ <tr class="odd">
+ <td>Cell 2-2/1-1</td>
+ <td>Cell 2-2/1-2</td>
+ </tr>
+ <tr class="even">
+ <td>Cell 2-2/2-1</td>
+ <td>Cell 2-2/2-2</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+</body>
+</html> \ No newline at end of file
diff --git a/layout/reftests/table-bordercollapse/reftest.list b/layout/reftests/table-bordercollapse/reftest.list
index 5ca6f305a..2610d202d 100644
--- a/layout/reftests/table-bordercollapse/reftest.list
+++ b/layout/reftests/table-bordercollapse/reftest.list
@@ -1,3 +1,10 @@
+== bug1375518.html bug1375518-ref.html
+== bug1375518-2.html bug1375518-ref.html
+== bug1375518-3.html bug1375518-ref.html
+== bug1375518-4.html bug1375518-4-ref.html
+== bug1375518-5.html bug1375518-5-ref.html
+== bug1394226.html bug1394226-ref.html
+!= bug1394226.html bug1394226-notref.html
== bc_dyn_cell1.html bc_dyn_cell1_ref.html
== bc_dyn_cell2.html bc_dyn_cell2_ref.html
== bc_dyn_cell3.html bc_dyn_cell3_ref.html
diff --git a/layout/style/CSSLexer.h b/layout/style/CSSLexer.h
index 8b41d2778..4eff7a528 100644
--- a/layout/style/CSSLexer.h
+++ b/layout/style/CSSLexer.h
@@ -9,6 +9,7 @@
#include "mozilla/UniquePtr.h"
#include "nsCSSScanner.h"
#include "mozilla/dom/CSSLexerBinding.h"
+#include "mozilla/dom/NonRefcountedDOMObject.h"
namespace mozilla {
namespace dom {
diff --git a/layout/style/CSSStyleSheet.cpp b/layout/style/CSSStyleSheet.cpp
index 71ca6e3f2..9404fa713 100644
--- a/layout/style/CSSStyleSheet.cpp
+++ b/layout/style/CSSStyleSheet.cpp
@@ -47,6 +47,7 @@
#include "mozilla/RuleProcessorCache.h"
#include "nsIStyleSheetLinkingElement.h"
#include "nsDOMWindowUtils.h"
+#include "nsStyleSet.h"
using namespace mozilla;
using namespace mozilla::dom;
diff --git a/layout/style/Declaration.cpp b/layout/style/Declaration.cpp
index b2de159ed..9d7ca312c 100644
--- a/layout/style/Declaration.cpp
+++ b/layout/style/Declaration.cpp
@@ -14,6 +14,7 @@
#include "mozilla/css/Declaration.h"
#include "nsPrintfCString.h"
#include "gfxFontConstants.h"
+#include "nsCSSRules.h"
#include "nsStyleUtil.h"
namespace mozilla {
diff --git a/layout/style/RuleProcessorCache.cpp b/layout/style/RuleProcessorCache.cpp
index 23832c230..e2e788c56 100644
--- a/layout/style/RuleProcessorCache.cpp
+++ b/layout/style/RuleProcessorCache.cpp
@@ -13,6 +13,7 @@
#include <algorithm>
#include "nsCSSRuleProcessor.h"
#include "nsThreadUtils.h"
+#include "CSSStyleSheet.h"
using namespace mozilla;
diff --git a/layout/style/ServoStyleSet.cpp b/layout/style/ServoStyleSet.cpp
index 519d17aa8..f0230b55b 100644
--- a/layout/style/ServoStyleSet.cpp
+++ b/layout/style/ServoStyleSet.cpp
@@ -6,6 +6,7 @@
#include "mozilla/ServoStyleSet.h"
+#include "ServoBindings.h"
#include "mozilla/ServoRestyleManager.h"
#include "mozilla/dom/ChildIterator.h"
#include "nsCSSAnonBoxes.h"
diff --git a/layout/style/ServoStyleSheet.cpp b/layout/style/ServoStyleSheet.cpp
index cfeae20d2..340ecc22a 100644
--- a/layout/style/ServoStyleSheet.cpp
+++ b/layout/style/ServoStyleSheet.cpp
@@ -4,8 +4,12 @@
* 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 "ServoBindings.h"
#include "mozilla/ServoStyleSheet.h"
#include "mozilla/StyleBackendType.h"
+#include "CSSRuleList.h"
+
+using namespace mozilla::dom;
namespace mozilla {
diff --git a/layout/style/StyleRule.cpp b/layout/style/StyleRule.cpp
index 598cb7c74..6c374404d 100644
--- a/layout/style/StyleRule.cpp
+++ b/layout/style/StyleRule.cpp
@@ -36,6 +36,7 @@ class nsIDOMCSSStyleDeclaration;
class nsIDOMCSSStyleSheet;
using namespace mozilla;
+using namespace mozilla::dom;
#define NS_IF_CLONE(member_) \
PR_BEGIN_MACRO \
diff --git a/layout/style/StyleSheet.cpp b/layout/style/StyleSheet.cpp
index f307f3918..1a7178edb 100644
--- a/layout/style/StyleSheet.cpp
+++ b/layout/style/StyleSheet.cpp
@@ -6,14 +6,19 @@
#include "mozilla/StyleSheet.h"
+#include "mozilla/dom/BindingDeclarations.h" // for Optional<>
#include "mozilla/dom/CSSRuleList.h"
#include "mozilla/dom/ShadowRoot.h"
#include "mozilla/ServoStyleSheet.h"
#include "mozilla/StyleSheetInlines.h"
#include "mozilla/CSSStyleSheet.h"
+#include "mozAutoDocUpdate.h"
+#include "nsIMediaList.h"
#include "nsNullPrincipal.h"
+using namespace mozilla::dom;
+
namespace mozilla {
StyleSheet::StyleSheet(StyleBackendType aType, css::SheetParsingMode aParsingMode)
diff --git a/layout/style/moz.build b/layout/style/moz.build
index 3dc2a19af..ff06b5101 100644
--- a/layout/style/moz.build
+++ b/layout/style/moz.build
@@ -139,7 +139,7 @@ EXPORTS.mozilla.css += [
'StyleRule.h',
]
-UNIFIED_SOURCES += [
+SOURCES += [
'AnimationCollection.cpp',
'AnimationCommon.cpp',
'CounterStyleManager.cpp',
@@ -169,6 +169,7 @@ UNIFIED_SOURCES += [
'nsCSSProps.cpp',
'nsCSSPseudoClasses.cpp',
'nsCSSPseudoElements.cpp',
+ 'nsCSSRuleProcessor.cpp',
'nsCSSRules.cpp',
'nsCSSScanner.cpp',
'nsCSSValue.cpp',
@@ -181,6 +182,7 @@ UNIFIED_SOURCES += [
'nsFontFaceUtils.cpp',
'nsHTMLCSSStyleSheet.cpp',
'nsHTMLStyleSheet.cpp',
+ 'nsLayoutStylesheetCache.cpp',
'nsMediaFeatures.cpp',
'nsNthIndexCache.cpp',
'nsROCSSPrimitiveValue.cpp',
@@ -206,14 +208,6 @@ UNIFIED_SOURCES += [
'SVGAttrAnimationRuleProcessor.cpp',
]
-# nsCSSRuleProcessor.cpp needs to be built separately because it uses plarena.h.
-# nsLayoutStylesheetCache.cpp needs to be built separately because it uses
-# nsExceptionHandler.h, which includes windows.h.
-SOURCES += [
- 'nsCSSRuleProcessor.cpp',
- 'nsLayoutStylesheetCache.cpp',
-]
-
EXTRA_COMPONENTS += [
'CSSUnprefixingService.js',
'CSSUnprefixingService.manifest',
diff --git a/layout/style/nsAnimationManager.cpp b/layout/style/nsAnimationManager.cpp
index aa1b6fe78..268117738 100644
--- a/layout/style/nsAnimationManager.cpp
+++ b/layout/style/nsAnimationManager.cpp
@@ -11,6 +11,7 @@
#include "mozilla/EffectSet.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/StyleAnimationValue.h"
+#include "mozilla/dom/AnimationEffectReadOnly.h"
#include "mozilla/dom/DocumentTimeline.h"
#include "mozilla/dom/KeyframeEffectReadOnly.h"
@@ -30,6 +31,7 @@ using namespace mozilla;
using namespace mozilla::css;
using mozilla::dom::Animation;
using mozilla::dom::AnimationPlayState;
+using mozilla::dom::AnimationEffectReadOnly;
using mozilla::dom::KeyframeEffectReadOnly;
using mozilla::dom::CSSAnimation;
diff --git a/layout/style/nsCSSProps.h b/layout/style/nsCSSProps.h
index e67e1d41d..aabbac07a 100644
--- a/layout/style/nsCSSProps.h
+++ b/layout/style/nsCSSProps.h
@@ -345,7 +345,7 @@ public:
// KTableEntry objects can be initialized either with an int16_t value
// or a value of an enumeration type that can fit within an int16_t.
- constexpr KTableEntry(nsCSSKeyword aKeyword, int16_t aValue)
+ KTableEntry(nsCSSKeyword aKeyword, int16_t aValue)
: mKeyword(aKeyword)
, mValue(aValue)
{
@@ -353,7 +353,7 @@ public:
template<typename T,
typename = typename std::enable_if<std::is_enum<T>::value>::type>
- constexpr KTableEntry(nsCSSKeyword aKeyword, T aValue)
+ KTableEntry(nsCSSKeyword aKeyword, T aValue)
: mKeyword(aKeyword)
, mValue(static_cast<int16_t>(aValue))
{
diff --git a/layout/style/nsCSSPseudoClassList.h b/layout/style/nsCSSPseudoClassList.h
index 701578338..ec7bfcb77 100644
--- a/layout/style/nsCSSPseudoClassList.h
+++ b/layout/style/nsCSSPseudoClassList.h
@@ -38,6 +38,8 @@
* automatically defined to CSS_PSEUDO_CLASS.
*/
+#include "nsCSSPseudoElements.h"
+
// OUTPUT_CLASS=nsCSSPseudoClasses
// MACRO_NAME=CSS_PSEUDO_CLASS
diff --git a/layout/style/nsCSSPseudoClasses.cpp b/layout/style/nsCSSPseudoClasses.cpp
index 9b26459dd..a174525b1 100644
--- a/layout/style/nsCSSPseudoClasses.cpp
+++ b/layout/style/nsCSSPseudoClasses.cpp
@@ -13,6 +13,7 @@
#include "nsString.h"
using namespace mozilla;
+using namespace mozilla::css;
// define storage for all atoms
#define CSS_PSEUDO_CLASS(_name, _value, _flags, _pref) \
diff --git a/layout/style/nsCSSPseudoClasses.h b/layout/style/nsCSSPseudoClasses.h
index ca1cb2f39..55e5bf9d2 100644
--- a/layout/style/nsCSSPseudoClasses.h
+++ b/layout/style/nsCSSPseudoClasses.h
@@ -9,6 +9,8 @@
#define nsCSSPseudoClasses_h___
#include "nsStringFwd.h"
+#include "mozilla/CSSEnabledState.h"
+#include "nsStyleStruct.h"
// The following two flags along with the pref defines where this pseudo
// class can be used:
diff --git a/layout/style/nsCSSScanner.cpp b/layout/style/nsCSSScanner.cpp
index 2110be78c..b1524a3bb 100644
--- a/layout/style/nsCSSScanner.cpp
+++ b/layout/style/nsCSSScanner.cpp
@@ -14,6 +14,8 @@
#include "mozilla/Likely.h"
#include <algorithm>
+using mozilla::IsNaN;
+
/* Character class tables and related helper functions. */
static const uint8_t IS_HEX_DIGIT = 0x01;
diff --git a/layout/style/nsCSSValue.cpp b/layout/style/nsCSSValue.cpp
index baf5b7897..0a905a055 100644
--- a/layout/style/nsCSSValue.cpp
+++ b/layout/style/nsCSSValue.cpp
@@ -6,11 +6,12 @@
/* representation of simple property values within CSS declarations */
+#include "mozilla/ArrayUtils.h"
+
#include "nsCSSValue.h"
#include "mozilla/StyleSheetInlines.h"
#include "mozilla/Likely.h"
-#include "mozilla/MemoryReporting.h"
#include "mozilla/Move.h"
#include "mozilla/css/ImageLoader.h"
#include "CSSCalc.h"
@@ -18,8 +19,6 @@
#include "imgIRequest.h"
#include "imgRequestProxy.h"
#include "nsIDocument.h"
-#include "nsIPrincipal.h"
-#include "nsCSSProps.h"
#include "nsNetUtil.h"
#include "nsPresContext.h"
#include "nsStyleUtil.h"
@@ -27,7 +26,9 @@
#include "nsStyleSet.h"
#include "nsContentUtils.h"
+
using namespace mozilla;
+using namespace mozilla::css;
static bool
IsLocalRefURL(nsStringBuffer* aString)
diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp
index 910c1de8a..db39ef727 100644
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -54,6 +54,8 @@
using namespace mozilla;
using namespace mozilla::dom;
+typedef nsCSSProps::KTableEntry KTableEntry;
+
#if defined(DEBUG_bzbarsky) || defined(DEBUG_caillon)
#define DEBUG_ComputedDOMStyle
#endif
diff --git a/layout/style/nsDOMCSSAttrDeclaration.cpp b/layout/style/nsDOMCSSAttrDeclaration.cpp
index ce638a9c2..f94998478 100644
--- a/layout/style/nsDOMCSSAttrDeclaration.cpp
+++ b/layout/style/nsDOMCSSAttrDeclaration.cpp
@@ -10,6 +10,7 @@
#include "mozilla/css/Declaration.h"
#include "mozilla/css/StyleRule.h"
#include "mozilla/dom/Element.h"
+#include "mozilla/dom/DocGroup.h"
#include "nsIDocument.h"
#include "nsIDOMMutationEvent.h"
#include "nsIURI.h"
@@ -17,8 +18,12 @@
#include "nsWrapperCacheInlines.h"
#include "nsIFrame.h"
#include "ActiveLayerTracker.h"
+#include "ServoDeclarationBlock.h"
+#include "StyleSetHandle.h"
+#include "DeclarationBlockInlines.h"
using namespace mozilla;
+using namespace mozilla::dom;
nsDOMCSSAttributeDeclaration::nsDOMCSSAttributeDeclaration(dom::Element* aElement,
bool aIsSMILOverride)
diff --git a/layout/style/nsMediaFeatures.cpp b/layout/style/nsMediaFeatures.cpp
index 854236e51..f33f8dd33 100644
--- a/layout/style/nsMediaFeatures.cpp
+++ b/layout/style/nsMediaFeatures.cpp
@@ -19,6 +19,7 @@
#include "nsDeviceContext.h"
#include "nsIBaseWindow.h"
#include "nsIDocument.h"
+#include "nsIWidget.h"
#include "nsContentUtils.h"
#include "mozilla/StyleSheet.h"
#include "mozilla/StyleSheetInlines.h"
diff --git a/layout/style/nsStyleContext.cpp b/layout/style/nsStyleContext.cpp
index 7ad260f1b..4b1a14897 100644
--- a/layout/style/nsStyleContext.cpp
+++ b/layout/style/nsStyleContext.cpp
@@ -12,6 +12,8 @@
#include "nsCSSAnonBoxes.h"
#include "nsCSSPseudoElements.h"
#include "nsStyleConsts.h"
+#include "nsStyleStruct.h"
+#include "nsStyleStructInlines.h"
#include "nsString.h"
#include "nsPresContext.h"
#include "nsIStyleRule.h"
@@ -35,6 +37,7 @@
#include "mozilla/ReflowInput.h"
#include "nsLayoutUtils.h"
#include "nsCoord.h"
+#include "nsFontMetrics.h"
// Ensure the binding function declarations in nsStyleContext.h matches
// those in ServoBindings.h.
diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp
index 72c103724..200f934c5 100644
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -40,6 +40,7 @@
#include <algorithm>
using namespace mozilla;
+using namespace mozilla::dom;
static_assert((((1 << nsStyleStructID_Length) - 1) &
~(NS_STYLE_INHERIT_MASK)) == 0,
diff --git a/layout/style/nsStyleUtil.cpp b/layout/style/nsStyleUtil.cpp
index 840cd03c3..5f51192bd 100644
--- a/layout/style/nsStyleUtil.cpp
+++ b/layout/style/nsStyleUtil.cpp
@@ -15,6 +15,7 @@
#include "nsIContentSecurityPolicy.h"
#include "nsIURI.h"
#include "nsPrintfCString.h"
+#include "nsContentUtils.h"
using namespace mozilla;
diff --git a/layout/style/res/html.css b/layout/style/res/html.css
index 1f572467f..44e41c8d0 100644
--- a/layout/style/res/html.css
+++ b/layout/style/res/html.css
@@ -637,7 +637,6 @@ hr[size="1"] {
img:-moz-broken::before, input:-moz-broken::before,
img:-moz-user-disabled::before, input:-moz-user-disabled::before,
-img:-moz-loading::before, input:-moz-loading::before,
applet:-moz-empty-except-children-with-localname(param):-moz-broken::before,
applet:-moz-empty-except-children-with-localname(param):-moz-user-disabled::before {
content: -moz-alt-content !important;
diff --git a/layout/svg/SVGFEUnstyledLeafFrame.cpp b/layout/svg/SVGFEUnstyledLeafFrame.cpp
index 083c0f27d..bc9258527 100644
--- a/layout/svg/SVGFEUnstyledLeafFrame.cpp
+++ b/layout/svg/SVGFEUnstyledLeafFrame.cpp
@@ -25,7 +25,6 @@ public:
NS_DECL_FRAMEARENA_HELPERS
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override {}
virtual bool IsFrameOfType(uint32_t aFlags) const override
diff --git a/layout/svg/SVGTextFrame.cpp b/layout/svg/SVGTextFrame.cpp
index 6ba267ee8..fe4df3f4d 100644
--- a/layout/svg/SVGTextFrame.cpp
+++ b/layout/svg/SVGTextFrame.cpp
@@ -37,6 +37,7 @@
#include "nsTextNode.h"
#include "SVGAnimatedNumberList.h"
#include "SVGContentUtils.h"
+#include "SVGContextPaint.h"
#include "SVGLengthList.h"
#include "SVGNumberList.h"
#include "SVGPathElement.h"
@@ -3161,7 +3162,6 @@ SVGTextFrame::Init(nsIContent* aContent,
void
SVGTextFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (NS_SUBTREE_DIRTY(this)) {
diff --git a/layout/svg/SVGTextFrame.h b/layout/svg/SVGTextFrame.h
index 9c672c6a5..508ed1724 100644
--- a/layout/svg/SVGTextFrame.h
+++ b/layout/svg/SVGTextFrame.h
@@ -224,7 +224,6 @@ public:
}
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
/**
diff --git a/layout/svg/moz.build b/layout/svg/moz.build
index b1481f4ef..69d5d2a3b 100644
--- a/layout/svg/moz.build
+++ b/layout/svg/moz.build
@@ -21,7 +21,7 @@ EXPORTS.mozilla += [
'SVGContextPaint.h',
]
-UNIFIED_SOURCES += [
+SOURCES += [
'nsCSSClipPathInstance.cpp',
'nsCSSFilterInstance.cpp',
'nsFilterInstance.cpp',
diff --git a/layout/svg/nsFilterInstance.cpp b/layout/svg/nsFilterInstance.cpp
index fe52b8a8f..0735807ce 100644
--- a/layout/svg/nsFilterInstance.cpp
+++ b/layout/svg/nsFilterInstance.cpp
@@ -28,6 +28,7 @@
using namespace mozilla;
using namespace mozilla::dom;
using namespace mozilla::gfx;
+using namespace mozilla::image;
FilterDescription
nsFilterInstance::GetFilterDescription(nsIContent* aFilteredElement,
diff --git a/layout/svg/nsISVGChildFrame.h b/layout/svg/nsISVGChildFrame.h
index c9fd0f12a..f74ff89c0 100644
--- a/layout/svg/nsISVGChildFrame.h
+++ b/layout/svg/nsISVGChildFrame.h
@@ -8,6 +8,7 @@
#include "gfxRect.h"
#include "nsQueryFrame.h"
+#include "imgIContainer.h"
class gfxContext;
class gfxMatrix;
diff --git a/layout/svg/nsSVGClipPathFrame.h b/layout/svg/nsSVGClipPathFrame.h
index 42a8d16ff..046ebb169 100644
--- a/layout/svg/nsSVGClipPathFrame.h
+++ b/layout/svg/nsSVGClipPathFrame.h
@@ -37,7 +37,6 @@ public:
// nsIFrame methods:
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override {}
// nsSVGClipPathFrame methods:
diff --git a/layout/svg/nsSVGContainerFrame.cpp b/layout/svg/nsSVGContainerFrame.cpp
index 750dcc9da..5c18cad42 100644
--- a/layout/svg/nsSVGContainerFrame.cpp
+++ b/layout/svg/nsSVGContainerFrame.cpp
@@ -17,6 +17,7 @@
#include "SVGTextFrame.h"
using namespace mozilla;
+using namespace mozilla::image;
NS_QUERYFRAME_HEAD(nsSVGContainerFrame)
NS_QUERYFRAME_ENTRY(nsSVGContainerFrame)
@@ -140,7 +141,6 @@ nsSVGDisplayContainerFrame::Init(nsIContent* aContent,
void
nsSVGDisplayContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// mContent could be a XUL element so check for an SVG element before casting
@@ -149,7 +149,7 @@ nsSVGDisplayContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
return;
}
DisplayOutline(aBuilder, aLists);
- return BuildDisplayListForNonBlockChildren(aBuilder, aDirtyRect, aLists);
+ return BuildDisplayListForNonBlockChildren(aBuilder, aLists);
}
void
diff --git a/layout/svg/nsSVGContainerFrame.h b/layout/svg/nsSVGContainerFrame.h
index f4a01e155..8a6cdd7ce 100644
--- a/layout/svg/nsSVGContainerFrame.h
+++ b/layout/svg/nsSVGContainerFrame.h
@@ -83,7 +83,6 @@ public:
}
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override {}
virtual bool ComputeCustomOverflow(nsOverflowAreas& aOverflowAreas) override;
@@ -133,7 +132,6 @@ public:
nsIFrame* aPrevInFlow) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual bool IsSVGTransformed(Matrix *aOwnTransform = nullptr,
diff --git a/layout/svg/nsSVGFilterFrame.h b/layout/svg/nsSVGFilterFrame.h
index 223c787f6..f2f321522 100644
--- a/layout/svg/nsSVGFilterFrame.h
+++ b/layout/svg/nsSVGFilterFrame.h
@@ -45,7 +45,6 @@ public:
// nsIFrame methods:
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override {}
virtual nsresult AttributeChanged(int32_t aNameSpaceID,
diff --git a/layout/svg/nsSVGFilterInstance.cpp b/layout/svg/nsSVGFilterInstance.cpp
index 59b5a27ba..462c0098b 100644
--- a/layout/svg/nsSVGFilterInstance.cpp
+++ b/layout/svg/nsSVGFilterInstance.cpp
@@ -13,6 +13,7 @@
#include "mozilla/dom/HTMLCanvasElement.h"
#include "mozilla/dom/SVGFilterElement.h"
#include "nsReferencedElement.h"
+#include "nsSVGEffects.h"
#include "nsSVGFilterFrame.h"
#include "nsSVGUtils.h"
#include "SVGContentUtils.h"
diff --git a/layout/svg/nsSVGForeignObjectFrame.cpp b/layout/svg/nsSVGForeignObjectFrame.cpp
index afa5912d2..f8584a4f1 100644
--- a/layout/svg/nsSVGForeignObjectFrame.cpp
+++ b/layout/svg/nsSVGForeignObjectFrame.cpp
@@ -163,14 +163,13 @@ nsSVGForeignObjectFrame::Reflow(nsPresContext* aPresContext,
void
nsSVGForeignObjectFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (!static_cast<const nsSVGElement*>(mContent)->HasValidDimensions()) {
return;
}
DisplayOutline(aBuilder, aLists);
- BuildDisplayListForNonBlockChildren(aBuilder, aDirtyRect, aLists);
+ BuildDisplayListForNonBlockChildren(aBuilder, aLists);
}
bool
diff --git a/layout/svg/nsSVGForeignObjectFrame.h b/layout/svg/nsSVGForeignObjectFrame.h
index 57df6d5b5..4bb94bdab 100644
--- a/layout/svg/nsSVGForeignObjectFrame.h
+++ b/layout/svg/nsSVGForeignObjectFrame.h
@@ -47,7 +47,6 @@ public:
nsReflowStatus& aStatus) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
/**
diff --git a/layout/svg/nsSVGIntegrationUtils.h b/layout/svg/nsSVGIntegrationUtils.h
index e3eb3c5f2..471e3fb04 100644
--- a/layout/svg/nsSVGIntegrationUtils.h
+++ b/layout/svg/nsSVGIntegrationUtils.h
@@ -10,6 +10,7 @@
#include "gfxRect.h"
#include "nsRegionFwd.h"
#include "mozilla/gfx/Rect.h"
+#include "imgIContainer.h"
class gfxContext;
class gfxDrawable;
diff --git a/layout/svg/nsSVGMarkerFrame.cpp b/layout/svg/nsSVGMarkerFrame.cpp
index 93b76b17f..af19cc025 100644
--- a/layout/svg/nsSVGMarkerFrame.cpp
+++ b/layout/svg/nsSVGMarkerFrame.cpp
@@ -15,6 +15,7 @@
using namespace mozilla::dom;
using namespace mozilla::gfx;
+using namespace mozilla::image;
nsContainerFrame*
NS_NewSVGMarkerFrame(nsIPresShell* aPresShell, nsStyleContext* aContext)
diff --git a/layout/svg/nsSVGMarkerFrame.h b/layout/svg/nsSVGMarkerFrame.h
index 22ac01709..187aed140 100644
--- a/layout/svg/nsSVGMarkerFrame.h
+++ b/layout/svg/nsSVGMarkerFrame.h
@@ -52,7 +52,6 @@ public:
#endif
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override {}
virtual nsresult AttributeChanged(int32_t aNameSpaceID,
diff --git a/layout/svg/nsSVGMaskFrame.h b/layout/svg/nsSVGMaskFrame.h
index 380306a48..2a9486fa5 100644
--- a/layout/svg/nsSVGMaskFrame.h
+++ b/layout/svg/nsSVGMaskFrame.h
@@ -73,7 +73,6 @@ public:
#endif
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override {}
/**
diff --git a/layout/svg/nsSVGOuterSVGFrame.cpp b/layout/svg/nsSVGOuterSVGFrame.cpp
index b1ee54eb9..16dfc2b37 100644
--- a/layout/svg/nsSVGOuterSVGFrame.cpp
+++ b/layout/svg/nsSVGOuterSVGFrame.cpp
@@ -18,9 +18,12 @@
#include "mozilla/dom/SVGSVGElement.h"
#include "mozilla/dom/SVGViewElement.h"
#include "nsSubDocumentFrame.h"
+#include "gfxMatrix.h"
using namespace mozilla;
using namespace mozilla::dom;
+using namespace mozilla::gfx;
+using namespace mozilla::image;
//----------------------------------------------------------------------
// Implementation helpers
@@ -731,7 +734,6 @@ nsSVGOuterSVGFrame::AttributeChanged(int32_t aNameSpaceID,
void
nsSVGOuterSVGFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (GetStateBits() & NS_FRAME_IS_NONDISPLAY) {
@@ -755,7 +757,7 @@ nsSVGOuterSVGFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
nsDisplayList *contentList = aLists.Content();
nsDisplayListSet set(contentList, contentList, contentList,
contentList, contentList, contentList);
- BuildDisplayListForNonBlockChildren(aBuilder, aDirtyRect, set);
+ BuildDisplayListForNonBlockChildren(aBuilder, set);
} else if (IsVisibleForPainting(aBuilder) || !aBuilder->IsForPainting()) {
aLists.Content()->AppendNewToTop(
new (aBuilder) nsDisplayOuterSVG(aBuilder, this));
diff --git a/layout/svg/nsSVGOuterSVGFrame.h b/layout/svg/nsSVGOuterSVGFrame.h
index 6d29234ac..ee59b7d1c 100644
--- a/layout/svg/nsSVGOuterSVGFrame.h
+++ b/layout/svg/nsSVGOuterSVGFrame.h
@@ -66,7 +66,6 @@ public:
virtual void UnionChildOverflow(nsOverflowAreas& aOverflowAreas) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void Init(nsIContent* aContent,
diff --git a/layout/svg/nsSVGPaintServerFrame.h b/layout/svg/nsSVGPaintServerFrame.h
index 6b568f872..ff2c6f8b4 100644
--- a/layout/svg/nsSVGPaintServerFrame.h
+++ b/layout/svg/nsSVGPaintServerFrame.h
@@ -58,7 +58,6 @@ public:
// nsIFrame methods:
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override {}
virtual bool IsFrameOfType(uint32_t aFlags) const override
diff --git a/layout/svg/nsSVGPathGeometryFrame.cpp b/layout/svg/nsSVGPathGeometryFrame.cpp
index 32cd0e496..50eec2b92 100644
--- a/layout/svg/nsSVGPathGeometryFrame.cpp
+++ b/layout/svg/nsSVGPathGeometryFrame.cpp
@@ -259,7 +259,6 @@ nsSVGPathGeometryFrame::IsSVGTransformed(gfx::Matrix *aOwnTransform,
void
nsSVGPathGeometryFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (!static_cast<const nsSVGElement*>(mContent)->HasValidDimensions() ||
diff --git a/layout/svg/nsSVGPathGeometryFrame.h b/layout/svg/nsSVGPathGeometryFrame.h
index 6b7c75d97..d2d63f043 100644
--- a/layout/svg/nsSVGPathGeometryFrame.h
+++ b/layout/svg/nsSVGPathGeometryFrame.h
@@ -88,7 +88,6 @@ public:
#endif
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
// nsSVGPathGeometryFrame methods
diff --git a/layout/svg/nsSVGStopFrame.cpp b/layout/svg/nsSVGStopFrame.cpp
index 1b75fa102..28875ad25 100644
--- a/layout/svg/nsSVGStopFrame.cpp
+++ b/layout/svg/nsSVGStopFrame.cpp
@@ -36,7 +36,6 @@ public:
#endif
void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override {}
virtual nsresult AttributeChanged(int32_t aNameSpaceID,
diff --git a/layout/svg/nsSVGSwitchFrame.cpp b/layout/svg/nsSVGSwitchFrame.cpp
index 26e77071b..3b71ff3fb 100644
--- a/layout/svg/nsSVGSwitchFrame.cpp
+++ b/layout/svg/nsSVGSwitchFrame.cpp
@@ -11,6 +11,7 @@
#include "nsSVGUtils.h"
using namespace mozilla::gfx;
+using namespace mozilla::image;
class nsSVGSwitchFrame : public nsSVGGFrame
{
@@ -44,7 +45,6 @@ public:
#endif
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
// nsISVGChildFrame interface:
@@ -93,12 +93,11 @@ nsSVGSwitchFrame::GetType() const
void
nsSVGSwitchFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
nsIFrame* kid = GetActiveChildFrame();
if (kid) {
- BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists);
+ BuildDisplayListForChild(aBuilder, kid, aLists);
}
}
diff --git a/layout/svg/nsSVGUtils.cpp b/layout/svg/nsSVGUtils.cpp
index c3394e292..103a4ce1a 100644
--- a/layout/svg/nsSVGUtils.cpp
+++ b/layout/svg/nsSVGUtils.cpp
@@ -58,6 +58,7 @@
using namespace mozilla;
using namespace mozilla::dom;
using namespace mozilla::gfx;
+using namespace mozilla::image;
static bool sSVGPathCachingEnabled;
static bool sSVGDisplayListHitTestingEnabled;
diff --git a/layout/tables/FixedTableLayoutStrategy.cpp b/layout/tables/FixedTableLayoutStrategy.cpp
index 427765795..d69946a33 100644
--- a/layout/tables/FixedTableLayoutStrategy.cpp
+++ b/layout/tables/FixedTableLayoutStrategy.cpp
@@ -15,6 +15,10 @@
#include "nsTableCellFrame.h"
#include <algorithm>
+#include "mozilla/WritingModes.h"
+
+using namespace mozilla;
+
FixedTableLayoutStrategy::FixedTableLayoutStrategy(nsTableFrame *aTableFrame)
: nsITableLayoutStrategy(nsITableLayoutStrategy::Fixed)
, mTableFrame(aTableFrame)
diff --git a/layout/tables/SpanningCellSorter.cpp b/layout/tables/SpanningCellSorter.cpp
index c67d784bb..686b02d89 100644
--- a/layout/tables/SpanningCellSorter.cpp
+++ b/layout/tables/SpanningCellSorter.cpp
@@ -12,6 +12,8 @@
#include "nsQuickSort.h"
#include "nsIPresShell.h"
+using mozilla::fallible;
+
//#define DEBUG_SPANNING_CELL_SORTER
SpanningCellSorter::SpanningCellSorter()
diff --git a/layout/tables/crashtests/crashtests.list b/layout/tables/crashtests/crashtests.list
index f110053f1..40b1ba82e 100644
--- a/layout/tables/crashtests/crashtests.list
+++ b/layout/tables/crashtests/crashtests.list
@@ -109,7 +109,7 @@ asserts(8) load 420654-1.xhtml # bug 458238, bug 436123, bug 457397
load 423514-1.xhtml
load 430374.html
load 444431-1.html
-load 444702-1.html
+asserts(1) load 444702-1.html # nscoord overflow.
load 448988-1.xhtml
load 450311-1.html
load 451170.html
diff --git a/layout/tables/moz.build b/layout/tables/moz.build
index e28e21ee0..554ffebec 100644
--- a/layout/tables/moz.build
+++ b/layout/tables/moz.build
@@ -13,7 +13,7 @@ EXPORTS += [
'nsITableCellLayout.h',
]
-UNIFIED_SOURCES += [
+SOURCES += [
'BasicTableLayoutStrategy.cpp',
'FixedTableLayoutStrategy.cpp',
'nsCellMap.cpp',
diff --git a/layout/tables/nsTableCellFrame.cpp b/layout/tables/nsTableCellFrame.cpp
index 8b811df1e..ee05565a9 100644
--- a/layout/tables/nsTableCellFrame.cpp
+++ b/layout/tables/nsTableCellFrame.cpp
@@ -450,7 +450,6 @@ nsTableCellFrame::ShouldPaintBackground(nsDisplayListBuilder* aBuilder)
void
nsTableCellFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
DO_GLOBAL_REFLOW_COUNT_DSP("nsTableCellFrame");
@@ -462,14 +461,14 @@ nsTableCellFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
new (aBuilder) nsDisplayBoxShadowOuter(aBuilder, this));
}
+ nsRect bgRect = GetRectRelativeToSelf() + aBuilder->ToReferenceFrame(this);
+
// display background if we need to.
if (aBuilder->IsForEventDelivery() ||
!StyleBackground()->IsTransparent() ||
StyleDisplay()->mAppearance) {
- nsDisplayBackgroundImage::AppendBackgroundItemsToTop(aBuilder,
- this,
- GetRectRelativeToSelf(),
- aLists.BorderBackground());
+ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(
+ aBuilder, this, bgRect, aLists.BorderBackground());
}
// display inset box-shadows if we need to.
@@ -488,16 +487,49 @@ nsTableCellFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
"TableCellSelection",
nsDisplayItem::TYPE_TABLE_CELL_SELECTION));
}
+
+ // This can be null if display list building initiated in the middle
+ // of the table, which can happen with background-clip:text and
+ // -moz-element.
+ nsDisplayTableBackgroundSet* backgrounds =
+ aBuilder->GetTableBackgroundSet();
+ if (backgrounds) {
+ // Compute bgRect relative to reference frame, but using the
+ // normal (without position:relative offsets) positions for the
+ // cell, row and row group.
+ bgRect = GetRectRelativeToSelf() + GetNormalPosition();
+
+ nsTableRowFrame* row = GetTableRowFrame();
+ bgRect += row->GetNormalPosition();
+
+ nsTableRowGroupFrame* rowGroup = row->GetTableRowGroupFrame();
+ bgRect += rowGroup->GetNormalPosition();
+
+ bgRect += backgrounds->TableToReferenceFrame();
+
+ // Create backgrounds items as needed for the column and column
+ // group that this cell occupies.
+ nsTableColFrame* col = backgrounds->GetColForIndex(ColIndex());
+ nsTableColGroupFrame* colGroup = col->GetTableColGroupFrame();
+
+ Maybe<nsDisplayListBuilder::AutoBuildingDisplayList> buildingForColGroup;
+ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(
+ aBuilder, colGroup, bgRect, backgrounds->ColGroupBackgrounds(), false,
+ nullptr, colGroup->GetRect() + backgrounds->TableToReferenceFrame(),
+ this, &buildingForColGroup);
+
+ Maybe<nsDisplayListBuilder::AutoBuildingDisplayList> buildingForCol;
+ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(
+ aBuilder, col, bgRect, backgrounds->ColBackgrounds(), false, nullptr,
+ col->GetRect() + colGroup->GetPosition() +
+ backgrounds->TableToReferenceFrame(),
+ this, &buildingForCol);
+ }
}
// the 'empty-cells' property has no effect on 'outline'
DisplayOutline(aBuilder, aLists);
- // Push a null 'current table item' so that descendant tables can't
- // accidentally mess with our table
- nsAutoPushCurrentTableItem pushTableItem;
- pushTableItem.Push(aBuilder, nullptr);
-
nsIFrame* kid = mFrames.FirstChild();
NS_ASSERTION(kid && !kid->GetNextSibling(), "Table cells should have just one child");
// The child's background will go in our BorderBackground() list.
@@ -506,7 +538,7 @@ nsTableCellFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// because that/ would put the child's background in the Content() list
// which isn't right (e.g., would end up on top of our child floats for
// event handling).
- BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists);
+ BuildDisplayListForChild(aBuilder, kid, aLists);
}
nsIFrame::LogicalSides
@@ -1076,18 +1108,6 @@ nsBCTableCellFrame::GetUsedBorder() const
return GetBorderWidth(wm).GetPhysicalMargin(wm);
}
-/* virtual */ bool
-nsBCTableCellFrame::GetBorderRadii(const nsSize& aFrameSize,
- const nsSize& aBorderArea,
- Sides aSkipSides,
- nscoord aRadii[8]) const
-{
- NS_FOR_CSS_HALF_CORNERS(corner) {
- aRadii[corner] = 0;
- }
- return false;
-}
-
#ifdef DEBUG_FRAME_DUMP
nsresult
nsBCTableCellFrame::GetFrameName(nsAString& aResult) const
diff --git a/layout/tables/nsTableCellFrame.h b/layout/tables/nsTableCellFrame.h
index f626a45b0..2acd59667 100644
--- a/layout/tables/nsTableCellFrame.h
+++ b/layout/tables/nsTableCellFrame.h
@@ -104,7 +104,6 @@ public:
virtual bool NeedsToObserve(const ReflowInput& aReflowInput) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsresult ProcessBorders(nsTableFrame* aFrame,
@@ -341,10 +340,6 @@ public:
virtual nsIAtom* GetType() const override;
virtual nsMargin GetUsedBorder() const override;
- virtual bool GetBorderRadii(const nsSize& aFrameSize,
- const nsSize& aBorderArea,
- Sides aSkipSides,
- nscoord aRadii[8]) const override;
// Get the *inner half of the border only*, in twips.
virtual LogicalMargin GetBorderWidth(WritingMode aWM) const override;
diff --git a/layout/tables/nsTableColFrame.cpp b/layout/tables/nsTableColFrame.cpp
index 54b03522b..6723f4701 100644
--- a/layout/tables/nsTableColFrame.cpp
+++ b/layout/tables/nsTableColFrame.cpp
@@ -110,10 +110,15 @@ nsTableColFrame::Reflow(nsPresContext* aPresContext,
void
nsTableColFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- nsTableFrame::DisplayGenericTablePart(aBuilder, this, aDirtyRect, aLists);
+ // Per https://drafts.csswg.org/css-tables-3/#global-style-overrides:
+ // "All css properties of table-column and table-column-group boxes are
+ // ignored, except when explicitly specified by this specification."
+ // CSS outlines and box-shadows fall into this category, so we skip them
+ // on these boxes.
+
+ MOZ_ASSERT_UNREACHABLE("Cols don't paint themselves");
}
int32_t nsTableColFrame::GetSpan()
diff --git a/layout/tables/nsTableColFrame.h b/layout/tables/nsTableColFrame.h
index fb989061f..ed6a843b6 100644
--- a/layout/tables/nsTableColFrame.h
+++ b/layout/tables/nsTableColFrame.h
@@ -60,7 +60,6 @@ public:
nsReflowStatus& aStatus) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
/**
diff --git a/layout/tables/nsTableColGroupFrame.cpp b/layout/tables/nsTableColGroupFrame.cpp
index 6ee7f0b24..be5b71bb2 100644
--- a/layout/tables/nsTableColGroupFrame.cpp
+++ b/layout/tables/nsTableColGroupFrame.cpp
@@ -385,10 +385,15 @@ nsTableColGroupFrame::Reflow(nsPresContext* aPresContext,
void
nsTableColGroupFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- nsTableFrame::DisplayGenericTablePart(aBuilder, this, aDirtyRect, aLists);
+ // Per https://drafts.csswg.org/css-tables-3/#global-style-overrides:
+ // "All css properties of table-column and table-column-group boxes are
+ // ignored, except when explicitly specified by this specification."
+ // CSS outlines and box-shadows fall into this category, so we skip them
+ // on these boxes.
+
+ MOZ_ASSERT_UNREACHABLE("Colgroups don't paint themselves");
}
nsTableColFrame * nsTableColGroupFrame::GetFirstColumn()
diff --git a/layout/tables/nsTableColGroupFrame.h b/layout/tables/nsTableColGroupFrame.h
index b3dfb94e7..88ed67c2a 100644
--- a/layout/tables/nsTableColGroupFrame.h
+++ b/layout/tables/nsTableColGroupFrame.h
@@ -44,7 +44,6 @@ public:
}
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
/** A colgroup can be caused by three things:
diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp
index e5a48139a..59a6d0f1a 100644
--- a/layout/tables/nsTableFrame.cpp
+++ b/layout/tables/nsTableFrame.cpp
@@ -41,6 +41,7 @@
#include "nsCSSFrameConstructor.h"
#include "mozilla/StyleSetHandle.h"
#include "mozilla/StyleSetHandleInlines.h"
+#include "mozilla/gfx/Helpers.h"
#include "nsDisplayList.h"
#include "nsIScrollableFrame.h"
#include "nsCSSProps.h"
@@ -48,6 +49,7 @@
#include <algorithm>
using namespace mozilla;
+using namespace mozilla::gfx;
using namespace mozilla::image;
using namespace mozilla::layout;
@@ -174,6 +176,9 @@ nsTableFrame::Init(nsIContent* aContent,
const nsStyleTableBorder* tableStyle = StyleTableBorder();
bool borderCollapse = (NS_STYLE_BORDER_COLLAPSE == tableStyle->mBorderCollapse);
SetBorderCollapse(borderCollapse);
+ if (borderCollapse) {
+ SetNeedToCalcHasBCBorders(true);
+ }
if (!aPrevInFlow) {
// If we're the first-in-flow, we manage the cell map & layout strategy that
@@ -1161,115 +1166,7 @@ nsDisplayTableBorderCollapse::Paint(nsDisplayListBuilder* aBuilder,
static_cast<nsTableFrame*>(mFrame)->PaintBCBorders(*drawTarget, mVisibleRect - pt);
}
-/* static */ void
-nsTableFrame::GenericTraversal(nsDisplayListBuilder* aBuilder, nsFrame* aFrame,
- const nsRect& aDirtyRect, const nsDisplayListSet& aLists)
-{
- // This is similar to what nsContainerFrame::BuildDisplayListForNonBlockChildren
- // does, except that we allow the children's background and borders to go
- // in our BorderBackground list. This doesn't really affect background
- // painting --- the children won't actually draw their own backgrounds
- // because the nsTableFrame already drew them, unless a child has its own
- // stacking context, in which case the child won't use its passed-in
- // BorderBackground list anyway. It does affect cell borders though; this
- // lets us get cell borders into the nsTableFrame's BorderBackground list.
- for (nsIFrame* kid : aFrame->GetChildList(kColGroupList)) {
- aFrame->BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists);
- }
-
- for (nsIFrame* kid : aFrame->PrincipalChildList()) {
- aFrame->BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists);
- }
-}
-
-static void
-PaintRowBackground(nsTableRowFrame* aRow,
- nsIFrame* aFrame,
- nsDisplayListBuilder* aBuilder,
- const nsDisplayListSet& aLists,
- const nsRect& aDirtyRect,
- const nsPoint& aOffset = nsPoint())
-{
- // Compute background rect by iterating over all cell frames.
- for (nsTableCellFrame* cell = aRow->GetFirstCell(); cell; cell = cell->GetNextCell()) {
- if (!cell->ShouldPaintBackground(aBuilder)) {
- continue;
- }
-
- auto cellRect = cell->GetRectRelativeToSelf() + cell->GetNormalPosition() + aOffset;
- if (!aDirtyRect.Intersects(cellRect)) {
- continue;
- }
- nsDisplayBackgroundImage::AppendBackgroundItemsToTop(aBuilder, aFrame, cellRect,
- aLists.BorderBackground(),
- true, nullptr,
- aFrame->GetRectRelativeToSelf(),
- cell);
- }
-}
-
-static void
-PaintRowGroupBackground(nsTableRowGroupFrame* aRowGroup,
- nsIFrame* aFrame,
- nsDisplayListBuilder* aBuilder,
- const nsDisplayListSet& aLists,
- const nsRect& aDirtyRect)
-{
- for (nsTableRowFrame* row = aRowGroup->GetFirstRow(); row; row = row->GetNextRow()) {
- if (!aDirtyRect.Intersects(nsRect(row->GetNormalPosition(), row->GetSize()))) {
- continue;
- }
- PaintRowBackground(row, aFrame, aBuilder, aLists, aDirtyRect, row->GetNormalPosition());
- }
-}
-
-static void
-PaintRowGroupBackgroundByColIdx(nsTableRowGroupFrame* aRowGroup,
- nsIFrame* aFrame,
- nsDisplayListBuilder* aBuilder,
- const nsDisplayListSet& aLists,
- const nsRect& aDirtyRect,
- const nsTArray<uint32_t>& aColIdx,
- const nsPoint& aOffset)
-{
- MOZ_DIAGNOSTIC_ASSERT(!aColIdx.IsEmpty(),
- "Must be painting backgrounds for something");
- for (nsTableRowFrame* row = aRowGroup->GetFirstRow(); row; row = row->GetNextRow()) {
- auto rowPos = row->GetNormalPosition() + aOffset;
- if (!aDirtyRect.Intersects(nsRect(rowPos, row->GetSize()))) {
- continue;
- }
- for (nsTableCellFrame* cell = row->GetFirstCell(); cell; cell = cell->GetNextCell()) {
-
- uint32_t curColIdx = cell->ColIndex();
- if (!aColIdx.Contains(curColIdx)) {
- if (curColIdx > aColIdx.LastElement()) {
- // We can just stop looking at this row.
- break;
- }
- continue;
- }
-
- if (!cell->ShouldPaintBackground(aBuilder)) {
- continue;
- }
-
- auto cellPos = cell->GetNormalPosition() + rowPos;
- auto cellRect = nsRect(cellPos, cell->GetSize());
- if (!aDirtyRect.Intersects(cellRect)) {
- continue;
- }
- nsDisplayBackgroundImage::AppendBackgroundItemsToTop(aBuilder, aFrame, cellRect,
- aLists.BorderBackground(),
- true, nullptr,
- aFrame->GetRectRelativeToSelf(),
- cell);
- }
- }
-}
-
-static inline bool FrameHasBorder(nsIFrame* f)
-{
+static inline bool FrameHasBorder(nsIFrame* f) {
if (!f->StyleVisibility()->IsVisible()) {
return false;
}
@@ -1281,8 +1178,7 @@ static inline bool FrameHasBorder(nsIFrame* f)
return false;
}
-void nsTableFrame::CalcHasBCBorders()
-{
+void nsTableFrame::CalcHasBCBorders() {
if (!IsBorderCollapse()) {
SetHasBCBorders(false);
return;
@@ -1300,8 +1196,9 @@ void nsTableFrame::CalcHasBCBorders()
return;
}
- nsTableColGroupFrame *colGroup = static_cast<nsTableColGroupFrame*>(f);
- for (nsTableColFrame* col = colGroup->GetFirstColumn(); col; col = col->GetNextCol()) {
+ nsTableColGroupFrame* colGroup = static_cast<nsTableColGroupFrame*>(f);
+ for (nsTableColFrame* col = colGroup->GetFirstColumn(); col;
+ col = col->GetNextCol()) {
if (FrameHasBorder(col)) {
SetHasBCBorders(true);
return;
@@ -1318,13 +1215,15 @@ void nsTableFrame::CalcHasBCBorders()
return;
}
- for (nsTableRowFrame* row = rowGroup->GetFirstRow(); row; row = row->GetNextRow()) {
+ for (nsTableRowFrame* row = rowGroup->GetFirstRow(); row;
+ row = row->GetNextRow()) {
if (FrameHasBorder(row)) {
SetHasBCBorders(true);
return;
}
- for (nsTableCellFrame* cell = row->GetFirstCell(); cell; cell = cell->GetNextCell()) {
+ for (nsTableCellFrame* cell = row->GetFirstCell(); cell;
+ cell = cell->GetNextCell()) {
if (FrameHasBorder(cell)) {
SetHasBCBorders(true);
return;
@@ -1336,140 +1235,58 @@ void nsTableFrame::CalcHasBCBorders()
SetHasBCBorders(false);
}
-/* static */ void
-nsTableFrame::DisplayGenericTablePart(nsDisplayListBuilder* aBuilder,
- nsFrame* aFrame,
- const nsRect& aDirtyRect,
- const nsDisplayListSet& aLists,
- DisplayGenericTablePartTraversal aTraversal)
-{
- bool isVisible = aFrame->IsVisibleForPainting(aBuilder);
- bool isTable = (aFrame->GetType() == nsGkAtoms::tableFrame);
-
- if (isVisible || !isTable) {
- nsDisplayTableItem* currentItem = aBuilder->GetCurrentTableItem();
- // currentItem may be null, when none of the table parts have a
- // background or border
- if (currentItem) {
- currentItem->UpdateForFrameBackground(aFrame);
- }
- }
-
- if (isVisible) {
- // XXX: should box-shadow for rows/rowgroups/columns/colgroups get painted
- // just because we're visible? Or should it depend on the cell visibility
- // when we're not the whole table?
-
- // Paint the outset box-shadows for the table frames
- if (aFrame->StyleEffects()->mBoxShadow) {
- aLists.BorderBackground()->AppendNewToTop(
- new (aBuilder) nsDisplayBoxShadowOuter(aBuilder, aFrame));
- }
- }
-
- // Background visibility for rows, rowgroups, columns, colgroups depends on
- // the visibility of the _cell_, not of the row/col(group).
- // See spec at https://drafts.csswg.org/css-tables-3/#drawing-cell-backgrounds
- if (aFrame->GetType() == nsGkAtoms::tableRowGroupFrame) {
- nsTableRowGroupFrame* rowGroup = static_cast<nsTableRowGroupFrame*>(aFrame);
- PaintRowGroupBackground(rowGroup, aFrame, aBuilder, aLists, aDirtyRect);
- } else if (aFrame->GetType() == nsGkAtoms::tableRowFrame) {
- nsTableRowFrame* row = static_cast<nsTableRowFrame*>(aFrame);
- PaintRowBackground(row, aFrame, aBuilder, aLists, aDirtyRect);
- } else if (aFrame->GetType() == nsGkAtoms::tableColGroupFrame) {
- // Compute background rect by iterating all cell frame.
- nsTableColGroupFrame* colGroup = static_cast<nsTableColGroupFrame*>(aFrame);
- // Collecting column index.
- AutoTArray<uint32_t, 1> colIdx;
- for (nsTableColFrame* col = colGroup->GetFirstColumn(); col; col = col->GetNextCol()) {
- MOZ_ASSERT(colIdx.IsEmpty() ||
- static_cast<uint32_t>(col->GetColIndex()) > colIdx.LastElement());
- colIdx.AppendElement(col->GetColIndex());
- }
-
- if (!colIdx.IsEmpty()) {
- // We have some actual cells that live inside this rowgroup.
- nsTableFrame* table = colGroup->GetTableFrame();
- RowGroupArray rowGroups;
- table->OrderRowGroups(rowGroups);
- for (nsTableRowGroupFrame* rowGroup : rowGroups) {
- auto offset = rowGroup->GetNormalPosition() - colGroup->GetNormalPosition();
- if (!aDirtyRect.Intersects(nsRect(offset, rowGroup->GetSize()))) {
- continue;
- }
- PaintRowGroupBackgroundByColIdx(rowGroup, aFrame, aBuilder, aLists, aDirtyRect, colIdx, offset);
- }
- }
- } else if (aFrame->GetType() == nsGkAtoms::tableColFrame) {
- // Compute background rect by iterating all cell frame.
- nsTableColFrame* col = static_cast<nsTableColFrame*>(aFrame);
- AutoTArray<uint32_t, 1> colIdx;
- colIdx.AppendElement(col->GetColIndex());
+// table paint code is concerned primarily with borders and bg color
+// SEC: TODO: adjust the rect for captions
+void
+nsTableFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
+ const nsDisplayListSet& aLists)
+{
+ DO_GLOBAL_REFLOW_COUNT_DSP_COLOR("nsTableFrame", NS_RGB(255,128,255));
- nsTableFrame* table = col->GetTableFrame();
- RowGroupArray rowGroups;
- table->OrderRowGroups(rowGroups);
- for (nsTableRowGroupFrame* rowGroup : rowGroups) {
- auto offset = rowGroup->GetNormalPosition() -
- col->GetNormalPosition() -
- col->GetTableColGroupFrame()->GetNormalPosition();
- if (!aDirtyRect.Intersects(nsRect(offset, rowGroup->GetSize()))) {
- continue;
- }
- PaintRowGroupBackgroundByColIdx(rowGroup, aFrame, aBuilder, aLists, aDirtyRect, colIdx, offset);
- }
- } else if (isVisible) {
- nsDisplayBackgroundImage::AppendBackgroundItemsToTop(aBuilder, aFrame,
- aFrame->GetRectRelativeToSelf(),
- aLists.BorderBackground());
- }
+ DisplayBorderBackgroundOutline(aBuilder, aLists);
- if (isVisible) {
- // XXX: should box-shadow for rows/rowgroups/columns/colgroups get painted
- // just because we're visible? Or should it depend on the cell visibility
- // when we're not the whole table?
+ nsDisplayTableBackgroundSet tableBGs(aBuilder, this);
+ nsDisplayListCollection lists(aBuilder);
- // Paint the inset box-shadows for the table frames
- if (aFrame->StyleEffects()->mBoxShadow) {
- aLists.BorderBackground()->AppendNewToTop(
- new (aBuilder) nsDisplayBoxShadowInner(aBuilder, aFrame));
+// This is similar to what
+ // nsContainerFrame::BuildDisplayListForNonBlockChildren does, except that we
+ // allow the children's background and borders to go in our BorderBackground
+ // list. This doesn't really affect background painting --- the children won't
+ // actually draw their own backgrounds because the nsTableFrame already drew
+ // them, unless a child has its own stacking context, in which case the child
+ // won't use its passed-in BorderBackground list anyway. It does affect cell
+ // borders though; this lets us get cell borders into the nsTableFrame's
+ // BorderBackground list.
+ for (nsIFrame* colGroup : FirstContinuation()->GetChildList(kColGroupList)) {
+ for (nsIFrame* col : colGroup->PrincipalChildList()) {
+ tableBGs.AddColumn((nsTableColFrame*)col);
}
}
- aTraversal(aBuilder, aFrame, aDirtyRect, aLists);
+ for (nsIFrame* kid : PrincipalChildList()) {
+ BuildDisplayListForChild(aBuilder, kid, lists);
+ }
- if (isVisible) {
- if (isTable) {
- nsTableFrame* table = static_cast<nsTableFrame*>(aFrame);
- // In the collapsed border model, overlay all collapsed borders.
- if (table->IsBorderCollapse()) {
- if (table->HasBCBorders()) {
- aLists.BorderBackground()->AppendNewToTop(
- new (aBuilder) nsDisplayTableBorderCollapse(aBuilder, table));
- }
- } else {
- const nsStyleBorder* borderStyle = aFrame->StyleBorder();
- if (borderStyle->HasBorder()) {
- aLists.BorderBackground()->AppendNewToTop(
- new (aBuilder) nsDisplayBorder(aBuilder, table));
- }
+ tableBGs.MoveTo(aLists);
+ lists.MoveTo(aLists);
+
+ if (IsVisibleForPainting(aBuilder)) {
+ // In the collapsed border model, overlay all collapsed borders.
+ if (IsBorderCollapse()) {
+ if (HasBCBorders()) {
+ aLists.BorderBackground()->AppendNewToTop(
+ new (aBuilder) nsDisplayTableBorderCollapse
+ (aBuilder, this));
+ }
+ } else {
+ const nsStyleBorder* borderStyle = StyleBorder();
+ if (borderStyle->HasBorder()) {
+ aLists.BorderBackground()->AppendNewToTop(
+ new (aBuilder) nsDisplayBorder
+ (aBuilder, this));
}
}
}
-
- aFrame->DisplayOutline(aBuilder, aLists);
-}
-
-// table paint code is concerned primarily with borders and bg color
-// SEC: TODO: adjust the rect for captions
-void
-nsTableFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
- const nsDisplayListSet& aLists)
-{
- DO_GLOBAL_REFLOW_COUNT_DSP_COLOR("nsTableFrame", NS_RGB(255,128,255));
-
- DisplayGenericTablePart(aBuilder, this, aDirtyRect, aLists);
}
nsMargin
diff --git a/layout/tables/nsTableFrame.h b/layout/tables/nsTableFrame.h
index d739faa72..7fcdcb9d8 100644
--- a/layout/tables/nsTableFrame.h
+++ b/layout/tables/nsTableFrame.h
@@ -72,36 +72,59 @@ private:
bool mDrawsBackground;
};
-class nsAutoPushCurrentTableItem
-{
-public:
- nsAutoPushCurrentTableItem() : mBuilder(nullptr) {}
+class nsDisplayTableBackgroundSet {
+ public:
+ nsDisplayList* ColGroupBackgrounds() { return &mColGroupBackgrounds; }
+
+ nsDisplayList* ColBackgrounds() { return &mColBackgrounds; }
+
+ nsDisplayTableBackgroundSet(nsDisplayListBuilder* aBuilder, nsIFrame* aTable)
+ : mBuilder(aBuilder) {
+ mPrevTableBackgroundSet = mBuilder->SetTableBackgroundSet(this);
+ mozilla::DebugOnly<const nsIFrame*> reference =
+ mBuilder->FindReferenceFrameFor(aTable, &mToReferenceFrame);
+ MOZ_ASSERT(nsLayoutUtils::IsAncestorFrameCrossDoc(reference, aTable));
+ mDirtyRect = mBuilder->GetDirtyRect();
+ }
- void Push(nsDisplayListBuilder* aBuilder, nsDisplayTableItem* aPushItem)
- {
- mBuilder = aBuilder;
- mOldCurrentItem = aBuilder->GetCurrentTableItem();
- aBuilder->SetCurrentTableItem(aPushItem);
-#ifdef DEBUG
- mPushedItem = aPushItem;
-#endif
+ ~nsDisplayTableBackgroundSet() {
+ mozilla::DebugOnly<nsDisplayTableBackgroundSet*> result =
+ mBuilder->SetTableBackgroundSet(mPrevTableBackgroundSet);
+ MOZ_ASSERT(result == this);
}
- ~nsAutoPushCurrentTableItem() {
- if (!mBuilder)
- return;
-#ifdef DEBUG
- NS_ASSERTION(mBuilder->GetCurrentTableItem() == mPushedItem,
- "Someone messed with the current table item behind our back!");
-#endif
- mBuilder->SetCurrentTableItem(mOldCurrentItem);
+
+ /**
+ * Move all display items in our lists to top of the corresponding lists in
+ * the destination.
+ */
+ void MoveTo(const nsDisplayListSet& aDestination) {
+ aDestination.BorderBackground()->AppendToTop(ColGroupBackgrounds());
+ aDestination.BorderBackground()->AppendToTop(ColBackgrounds());
}
-private:
+ void AddColumn(nsTableColFrame* aFrame) { mColumns.AppendElement(aFrame); }
+
+ nsTableColFrame* GetColForIndex(int32_t aIndex) { return mColumns[aIndex]; }
+
+ const nsPoint& TableToReferenceFrame() { return mToReferenceFrame; }
+
+ const nsRect& GetDirtyRect() { return mDirtyRect; }
+
+ private:
+ // This class is only used on stack, so we don't have to worry about leaking
+ // it. Don't let us be heap-allocated!
+ void* operator new(size_t sz) CPP_THROW_NEW;
+
+ protected:
nsDisplayListBuilder* mBuilder;
- nsDisplayTableItem* mOldCurrentItem;
-#ifdef DEBUG
- nsDisplayTableItem* mPushedItem;
-#endif
+ nsDisplayTableBackgroundSet* mPrevTableBackgroundSet;
+
+ nsDisplayList mColGroupBackgrounds;
+ nsDisplayList mColBackgrounds;
+
+ nsTArray<nsTableColFrame*> mColumns;
+ nsPoint mToReferenceFrame;
+ nsRect mDirtyRect;
};
/* ============================================================================ */
@@ -229,29 +252,6 @@ public:
nsIFrame* aSourceFrame,
bool* aDidPassThrough);
- typedef void (* DisplayGenericTablePartTraversal)
- (nsDisplayListBuilder* aBuilder, nsFrame* aFrame,
- const nsRect& aDirtyRect, const nsDisplayListSet& aLists);
- static void GenericTraversal(nsDisplayListBuilder* aBuilder, nsFrame* aFrame,
- const nsRect& aDirtyRect, const nsDisplayListSet& aLists);
-
- /**
- * Helper method to handle display common to table frames, rowgroup frames
- * and row frames. It creates a background display item for handling events
- * if necessary, an outline display item if necessary, and displays
- * all the the frame's children.
- * @param aDisplayItem the display item created for this part, or null
- * if this part's border/background painting is delegated to an ancestor
- * @param aTraversal a function that gets called to traverse the table
- * part's child frames and add their display list items to a
- * display list set.
- */
- static void DisplayGenericTablePart(nsDisplayListBuilder* aBuilder,
- nsFrame* aFrame,
- const nsRect& aDirtyRect,
- const nsDisplayListSet& aLists,
- DisplayGenericTablePartTraversal aTraversal = GenericTraversal);
-
// Return the closest sibling of aPriorChildFrame (including aPriroChildFrame)
// of type aChildType.
static nsIFrame* GetFrameAtOrBefore(nsIFrame* aParentFrame,
@@ -268,7 +268,6 @@ public:
virtual void GetChildLists(nsTArray<ChildList>* aLists) const override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
/** Get the outer half (i.e., the part outside the height and width of
diff --git a/layout/tables/nsTableRowFrame.cpp b/layout/tables/nsTableRowFrame.cpp
index 02b85a141..18f11f876 100644
--- a/layout/tables/nsTableRowFrame.cpp
+++ b/layout/tables/nsTableRowFrame.cpp
@@ -549,12 +549,66 @@ nsTableRowFrame::CalcBSize(const ReflowInput& aReflowInput)
return GetInitialBSize();
}
+void nsTableRowFrame::PaintCellBackgroundsForFrame(
+ nsIFrame* aFrame, nsDisplayListBuilder* aBuilder,
+ const nsDisplayListSet& aLists, const nsPoint& aOffset) {
+ // Compute background rect by iterating all cell frame.
+ const nsPoint toReferenceFrame = aBuilder->ToReferenceFrame(aFrame);
+ for (nsTableCellFrame* cell = GetFirstCell(); cell;
+ cell = cell->GetNextCell()) {
+ if (!cell->ShouldPaintBackground(aBuilder)) {
+ continue;
+ }
+
+ auto cellRect =
+ cell->GetRectRelativeToSelf() + cell->GetNormalPosition() + aOffset;
+ if (!aBuilder->GetDirtyRect().Intersects(cellRect)) {
+ continue;
+ }
+ cellRect += toReferenceFrame;
+ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(
+ aBuilder, aFrame, cellRect, aLists.BorderBackground(), true, nullptr,
+ aFrame->GetRectRelativeToSelf() + toReferenceFrame, cell);
+ }
+}
+
void
nsTableRowFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- nsTableFrame::DisplayGenericTablePart(aBuilder, this, aDirtyRect, aLists);
+ if (IsVisibleForPainting(aBuilder)) {
+ // XXXbz should box-shadow for rows/rowgroups/columns/colgroups get painted
+ // just because we're visible? Or should it depend on the cell visibility
+ // when we're not the whole table?
+
+ // Paint the outset box-shadows for the table frames
+ if (StyleEffects()->mBoxShadow) {
+ aLists.BorderBackground()->AppendNewToTop(
+ new (aBuilder) nsDisplayBoxShadowOuter
+ (aBuilder, this));
+ }
+ }
+
+ PaintCellBackgroundsForFrame(this, aBuilder, aLists);
+
+ if (IsVisibleForPainting(aBuilder)) {
+ // XXXbz should box-shadow for rows/rowgroups/columns/colgroups get painted
+ // just because we're visible? Or should it depend on the cell visibility
+ // when we're not the whole table?
+
+ // Paint the inset box-shadows for the table frames
+ if (StyleEffects()->mBoxShadow) {
+ aLists.BorderBackground()->AppendNewToTop(
+ new (aBuilder) nsDisplayBoxShadowInner
+ (aBuilder, this));
+ }
+ }
+
+ DisplayOutline(aBuilder, aLists);
+
+ for (nsIFrame* kid : PrincipalChildList()) {
+ BuildDisplayListForChild(aBuilder, kid, aLists);
+ }
}
nsIFrame::LogicalSides
diff --git a/layout/tables/nsTableRowFrame.h b/layout/tables/nsTableRowFrame.h
index c53c81ff1..4b6dd2628 100644
--- a/layout/tables/nsTableRowFrame.h
+++ b/layout/tables/nsTableRowFrame.h
@@ -79,9 +79,13 @@ public:
virtual nsMargin GetUsedPadding() const override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
+ void PaintCellBackgroundsForFrame(nsIFrame* aFrame,
+ nsDisplayListBuilder* aBuilder,
+ const nsDisplayListSet& aLists,
+ const nsPoint& aOffset = nsPoint());
+
// Implemented in nsTableCellFrame.h, because it needs to know about the
// nsTableCellFrame class, but we can't include nsTableCellFrame.h here.
inline nsTableCellFrame* GetFirstCell() const;
diff --git a/layout/tables/nsTableRowGroupFrame.cpp b/layout/tables/nsTableRowGroupFrame.cpp
index 37f577f5c..b6d8a4364 100644
--- a/layout/tables/nsTableRowGroupFrame.cpp
+++ b/layout/tables/nsTableRowGroupFrame.cpp
@@ -156,7 +156,7 @@ nsTableRowGroupFrame::InitRepeatedFrame(nsTableRowGroupFrame* aHeaderFooterFrame
// Handle the child-traversal part of DisplayGenericTablePart
static void
DisplayRows(nsDisplayListBuilder* aBuilder, nsFrame* aFrame,
- const nsRect& aDirtyRect, const nsDisplayListSet& aLists)
+ const nsDisplayListSet& aLists)
{
nscoord overflowAbove;
nsTableRowGroupFrame* f = static_cast<nsTableRowGroupFrame*>(aFrame);
@@ -169,15 +169,15 @@ DisplayRows(nsDisplayListBuilder* aBuilder, nsFrame* aFrame,
// approximate it by checking it for |f|: if it's true for any row
// in |f| then it's true for |f| itself.
nsIFrame* kid = aBuilder->ShouldDescendIntoFrame(f) ?
- nullptr : f->GetFirstRowContaining(aDirtyRect.y, &overflowAbove);
+ nullptr : f->GetFirstRowContaining(aBuilder->GetDirtyRect().y, &overflowAbove);
if (kid) {
// If we have a cursor, use it
while (kid) {
- if (kid->GetRect().y - overflowAbove >= aDirtyRect.YMost()) {
+ if (kid->GetRect().y - overflowAbove >= aBuilder->GetDirtyRect().YMost()) {
break;
}
- f->BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists);
+ f->BuildDisplayListForChild(aBuilder, kid, aLists);
kid = kid->GetNextSibling();
}
return;
@@ -187,7 +187,7 @@ DisplayRows(nsDisplayListBuilder* aBuilder, nsFrame* aFrame,
nsTableRowGroupFrame::FrameCursorData* cursor = f->SetupRowCursor();
kid = f->PrincipalChildList().FirstChild();
while (kid) {
- f->BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists);
+ f->BuildDisplayListForChild(aBuilder, kid, aLists);
if (cursor) {
if (!cursor->AppendFrame(kid)) {
@@ -205,11 +205,45 @@ DisplayRows(nsDisplayListBuilder* aBuilder, nsFrame* aFrame,
void
nsTableRowGroupFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- nsTableFrame::DisplayGenericTablePart(aBuilder, this, aDirtyRect,
- aLists, DisplayRows);
+ if (IsVisibleForPainting(aBuilder)) {
+ // XXXbz should box-shadow for rows/rowgroups/columns/colgroups get painted
+ // just because we're visible? Or should it depend on the cell visibility
+ // when we're not the whole table?
+
+ // Paint the outset box-shadows for the table frames
+ if (StyleEffects()->mBoxShadow) {
+ aLists.BorderBackground()->AppendNewToTop(
+ new (aBuilder) nsDisplayBoxShadowOuter
+ (aBuilder, this));
+ }
+ }
+
+ for (nsTableRowFrame* row = GetFirstRow(); row; row = row->GetNextRow()) {
+ if (!aBuilder->GetDirtyRect().Intersects(row->GetVisualOverflowRect() + row->GetNormalPosition())) {
+ continue;
+ }
+ row->PaintCellBackgroundsForFrame(this, aBuilder, aLists,
+ row->GetNormalPosition());
+ }
+
+ if (IsVisibleForPainting(aBuilder)) {
+ // XXXbz should box-shadow for rows/rowgroups/columns/colgroups get painted
+ // just because we're visible? Or should it depend on the cell visibility
+ // when we're not the whole table?
+
+ // Paint the inset box-shadows for the table frames
+ if (StyleEffects()->mBoxShadow) {
+ aLists.BorderBackground()->AppendNewToTop(
+ new (aBuilder) nsDisplayBoxShadowInner
+ (aBuilder, this));
+ }
+ }
+
+ DisplayOutline(aBuilder, aLists);
+
+ DisplayRows(aBuilder, this, aLists);
}
nsIFrame::LogicalSides
diff --git a/layout/tables/nsTableRowGroupFrame.h b/layout/tables/nsTableRowGroupFrame.h
index 721d91046..eb9f6205e 100644
--- a/layout/tables/nsTableRowGroupFrame.h
+++ b/layout/tables/nsTableRowGroupFrame.h
@@ -75,7 +75,6 @@ public:
virtual nsMargin GetUsedPadding() const override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
/** calls Reflow for all of its child rows.
diff --git a/layout/tables/nsTableWrapperFrame.cpp b/layout/tables/nsTableWrapperFrame.cpp
index da71375d5..86f032218 100644
--- a/layout/tables/nsTableWrapperFrame.cpp
+++ b/layout/tables/nsTableWrapperFrame.cpp
@@ -168,7 +168,6 @@ nsTableWrapperFrame::RemoveFrame(ChildListID aListID,
void
nsTableWrapperFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// No border, background or outline are painted because they all belong
@@ -177,20 +176,22 @@ nsTableWrapperFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// If there's no caption, take a short cut to avoid having to create
// the special display list set and then sort it.
if (mCaptionFrames.IsEmpty()) {
- BuildDisplayListForInnerTable(aBuilder, aDirtyRect, aLists);
+ BuildDisplayListForInnerTable(aBuilder, aLists);
return;
}
- nsDisplayListCollection set;
- BuildDisplayListForInnerTable(aBuilder, aDirtyRect, set);
+ nsDisplayListCollection set(aBuilder);
+ BuildDisplayListForInnerTable(aBuilder, set);
nsDisplayListSet captionSet(set, set.BlockBorderBackgrounds());
- BuildDisplayListForChild(aBuilder, mCaptionFrames.FirstChild(),
- aDirtyRect, captionSet);
+ BuildDisplayListForChild(aBuilder, mCaptionFrames.FirstChild(), captionSet);
// Now we have to sort everything by content order, since the caption
- // may be somewhere inside the table
- set.BlockBorderBackgrounds()->SortByContentOrder(GetContent());
+ // may be somewhere inside the table.
+ // We don't sort BlockBorderBackgrounds and BorderBackgrounds because the
+ // display items in those lists should stay out of content order in order to
+ // follow the rules in https://www.w3.org/TR/CSS21/zindex.html#painting-order
+ // and paint the caption background after all of the rest.
set.Floats()->SortByContentOrder(GetContent());
set.Content()->SortByContentOrder(GetContent());
set.PositionedDescendants()->SortByContentOrder(GetContent());
@@ -200,7 +201,6 @@ nsTableWrapperFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
void
nsTableWrapperFrame::BuildDisplayListForInnerTable(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// Just paint the regular children, but the children's background is our
@@ -208,7 +208,7 @@ nsTableWrapperFrame::BuildDisplayListForInnerTable(nsDisplayListBuilder* aBuil
nsIFrame* kid = mFrames.FirstChild();
// The children should be in content order
while (kid) {
- BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists);
+ BuildDisplayListForChild(aBuilder, kid, aLists);
kid = kid->GetNextSibling();
}
}
diff --git a/layout/tables/nsTableWrapperFrame.h b/layout/tables/nsTableWrapperFrame.h
index 45d7c33e4..8095c7fc4 100644
--- a/layout/tables/nsTableWrapperFrame.h
+++ b/layout/tables/nsTableWrapperFrame.h
@@ -59,11 +59,9 @@ public:
#endif
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
void BuildDisplayListForInnerTable(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists);
virtual nscoord GetLogicalBaseline(mozilla::WritingMode aWritingMode) const override;
diff --git a/layout/xul/ContainerBoxObject.h b/layout/xul/ContainerBoxObject.h
index b3da97991..d9da164ea 100644
--- a/layout/xul/ContainerBoxObject.h
+++ b/layout/xul/ContainerBoxObject.h
@@ -8,6 +8,7 @@
#define mozilla_dom_ContainerBoxObject_h
#include "mozilla/dom/BoxObject.h"
+#include "nsIDocShell.h"
namespace mozilla {
namespace dom {
diff --git a/layout/xul/grid/moz.build b/layout/xul/grid/moz.build
index 074985aaf..049489ab2 100644
--- a/layout/xul/grid/moz.build
+++ b/layout/xul/grid/moz.build
@@ -19,7 +19,7 @@ EXPORTS += [
'nsIGridPart.h',
]
-UNIFIED_SOURCES += [
+SOURCES += [
'nsGrid.cpp',
'nsGridCell.cpp',
'nsGridLayout2.cpp',
diff --git a/layout/xul/moz.build b/layout/xul/moz.build
index 8ed304c9f..18b120b34 100644
--- a/layout/xul/moz.build
+++ b/layout/xul/moz.build
@@ -44,7 +44,7 @@ EXPORTS.mozilla.dom += [
'ScrollBoxObject.h',
]
-UNIFIED_SOURCES += [
+SOURCES += [
'BoxObject.cpp',
'nsBox.cpp',
'nsBoxFrame.cpp',
@@ -64,7 +64,7 @@ UNIFIED_SOURCES += [
]
if CONFIG['MOZ_XUL']:
- UNIFIED_SOURCES += [
+ SOURCES += [
'ContainerBoxObject.cpp',
'ListBoxObject.cpp',
'MenuBoxObject.cpp',
diff --git a/layout/xul/nsBoxFrame.cpp b/layout/xul/nsBoxFrame.cpp
index 9ca351d94..09573fb96 100644
--- a/layout/xul/nsBoxFrame.cpp
+++ b/layout/xul/nsBoxFrame.cpp
@@ -1310,7 +1310,6 @@ PaintXULDebugBackground(nsIFrame* aFrame, DrawTarget* aDrawTarget,
void
nsBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
bool forceLayer = false;
@@ -1329,7 +1328,7 @@ nsBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
}
}
- nsDisplayListCollection tempLists;
+ nsDisplayListCollection tempLists(aBuilder);
const nsDisplayListSet& destination = forceLayer ? tempLists : aLists;
DisplayBorderBackgroundOutline(aBuilder, destination);
@@ -1344,7 +1343,7 @@ nsBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
}
#endif
- BuildDisplayListForChildren(aBuilder, aDirtyRect, destination);
+ BuildDisplayListForChildren(aBuilder, destination);
// see if we have to draw a selection frame around this container
DisplaySelectionOverlay(aBuilder, destination.Content());
@@ -1370,7 +1369,6 @@ nsBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
void
nsBoxFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
nsIFrame* kid = mFrames.FirstChild();
@@ -1379,7 +1377,7 @@ nsBoxFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
nsDisplayListSet set(aLists, aLists.BlockBorderBackgrounds());
// The children should be in the right order
while (kid) {
- BuildDisplayListForChild(aBuilder, kid, aDirtyRect, set);
+ BuildDisplayListForChild(aBuilder, kid, set);
kid = kid->GetNextSibling();
}
}
diff --git a/layout/xul/nsBoxFrame.h b/layout/xul/nsBoxFrame.h
index ad405222f..7b15f4f5e 100644
--- a/layout/xul/nsBoxFrame.h
+++ b/layout/xul/nsBoxFrame.h
@@ -148,11 +148,9 @@ public:
// virtual so nsStackFrame, nsButtonBoxFrame, nsSliderFrame and nsMenuFrame
// can override it
virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists);
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
#ifdef DEBUG_LAYOUT
diff --git a/layout/xul/nsButtonBoxFrame.cpp b/layout/xul/nsButtonBoxFrame.cpp
index 45d934516..ba0b7fb2a 100644
--- a/layout/xul/nsButtonBoxFrame.cpp
+++ b/layout/xul/nsButtonBoxFrame.cpp
@@ -12,6 +12,7 @@
#include "nsPresContext.h"
#include "nsIPresShell.h"
#include "nsIDOMElement.h"
+#include "nsIDOMEvent.h"
#include "nsDisplayList.h"
#include "nsContentUtils.h"
#include "mozilla/dom/Element.h"
@@ -91,13 +92,12 @@ nsButtonBoxFrame::DestroyFrom(nsIFrame* aDestructRoot)
void
nsButtonBoxFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// override, since we don't want children to get events
if (aBuilder->IsForEventDelivery())
return;
- nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists);
+ nsBoxFrame::BuildDisplayListForChildren(aBuilder, aLists);
}
nsresult
diff --git a/layout/xul/nsButtonBoxFrame.h b/layout/xul/nsButtonBoxFrame.h
index e9bfd99a5..0dc8b517f 100644
--- a/layout/xul/nsButtonBoxFrame.h
+++ b/layout/xul/nsButtonBoxFrame.h
@@ -23,7 +23,6 @@ public:
nsIFrame* aPrevInFlow) override;
virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void DestroyFrom(nsIFrame* aDestructRoot) override;
diff --git a/layout/xul/nsDeckFrame.cpp b/layout/xul/nsDeckFrame.cpp
index b0c0296b2..91359c177 100644
--- a/layout/xul/nsDeckFrame.cpp
+++ b/layout/xul/nsDeckFrame.cpp
@@ -145,14 +145,13 @@ nsDeckFrame::GetSelectedBox()
void
nsDeckFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// if a tab is hidden all its children are too.
if (!StyleVisibility()->mVisible)
return;
- nsBoxFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsBoxFrame::BuildDisplayList(aBuilder, aLists);
}
void
@@ -185,7 +184,6 @@ nsDeckFrame::RemoveFrame(ChildListID aListID,
void
nsDeckFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// only paint the selected box
@@ -196,7 +194,7 @@ nsDeckFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
// Putting the child in the background list. This is a little weird but
// it matches what we were doing before.
nsDisplayListSet set(aLists, aLists.BlockBorderBackgrounds());
- BuildDisplayListForChild(aBuilder, box, aDirtyRect, set);
+ BuildDisplayListForChild(aBuilder, box, set);
}
NS_IMETHODIMP
diff --git a/layout/xul/nsDeckFrame.h b/layout/xul/nsDeckFrame.h
index 2c7ae1445..143745236 100644
--- a/layout/xul/nsDeckFrame.h
+++ b/layout/xul/nsDeckFrame.h
@@ -34,14 +34,12 @@ public:
NS_IMETHOD DoXULLayout(nsBoxLayoutState& aState) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void RemoveFrame(ChildListID aListID,
nsIFrame* aOldFrame) override;
virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void Init(nsIContent* aContent,
diff --git a/layout/xul/nsGroupBoxFrame.cpp b/layout/xul/nsGroupBoxFrame.cpp
index 514287a24..df3955cf3 100644
--- a/layout/xul/nsGroupBoxFrame.cpp
+++ b/layout/xul/nsGroupBoxFrame.cpp
@@ -28,7 +28,6 @@ public:
virtual nsresult GetXULBorderAndPadding(nsMargin& aBorderAndPadding) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
#ifdef DEBUG_FRAME_DUMP
@@ -145,13 +144,13 @@ nsDisplayXULGroupBorder::Paint(nsDisplayListBuilder* aBuilder,
void
nsGroupBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// Paint our background and border
if (IsVisibleForPainting(aBuilder)) {
nsDisplayBackgroundImage::AppendBackgroundItemsToTop(
- aBuilder, this, GetBackgroundRectRelativeToSelf(),
+ aBuilder, this,
+ GetBackgroundRectRelativeToSelf() + aBuilder->ToReferenceFrame(this),
aLists.BorderBackground());
aLists.BorderBackground()->AppendNewToTop(new (aBuilder)
nsDisplayXULGroupBorder(aBuilder, this));
@@ -159,7 +158,7 @@ nsGroupBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
DisplayOutline(aBuilder, aLists);
}
- BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists);
+ BuildDisplayListForChildren(aBuilder, aLists);
}
nsRect
diff --git a/layout/xul/nsImageBoxFrame.cpp b/layout/xul/nsImageBoxFrame.cpp
index fd7c7becf..e88b502ab 100644
--- a/layout/xul/nsImageBoxFrame.cpp
+++ b/layout/xul/nsImageBoxFrame.cpp
@@ -320,10 +320,9 @@ nsImageBoxFrame::UpdateLoadFlags()
void
nsImageBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- nsLeafBoxFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsLeafBoxFrame::BuildDisplayList(aBuilder, aLists);
if ((0 == mRect.width) || (0 == mRect.height)) {
// Do not render when given a zero area. This avoids some useless
diff --git a/layout/xul/nsImageBoxFrame.h b/layout/xul/nsImageBoxFrame.h
index 7faccccae..46c8d5614 100644
--- a/layout/xul/nsImageBoxFrame.h
+++ b/layout/xul/nsImageBoxFrame.h
@@ -87,7 +87,6 @@ public:
void UpdateLoadFlags();
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual ~nsImageBoxFrame();
diff --git a/layout/xul/nsLeafBoxFrame.cpp b/layout/xul/nsLeafBoxFrame.cpp
index 6d1783c11..8342b7485 100644
--- a/layout/xul/nsLeafBoxFrame.cpp
+++ b/layout/xul/nsLeafBoxFrame.cpp
@@ -106,7 +106,6 @@ void nsLeafBoxFrame::UpdateMouseThrough()
void
nsLeafBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// REVIEW: GetFrameForPoint used to not report events for the background
diff --git a/layout/xul/nsLeafBoxFrame.h b/layout/xul/nsLeafBoxFrame.h
index 8aea598c8..7a63d9a79 100644
--- a/layout/xul/nsLeafBoxFrame.h
+++ b/layout/xul/nsLeafBoxFrame.h
@@ -64,7 +64,6 @@ public:
nsIFrame* asPrevInFlow) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsresult AttributeChanged(int32_t aNameSpaceID,
diff --git a/layout/xul/nsListItemFrame.cpp b/layout/xul/nsListItemFrame.cpp
index 1776f1b6c..720df3827 100644
--- a/layout/xul/nsListItemFrame.cpp
+++ b/layout/xul/nsListItemFrame.cpp
@@ -39,7 +39,6 @@ nsListItemFrame::GetXULPrefSize(nsBoxLayoutState& aState)
void
nsListItemFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (aBuilder->IsForEventDelivery()) {
@@ -48,7 +47,7 @@ nsListItemFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
return;
}
- nsGridRowLeafFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists);
+ nsGridRowLeafFrame::BuildDisplayListForChildren(aBuilder, aLists);
}
// Creation Routine ///////////////////////////////////////////////////////////////////////
diff --git a/layout/xul/nsListItemFrame.h b/layout/xul/nsListItemFrame.h
index 40e731efa..aa41dbbbf 100644
--- a/layout/xul/nsListItemFrame.h
+++ b/layout/xul/nsListItemFrame.h
@@ -20,7 +20,6 @@ public:
// overridden so that children of listitems don't handle mouse events,
// unless allowevents="true" is specified on the listitem
virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsSize GetXULPrefSize(nsBoxLayoutState& aState) override;
diff --git a/layout/xul/nsMenuBarListener.cpp b/layout/xul/nsMenuBarListener.cpp
index 0fce497b8..23df81937 100644
--- a/layout/xul/nsMenuBarListener.cpp
+++ b/layout/xul/nsMenuBarListener.cpp
@@ -21,6 +21,7 @@
#include "mozilla/BasicEvents.h"
#include "mozilla/Preferences.h"
#include "mozilla/TextEvents.h"
+#include "mozilla/dom/Event.h"
using namespace mozilla;
diff --git a/layout/xul/nsMenuFrame.cpp b/layout/xul/nsMenuFrame.cpp
index 67fcdbe43..a8e81adb5 100644
--- a/layout/xul/nsMenuFrame.cpp
+++ b/layout/xul/nsMenuFrame.cpp
@@ -48,6 +48,7 @@
#include <algorithm>
using namespace mozilla;
+using namespace mozilla::dom;
#define NS_MENU_POPUP_LIST_INDEX 0
@@ -356,16 +357,15 @@ nsMenuFrame::DestroyFrom(nsIFrame* aDestructRoot)
void
nsMenuFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (!aBuilder->IsForEventDelivery()) {
- nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists);
+ nsBoxFrame::BuildDisplayListForChildren(aBuilder, aLists);
return;
}
- nsDisplayListCollection set;
- nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, set);
+ nsDisplayListCollection set(aBuilder);
+ nsBoxFrame::BuildDisplayListForChildren(aBuilder, set);
WrapListsInRedirector(aBuilder, set, aLists);
}
diff --git a/layout/xul/nsMenuFrame.h b/layout/xul/nsMenuFrame.h
index 1941ec69e..43cbd0a04 100644
--- a/layout/xul/nsMenuFrame.h
+++ b/layout/xul/nsMenuFrame.h
@@ -101,7 +101,6 @@ public:
// Overridden to prevent events from going to children of the menu.
virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
// this method can destroy the frame
diff --git a/layout/xul/nsMenuPopupFrame.cpp b/layout/xul/nsMenuPopupFrame.cpp
index 6e706e49c..3f934b208 100644
--- a/layout/xul/nsMenuPopupFrame.cpp
+++ b/layout/xul/nsMenuPopupFrame.cpp
@@ -18,6 +18,7 @@
#include "nsMenuBarFrame.h"
#include "nsPopupSetFrame.h"
#include "nsPIDOMWindow.h"
+#include "nsIDOMEvent.h"
#include "nsIDOMKeyEvent.h"
#include "nsIDOMScreen.h"
#include "nsIPresShell.h"
@@ -45,6 +46,7 @@
#include "nsThemeConstants.h"
#include "nsTransitionManager.h"
#include "nsDisplayList.h"
+#include "nsIDOMXULMenuListElement.h"
#include "nsIDOMXULSelectCntrlItemEl.h"
#include "mozilla/EventDispatcher.h"
#include "mozilla/EventStateManager.h"
@@ -53,6 +55,7 @@
#include "mozilla/LookAndFeel.h"
#include "mozilla/MouseEvents.h"
#include "mozilla/dom/Element.h"
+#include "mozilla/dom/Event.h"
#include "mozilla/dom/PopupBoxObject.h"
#include <algorithm>
diff --git a/layout/xul/nsResizerFrame.h b/layout/xul/nsResizerFrame.h
index 92656bc76..41efa79a7 100644
--- a/layout/xul/nsResizerFrame.h
+++ b/layout/xul/nsResizerFrame.h
@@ -8,9 +8,12 @@
#include "mozilla/Attributes.h"
#include "mozilla/EventForwards.h"
#include "nsTitleBarFrame.h"
+#include "Units.h"
class nsIBaseWindow;
+using namespace mozilla;
+
class nsResizerFrame : public nsTitleBarFrame
{
protected:
diff --git a/layout/xul/nsRootBoxFrame.cpp b/layout/xul/nsRootBoxFrame.cpp
index fe41dce52..3e7515ea8 100644
--- a/layout/xul/nsRootBoxFrame.cpp
+++ b/layout/xul/nsRootBoxFrame.cpp
@@ -8,6 +8,7 @@
#include "nsGkAtoms.h"
#include "nsIPresShell.h"
#include "nsBoxFrame.h"
+#include "nsDisplayList.h"
#include "nsStackLayout.h"
#include "nsIRootBox.h"
#include "nsIContent.h"
@@ -75,7 +76,6 @@ public:
nsEventStatus* aEventStatus) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
/**
@@ -176,14 +176,14 @@ nsRootBoxFrame::Reflow(nsPresContext* aPresContext,
void
nsRootBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (mContent && mContent->GetProperty(nsGkAtoms::DisplayPortMargins)) {
// The XUL document's root element may have displayport margins set in
// ChromeProcessController::InitializeRoot, and we should to supply the
// base rect.
- nsRect displayPortBase = aDirtyRect.Intersect(nsRect(nsPoint(0, 0), GetSize()));
+ nsRect displayPortBase =
+ aBuilder->GetDirtyRect().Intersect(nsRect(nsPoint(0, 0), GetSize()));
nsLayoutUtils::SetDisplayPortBase(mContent, displayPortBase);
}
@@ -192,7 +192,7 @@ nsRootBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// of a background display list element.
DisplayBorderBackgroundOutline(aBuilder, aLists, true);
- BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists);
+ BuildDisplayListForChildren(aBuilder, aLists);
}
nsresult
diff --git a/layout/xul/nsSliderFrame.cpp b/layout/xul/nsSliderFrame.cpp
index 3c1f9ef91..a9e513e2f 100644
--- a/layout/xul/nsSliderFrame.cpp
+++ b/layout/xul/nsSliderFrame.cpp
@@ -311,7 +311,6 @@ nsSliderFrame::AttributeChanged(int32_t aNameSpaceID,
void
nsSliderFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (aBuilder->IsForEventDelivery() && isDraggingThumb()) {
@@ -322,12 +321,11 @@ nsSliderFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
return;
}
- nsBoxFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsBoxFrame::BuildDisplayList(aBuilder, aLists);
}
void
nsSliderFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// if we are too small to have a thumb don't paint it.
@@ -360,8 +358,8 @@ nsSliderFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
nsLayoutUtils::SetScrollbarThumbLayerization(thumb, thumbGetsLayer);
if (thumbGetsLayer) {
- nsDisplayListCollection tempLists;
- nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, tempLists);
+ nsDisplayListCollection tempLists(aBuilder);
+ nsBoxFrame::BuildDisplayListForChildren(aBuilder, tempLists);
// This is a bit of a hack. Collect up all descendant display items
// and merge them into a single Content() list.
@@ -382,7 +380,7 @@ nsSliderFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
}
}
- nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists);
+ nsBoxFrame::BuildDisplayListForChildren(aBuilder, aLists);
}
NS_IMETHODIMP
diff --git a/layout/xul/nsSliderFrame.h b/layout/xul/nsSliderFrame.h
index 832065a21..e4b68fc01 100644
--- a/layout/xul/nsSliderFrame.h
+++ b/layout/xul/nsSliderFrame.h
@@ -64,11 +64,9 @@ public:
virtual void DestroyFrom(nsIFrame* aDestructRoot) override;
virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsresult AttributeChanged(int32_t aNameSpaceID,
diff --git a/layout/xul/nsSplitterFrame.cpp b/layout/xul/nsSplitterFrame.cpp
index 7879a176d..468ccc682 100644
--- a/layout/xul/nsSplitterFrame.cpp
+++ b/layout/xul/nsSplitterFrame.cpp
@@ -358,10 +358,9 @@ nsSplitterFrame::HandleRelease(nsPresContext* aPresContext,
void
nsSplitterFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
- nsBoxFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsBoxFrame::BuildDisplayList(aBuilder, aLists);
// if the mouse is captured always return us as the frame.
if (mInner->mDragging)
diff --git a/layout/xul/nsSplitterFrame.h b/layout/xul/nsSplitterFrame.h
index df8872255..fa1c7525f 100644
--- a/layout/xul/nsSplitterFrame.h
+++ b/layout/xul/nsSplitterFrame.h
@@ -68,7 +68,6 @@ public:
nsEventStatus* aEventStatus) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void GetInitialOrientation(bool& aIsHorizontal) override;
diff --git a/layout/xul/nsStackFrame.cpp b/layout/xul/nsStackFrame.cpp
index 437d558f9..a2ec57adc 100644
--- a/layout/xul/nsStackFrame.cpp
+++ b/layout/xul/nsStackFrame.cpp
@@ -45,7 +45,6 @@ nsStackFrame::nsStackFrame(nsStyleContext* aContext):
// a bit more.
void
nsStackFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// BuildDisplayListForChild puts stacking contexts into the PositionedDescendants
@@ -56,8 +55,7 @@ nsStackFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
nsIFrame* kid = mFrames.FirstChild();
while (kid) {
// Force each child into its own true stacking context.
- BuildDisplayListForChild(aBuilder, kid, aDirtyRect, kidLists,
- DISPLAY_CHILD_FORCE_STACKING_CONTEXT);
+ BuildDisplayListForChild(aBuilder, kid, kidLists, DISPLAY_CHILD_FORCE_STACKING_CONTEXT);
kid = kid->GetNextSibling();
}
}
diff --git a/layout/xul/nsStackFrame.h b/layout/xul/nsStackFrame.h
index b90a16b21..a81a62281 100644
--- a/layout/xul/nsStackFrame.h
+++ b/layout/xul/nsStackFrame.h
@@ -33,7 +33,6 @@ public:
#endif
virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
protected:
diff --git a/layout/xul/nsTextBoxFrame.cpp b/layout/xul/nsTextBoxFrame.cpp
index c82d3d6b9..e1650e0d0 100644
--- a/layout/xul/nsTextBoxFrame.cpp
+++ b/layout/xul/nsTextBoxFrame.cpp
@@ -364,13 +364,12 @@ nsDisplayXULTextBox::GetComponentAlphaBounds(nsDisplayListBuilder* aBuilder)
void
nsTextBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (!IsVisibleForPainting(aBuilder))
return;
- nsLeafBoxFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsLeafBoxFrame::BuildDisplayList(aBuilder, aLists);
aLists.Content()->AppendNewToTop(new (aBuilder)
nsDisplayXULTextBox(aBuilder, this));
diff --git a/layout/xul/nsTextBoxFrame.h b/layout/xul/nsTextBoxFrame.h
index ca1b88748..e12b97b32 100644
--- a/layout/xul/nsTextBoxFrame.h
+++ b/layout/xul/nsTextBoxFrame.h
@@ -48,7 +48,6 @@ public:
bool& aRedraw);
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual ~nsTextBoxFrame();
diff --git a/layout/xul/nsTitleBarFrame.cpp b/layout/xul/nsTitleBarFrame.cpp
index 2792403dc..2f58abecb 100644
--- a/layout/xul/nsTitleBarFrame.cpp
+++ b/layout/xul/nsTitleBarFrame.cpp
@@ -42,7 +42,6 @@ nsTitleBarFrame::nsTitleBarFrame(nsStyleContext* aContext)
void
nsTitleBarFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// override, since we don't want children to get events
@@ -51,7 +50,7 @@ nsTitleBarFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
nsGkAtoms::_true, eCaseMatters))
return;
}
- nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists);
+ nsBoxFrame::BuildDisplayListForChildren(aBuilder, aLists);
}
nsresult
diff --git a/layout/xul/nsTitleBarFrame.h b/layout/xul/nsTitleBarFrame.h
index 17279c578..594d0978b 100644
--- a/layout/xul/nsTitleBarFrame.h
+++ b/layout/xul/nsTitleBarFrame.h
@@ -19,7 +19,6 @@ public:
explicit nsTitleBarFrame(nsStyleContext* aContext);
virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsresult HandleEvent(nsPresContext* aPresContext,
diff --git a/layout/xul/tree/moz.build b/layout/xul/tree/moz.build
index ccac5bde9..7d150881a 100644
--- a/layout/xul/tree/moz.build
+++ b/layout/xul/tree/moz.build
@@ -27,7 +27,7 @@ EXPORTS.mozilla.dom += [
'TreeBoxObject.h'
]
-UNIFIED_SOURCES += [
+SOURCES += [
'nsTreeBodyFrame.cpp',
'nsTreeColFrame.cpp',
'nsTreeColumns.cpp',
diff --git a/layout/xul/tree/nsTreeBodyFrame.cpp b/layout/xul/tree/nsTreeBodyFrame.cpp
index deba04a36..608d802ea 100644
--- a/layout/xul/tree/nsTreeBodyFrame.cpp
+++ b/layout/xul/tree/nsTreeBodyFrame.cpp
@@ -2824,7 +2824,6 @@ public:
// Painting routines
void
nsTreeBodyFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
// REVIEW: why did we paint if we were collapsed? that makes no sense!
@@ -2832,7 +2831,7 @@ nsTreeBodyFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
return; // We're invisible. Don't paint.
// Handles painting our background, border, and outline.
- nsLeafBoxFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
+ nsLeafBoxFrame::BuildDisplayList(aBuilder, aLists);
// Bail out now if there's no view or we can't run script because the
// document is a zombie
diff --git a/layout/xul/tree/nsTreeBodyFrame.h b/layout/xul/tree/nsTreeBodyFrame.h
index 9620c8ccb..6838b0157 100644
--- a/layout/xul/tree/nsTreeBodyFrame.h
+++ b/layout/xul/tree/nsTreeBodyFrame.h
@@ -177,7 +177,6 @@ public:
nsEventStatus* aEventStatus) override;
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual void DidSetStyleContext(nsStyleContext* aOldStyleContext) override;
diff --git a/layout/xul/tree/nsTreeColFrame.cpp b/layout/xul/tree/nsTreeColFrame.cpp
index 649c0b0b4..2ee2903f6 100644
--- a/layout/xul/tree/nsTreeColFrame.cpp
+++ b/layout/xul/tree/nsTreeColFrame.cpp
@@ -110,16 +110,15 @@ nsDisplayXULTreeColSplitterTarget::HitTest(nsDisplayListBuilder* aBuilder, const
void
nsTreeColFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
{
if (!aBuilder->IsForEventDelivery()) {
- nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists);
+ nsBoxFrame::BuildDisplayListForChildren(aBuilder, aLists);
return;
}
- nsDisplayListCollection set;
- nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, set);
+ nsDisplayListCollection set(aBuilder);
+ nsBoxFrame::BuildDisplayListForChildren(aBuilder, set);
WrapListsInRedirector(aBuilder, set, aLists);
diff --git a/layout/xul/tree/nsTreeColFrame.h b/layout/xul/tree/nsTreeColFrame.h
index 8fc3219d5..ebd16fa52 100644
--- a/layout/xul/tree/nsTreeColFrame.h
+++ b/layout/xul/tree/nsTreeColFrame.h
@@ -26,7 +26,6 @@ public:
virtual void DestroyFrom(nsIFrame* aDestructRoot) override;
virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder,
- const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) override;
virtual nsresult AttributeChanged(int32_t aNameSpaceID,