tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 5caa1ec20270c1185da5f50c0ab1f8a077a00600
parent e8963b5923b52555159bd08c0a24eb82b9cbb9df
Author: Lee Salzman <lsalzman@mozilla.com>
Date:   Mon, 27 Oct 2025 02:55:37 +0000

Bug 1996124 - Remove DrawTargetD2D. r=aosmond

DrawTargetD2D is only needed when Direct2D is enabled. We no longer support Direct2D.

Differential Revision: https://phabricator.services.mozilla.com/D269879

Diffstat:
Mgfx/2d/2D.h | 38--------------------------------------
Dgfx/2d/ConicGradientEffectD2D1.cpp | 375-------------------------------------------------------------------------------
Dgfx/2d/ConicGradientEffectD2D1.h | 102-------------------------------------------------------------------------------
Dgfx/2d/DrawTargetD2D1.cpp | 2413-------------------------------------------------------------------------------
Dgfx/2d/DrawTargetD2D1.h | 339-------------------------------------------------------------------------------
Dgfx/2d/ExtendInputEffectD2D1.cpp | 190-------------------------------------------------------------------------------
Dgfx/2d/ExtendInputEffectD2D1.h | 86-------------------------------------------------------------------------------
Mgfx/2d/Factory.cpp | 169+------------------------------------------------------------------------------
Dgfx/2d/FilterNodeD2D1.cpp | 1259-------------------------------------------------------------------------------
Dgfx/2d/FilterNodeD2D1.h | 193-------------------------------------------------------------------------------
Mgfx/2d/Filters.h | 1-
Dgfx/2d/GradientStopsD2D.h | 42------------------------------------------
Dgfx/2d/HelpersD2D.h | 980-------------------------------------------------------------------------------
Agfx/2d/HelpersWin.h | 42++++++++++++++++++++++++++++++++++++++++++
Mgfx/2d/Logging.h | 12------------
Dgfx/2d/PathD2D.cpp | 428-------------------------------------------------------------------------------
Dgfx/2d/PathD2D.h | 119-------------------------------------------------------------------------------
Dgfx/2d/RadialGradientEffectD2D1.cpp | 405-------------------------------------------------------------------------------
Dgfx/2d/RadialGradientEffectD2D1.h | 102-------------------------------------------------------------------------------
Mgfx/2d/RecordedEventImpl.h | 2--
Mgfx/2d/ScaledFontDWrite.cpp | 64----------------------------------------------------------------
Mgfx/2d/ScaledFontDWrite.h | 9---------
Dgfx/2d/ShadersD2D.fx | 824-------------------------------------------------------------------------------
Dgfx/2d/ShadersD2D.h | 10855-------------------------------------------------------------------------------
Dgfx/2d/ShadersD2D1.h | 1186-------------------------------------------------------------------------------
Dgfx/2d/ShadersD2D1.hlsl | 162-------------------------------------------------------------------------------
Dgfx/2d/SourceSurfaceD2D1.cpp | 245-------------------------------------------------------------------------------
Dgfx/2d/SourceSurfaceD2D1.h | 102-------------------------------------------------------------------------------
Mgfx/2d/Types.h | 11+++--------
Dgfx/2d/genshaders.sh | 12------------
Mgfx/2d/gfx2d.vcxproj | 15---------------
Mgfx/2d/moz.build | 7-------
Mgfx/2d/unittest/Main.cpp | 6------
Dgfx/2d/unittest/TestDrawTargetD2D.cpp | 22----------------------
Dgfx/2d/unittest/TestDrawTargetD2D.h | 19-------------------
Mgfx/2d/unittest/unittest.vcxproj | 5+----
Mgfx/layers/client/TextureClient.cpp | 42+++---------------------------------------
Mgfx/layers/d3d11/TextureD3D11.cpp | 279++++---------------------------------------------------------------------------
Mgfx/layers/d3d11/TextureD3D11.h | 6------
Mgfx/layers/ipc/CanvasTranslator.cpp | 1-
Mgfx/thebes/gfxContext.h | 4+---
Mgfx/thebes/gfxPlatform.cpp | 19++++---------------
Mgfx/thebes/gfxPlatform.h | 4----
Mgfx/thebes/gfxUtils.cpp | 82+------------------------------------------------------------------------------
Mgfx/thebes/gfxUtils.h | 3+--
Mimage/VectorImage.cpp | 8+-------
46 files changed, 70 insertions(+), 21219 deletions(-)

diff --git a/gfx/2d/2D.h b/gfx/2d/2D.h @@ -63,9 +63,6 @@ typedef _FcPattern FcPattern; struct ID3D11Texture2D; struct ID3D11Device; -struct ID2D1Device; -struct ID2D1DeviceContext; -struct ID2D1Multithread; struct IDWriteFactory; struct IDWriteRenderingParams; struct IDWriteFontFace; @@ -2358,28 +2355,12 @@ class GFX2D_API Factory { #endif #ifdef WIN32 - static already_AddRefed<DrawTarget> CreateDrawTargetForD3D11Texture( - ID3D11Texture2D* aTexture, SurfaceFormat aFormat); - - /* - * Attempts to create and install a D2D1 device from the supplied Direct3D11 - * device. Returns true on success, or false on failure and leaves the - * D2D1/Direct3D11 devices unset. - */ static bool SetDirect3D11Device(ID3D11Device* aDevice); static RefPtr<ID3D11Device> GetDirect3D11Device(); - static RefPtr<ID2D1Device> GetD2D1Device(uint32_t* aOutSeqNo = nullptr); - static bool HasD2D1Device(); static RefPtr<IDWriteFactory> GetDWriteFactory(); static RefPtr<IDWriteFactory> EnsureDWriteFactory(); - static bool SupportsD2D1(); static RefPtr<IDWriteFontCollection> GetDWriteSystemFonts( bool aUpdate = false); - static RefPtr<ID2D1DeviceContext> GetD2DDeviceContext(); - - static uint64_t GetD2DVRAMUsageDrawTarget(); - static uint64_t GetD2DVRAMUsageSourceSurface(); - static void D2DCleanup(); static already_AddRefed<ScaledFont> CreateScaledFontForDWriteFont( IDWriteFontFace* aFontFace, const gfxFontStyle* aStyle, @@ -2410,13 +2391,10 @@ class GFX2D_API Factory { gfx::ColorRange aColorRange); private: - static StaticRefPtr<ID2D1Device> mD2D1Device; static StaticRefPtr<ID3D11Device> mD3D11Device; static StaticRefPtr<IDWriteFactory> mDWriteFactory; static bool mDWriteFactoryInitialized; static StaticRefPtr<IDWriteFontCollection> mDWriteSystemFonts; - static StaticRefPtr<ID2D1DeviceContext> mMTDC; - static StaticRefPtr<ID2D1DeviceContext> mOffMTDC; static bool ReadbackTexture(uint8_t* aDestData, int32_t aDestStride, ID3D11Texture2D* aSrcTexture); @@ -2432,25 +2410,9 @@ class GFX2D_API Factory { // This guards access to the singleton devices above, as well as the // singleton devices in DrawTargetD2D1. static StaticMutex mDeviceLock; - // This synchronizes access between different D2D drawtargets and their - // implied dependency graph. - static StaticMutex mDTDependencyLock; - - friend class DrawTargetD2D1; #endif // WIN32 }; -class MOZ_RAII AutoSerializeWithMoz2D final { - public: - explicit AutoSerializeWithMoz2D(BackendType aBackendType); - ~AutoSerializeWithMoz2D(); - - private: -#if defined(WIN32) - RefPtr<ID2D1Multithread> mMT; -#endif -}; - } // namespace gfx } // namespace mozilla diff --git a/gfx/2d/ConicGradientEffectD2D1.cpp b/gfx/2d/ConicGradientEffectD2D1.cpp @@ -1,375 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "ConicGradientEffectD2D1.h" - -#include "Logging.h" - -#include "ShadersD2D1.h" -#include "HelpersD2D.h" - -#include <vector> - -#define TEXTW(x) L##x -#define XML(X) \ - TEXTW(#X) // This macro creates a single string from multiple lines of text. - -static const PCWSTR kXmlDescription = - XML( - <?xml version='1.0'?> - <Effect> - <!-- System Properties --> - <Property name='DisplayName' type='string' value='ConicGradientEffect'/> - <Property name='Author' type='string' value='Mozilla'/> - <Property name='Category' type='string' value='Pattern effects'/> - <Property name='Description' type='string' value='This effect is used to render CSS conic gradients.'/> - <Inputs> - <Input name='Geometry'/> - </Inputs> - <Property name='StopCollection' type='iunknown'> - <Property name='DisplayName' type='string' value='Gradient stop collection'/> - </Property> - <Property name='Center' type='vector2'> - <Property name='DisplayName' type='string' value='Gradient center'/> - </Property> - <Property name='Angle' type='vector2'> - <Property name='DisplayName' type='string' value='Gradient angle'/> - </Property> - <Property name='StartOffset' type='float'> - <Property name='DisplayName' type='string' value='Start stop offset'/> - </Property> - <Property name='EndOffset' type='float'> - <Property name='DisplayName' type='string' value='End stop offset'/> - </Property> - <Property name='Transform' type='matrix3x2'> - <Property name='DisplayName' type='string' value='Transform applied to the pattern'/> - </Property> - - </Effect> - ); - -// {091fda1d-857e-4b1e-828f-1c839d9b7897} -static const GUID GUID_SampleConicGradientPS = { - 0x091fda1d, - 0x857e, - 0x4b1e, - {0x82, 0x8f, 0x1c, 0x83, 0x9d, 0x9b, 0x78, 0x97}}; - -namespace mozilla { -namespace gfx { - -ConicGradientEffectD2D1::ConicGradientEffectD2D1() - : mRefCount(0), - mCenter(D2D1::Vector2F(0, 0)), - mAngle(0), - mStartOffset(0), - mEndOffset(0), - mTransform(D2D1::IdentityMatrix()) - -{} - -IFACEMETHODIMP -ConicGradientEffectD2D1::Initialize(ID2D1EffectContext* pContextInternal, - ID2D1TransformGraph* pTransformGraph) { - HRESULT hr; - - hr = pContextInternal->LoadPixelShader(GUID_SampleConicGradientPS, - SampleConicGradientPS, - sizeof(SampleConicGradientPS)); - - if (FAILED(hr)) { - return hr; - } - - hr = pTransformGraph->SetSingleTransformNode(this); - - if (FAILED(hr)) { - return hr; - } - - mEffectContext = pContextInternal; - - return S_OK; -} - -IFACEMETHODIMP -ConicGradientEffectD2D1::PrepareForRender(D2D1_CHANGE_TYPE changeType) { - if (changeType == D2D1_CHANGE_TYPE_NONE) { - return S_OK; - } - - // We'll need to inverse transform our pixel, precompute inverse here. - Matrix mat = ToMatrix(mTransform); - if (!mat.Invert()) { - // Singular - return S_OK; - } - - if (!mStopCollection) { - return S_OK; - } - - HRESULT hr = mDrawInfo->SetPixelShader(GUID_SampleConicGradientPS); - - if (FAILED(hr)) { - return hr; - } - - RefPtr<ID2D1ResourceTexture> tex = CreateGradientTexture(); - hr = mDrawInfo->SetResourceTexture(1, tex); - - if (FAILED(hr)) { - return hr; - } - - struct PSConstantBuffer { - float center[2]; - float angle; - float start_offset; - float end_offset; - float repeat_correct; - float allow_odd; - float padding[1]; - float transform[8]; - }; - - PSConstantBuffer buffer = { - {mCenter.x, mCenter.y}, - mAngle, - mStartOffset, - mEndOffset, - mStopCollection->GetExtendMode() != D2D1_EXTEND_MODE_CLAMP ? 1.0f : 0.0f, - mStopCollection->GetExtendMode() == D2D1_EXTEND_MODE_MIRROR ? 1.0f : 0.0f, - {0.0f}, - {mat._11, mat._21, mat._31, 0.0f, mat._12, mat._22, mat._32, 0.0f}}; - - hr = mDrawInfo->SetPixelShaderConstantBuffer((BYTE*)&buffer, sizeof(buffer)); - - if (FAILED(hr)) { - return hr; - } - - return S_OK; -} - -IFACEMETHODIMP -ConicGradientEffectD2D1::SetGraph(ID2D1TransformGraph* pGraph) { - return pGraph->SetSingleTransformNode(this); -} - -IFACEMETHODIMP_(ULONG) -ConicGradientEffectD2D1::AddRef() { return ++mRefCount; } - -IFACEMETHODIMP_(ULONG) -ConicGradientEffectD2D1::Release() { - if (!--mRefCount) { - delete this; - return 0; - } - return mRefCount; -} - -IFACEMETHODIMP -ConicGradientEffectD2D1::QueryInterface(const IID& aIID, void** aPtr) { - if (!aPtr) { - return E_POINTER; - } - - if (aIID == IID_IUnknown) { - *aPtr = static_cast<IUnknown*>(static_cast<ID2D1EffectImpl*>(this)); - } else if (aIID == IID_ID2D1EffectImpl) { - *aPtr = static_cast<ID2D1EffectImpl*>(this); - } else if (aIID == IID_ID2D1DrawTransform) { - *aPtr = static_cast<ID2D1DrawTransform*>(this); - } else if (aIID == IID_ID2D1Transform) { - *aPtr = static_cast<ID2D1Transform*>(this); - } else if (aIID == IID_ID2D1TransformNode) { - *aPtr = static_cast<ID2D1TransformNode*>(this); - } else { - return E_NOINTERFACE; - } - - static_cast<IUnknown*>(*aPtr)->AddRef(); - return S_OK; -} - -IFACEMETHODIMP -ConicGradientEffectD2D1::MapInputRectsToOutputRect( - const D2D1_RECT_L* pInputRects, const D2D1_RECT_L* pInputOpaqueSubRects, - UINT32 inputRectCount, D2D1_RECT_L* pOutputRect, - D2D1_RECT_L* pOutputOpaqueSubRect) { - if (inputRectCount != 1) { - return E_INVALIDARG; - } - - *pOutputRect = *pInputRects; - *pOutputOpaqueSubRect = *pInputOpaqueSubRects; - return S_OK; -} - -IFACEMETHODIMP -ConicGradientEffectD2D1::MapOutputRectToInputRects( - const D2D1_RECT_L* pOutputRect, D2D1_RECT_L* pInputRects, - UINT32 inputRectCount) const { - if (inputRectCount != 1) { - return E_INVALIDARG; - } - - *pInputRects = *pOutputRect; - return S_OK; -} - -IFACEMETHODIMP -ConicGradientEffectD2D1::MapInvalidRect(UINT32 inputIndex, - D2D1_RECT_L invalidInputRect, - D2D1_RECT_L* pInvalidOutputRect) const { - MOZ_ASSERT(inputIndex == 0); - - *pInvalidOutputRect = invalidInputRect; - return S_OK; -} - -IFACEMETHODIMP -ConicGradientEffectD2D1::SetDrawInfo(ID2D1DrawInfo* pDrawInfo) { - mDrawInfo = pDrawInfo; - return S_OK; -} - -HRESULT -ConicGradientEffectD2D1::Register(ID2D1Factory1* aFactory) { - D2D1_PROPERTY_BINDING bindings[] = { - D2D1_VALUE_TYPE_BINDING(L"StopCollection", - &ConicGradientEffectD2D1::SetStopCollection, - &ConicGradientEffectD2D1::GetStopCollection), - D2D1_VALUE_TYPE_BINDING(L"Center", &ConicGradientEffectD2D1::SetCenter, - &ConicGradientEffectD2D1::GetCenter), - D2D1_VALUE_TYPE_BINDING(L"Angle", &ConicGradientEffectD2D1::SetAngle, - &ConicGradientEffectD2D1::GetAngle), - D2D1_VALUE_TYPE_BINDING(L"StartOffset", - &ConicGradientEffectD2D1::SetStartOffset, - &ConicGradientEffectD2D1::GetStartOffset), - D2D1_VALUE_TYPE_BINDING(L"EndOffset", - &ConicGradientEffectD2D1::SetEndOffset, - &ConicGradientEffectD2D1::GetEndOffset), - D2D1_VALUE_TYPE_BINDING(L"Transform", - &ConicGradientEffectD2D1::SetTransform, - &ConicGradientEffectD2D1::GetTransform)}; - HRESULT hr = aFactory->RegisterEffectFromString( - CLSID_ConicGradientEffect, kXmlDescription, bindings, ARRAYSIZE(bindings), - CreateEffect); - - if (FAILED(hr)) { - gfxWarning() << "Failed to register radial gradient effect."; - } - return hr; -} - -void ConicGradientEffectD2D1::Unregister(ID2D1Factory1* aFactory) { - aFactory->UnregisterEffect(CLSID_ConicGradientEffect); -} - -HRESULT __stdcall ConicGradientEffectD2D1::CreateEffect( - IUnknown** aEffectImpl) { - *aEffectImpl = static_cast<ID2D1EffectImpl*>(new ConicGradientEffectD2D1()); - (*aEffectImpl)->AddRef(); - - return S_OK; -} - -HRESULT -ConicGradientEffectD2D1::SetStopCollection(IUnknown* aStopCollection) { - if (SUCCEEDED(aStopCollection->QueryInterface( - (ID2D1GradientStopCollection**)getter_AddRefs(mStopCollection)))) { - return S_OK; - } - - return E_INVALIDARG; -} - -already_AddRefed<ID2D1ResourceTexture> -ConicGradientEffectD2D1::CreateGradientTexture() { - std::vector<D2D1_GRADIENT_STOP> rawStops; - rawStops.resize(mStopCollection->GetGradientStopCount()); - mStopCollection->GetGradientStops(&rawStops.front(), rawStops.size()); - - std::vector<unsigned char> textureData; - textureData.resize(4096 * 4); - unsigned char* texData = &textureData.front(); - - float prevColorPos = 0; - float nextColorPos = rawStops[0].position; - D2D1_COLOR_F prevColor = rawStops[0].color; - D2D1_COLOR_F nextColor = prevColor; - uint32_t stopPosition = 1; - - // Not the most optimized way but this will do for now. - for (int i = 0; i < 4096; i++) { - // The 4095 seems a little counter intuitive, but we want the gradient - // color at offset 0 at the first pixel, and at offset 1.0f at the last - // pixel. - float pos = float(i) / 4095; - - while (pos > nextColorPos) { - prevColor = nextColor; - prevColorPos = nextColorPos; - if (rawStops.size() > stopPosition) { - nextColor = rawStops[stopPosition].color; - nextColorPos = rawStops[stopPosition++].position; - } else { - nextColorPos = 1.0f; - } - } - - float interp; - - if (nextColorPos != prevColorPos) { - interp = (pos - prevColorPos) / (nextColorPos - prevColorPos); - } else { - interp = 0; - } - - DeviceColor newColor(prevColor.r + (nextColor.r - prevColor.r) * interp, - prevColor.g + (nextColor.g - prevColor.g) * interp, - prevColor.b + (nextColor.b - prevColor.b) * interp, - prevColor.a + (nextColor.a - prevColor.a) * interp); - - // Note D2D expects RGBA here!! - texData[i * 4] = (unsigned char)(255.0f * newColor.r); - texData[i * 4 + 1] = (unsigned char)(255.0f * newColor.g); - texData[i * 4 + 2] = (unsigned char)(255.0f * newColor.b); - texData[i * 4 + 3] = (unsigned char)(255.0f * newColor.a); - } - - RefPtr<ID2D1ResourceTexture> tex; - - UINT32 width = 4096; - UINT32 stride = 4096 * 4; - D2D1_RESOURCE_TEXTURE_PROPERTIES props; - // Older shader models do not support 1D textures. So just use a width x 1 - // texture. - props.dimensions = 2; - UINT32 dims[] = {width, 1}; - props.extents = dims; - props.channelDepth = D2D1_CHANNEL_DEPTH_4; - props.bufferPrecision = D2D1_BUFFER_PRECISION_8BPC_UNORM; - props.filter = D2D1_FILTER_MIN_MAG_MIP_LINEAR; - D2D1_EXTEND_MODE extendMode[] = {mStopCollection->GetExtendMode(), - mStopCollection->GetExtendMode()}; - props.extendModes = extendMode; - - HRESULT hr = mEffectContext->CreateResourceTexture( - nullptr, &props, &textureData.front(), &stride, 4096 * 4, - getter_AddRefs(tex)); - - if (FAILED(hr)) { - gfxWarning() << "Failed to create resource texture: " << hexa(hr); - } - - return tex.forget(); -} - -} // namespace gfx -} // namespace mozilla diff --git a/gfx/2d/ConicGradientEffectD2D1.h b/gfx/2d/ConicGradientEffectD2D1.h @@ -1,102 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef MOZILLA_GFX_CONICGRADIENTEFFECTD2D1_H_ -#define MOZILLA_GFX_CONICGRADIENTEFFECTD2D1_H_ - -#include <d2d1_1.h> -#include <d2d1effectauthor.h> -#include <d2d1effecthelpers.h> - -#include "2D.h" - -// {fa4e3246-be57-4052-8c8b-881cc3633287} -DEFINE_GUID(CLSID_ConicGradientEffect, 0xfa4e3246, 0xbe57, 0x4052, 0x8c, 0x8b, - 0x88, 0x1c, 0xc3, 0x63, 0x32, 0x87); - -// Macro to keep our class nice and clean. -#define SIMPLE_PROP(type, name) \ - public: \ - HRESULT Set##name(type a##name) { \ - m##name = a##name; \ - return S_OK; \ - } \ - type Get##name() const { return m##name; } \ - \ - private: \ - type m##name; - -namespace mozilla { -namespace gfx { - -enum { - CONIC_PROP_STOP_COLLECTION = 0, - CONIC_PROP_CENTER, - CONIC_PROP_ANGLE, - CONIC_PROP_START_OFFSET, - CONIC_PROP_END_OFFSET, - CONIC_PROP_TRANSFORM -}; - -class ConicGradientEffectD2D1 final : public ID2D1EffectImpl, - public ID2D1DrawTransform { - public: - // ID2D1EffectImpl - IFACEMETHODIMP Initialize(ID2D1EffectContext* pContextInternal, - ID2D1TransformGraph* pTransformGraph); - IFACEMETHODIMP PrepareForRender(D2D1_CHANGE_TYPE changeType); - IFACEMETHODIMP SetGraph(ID2D1TransformGraph* pGraph); - - // IUnknown - IFACEMETHODIMP_(ULONG) AddRef(); - IFACEMETHODIMP_(ULONG) Release(); - IFACEMETHODIMP QueryInterface(REFIID riid, void** ppOutput); - - // ID2D1Transform - IFACEMETHODIMP MapInputRectsToOutputRect( - const D2D1_RECT_L* pInputRects, const D2D1_RECT_L* pInputOpaqueSubRects, - UINT32 inputRectCount, D2D1_RECT_L* pOutputRect, - D2D1_RECT_L* pOutputOpaqueSubRect); - IFACEMETHODIMP MapOutputRectToInputRects(const D2D1_RECT_L* pOutputRect, - D2D1_RECT_L* pInputRects, - UINT32 inputRectCount) const; - IFACEMETHODIMP MapInvalidRect(UINT32 inputIndex, D2D1_RECT_L invalidInputRect, - D2D1_RECT_L* pInvalidOutputRect) const; - - // ID2D1TransformNode - IFACEMETHODIMP_(UINT32) GetInputCount() const { return 1; } - - // ID2D1DrawTransform - IFACEMETHODIMP SetDrawInfo(ID2D1DrawInfo* pDrawInfo); - - static HRESULT Register(ID2D1Factory1* aFactory); - static void Unregister(ID2D1Factory1* aFactory); - static HRESULT __stdcall CreateEffect(IUnknown** aEffectImpl); - - HRESULT SetStopCollection(IUnknown* aStopCollection); - IUnknown* GetStopCollection() const { return mStopCollection; } - - private: - already_AddRefed<ID2D1ResourceTexture> CreateGradientTexture(); - - ConicGradientEffectD2D1(); - - uint32_t mRefCount; - RefPtr<ID2D1GradientStopCollection> mStopCollection; - RefPtr<ID2D1EffectContext> mEffectContext; - RefPtr<ID2D1DrawInfo> mDrawInfo; - SIMPLE_PROP(D2D1_VECTOR_2F, Center); - SIMPLE_PROP(FLOAT, Angle); - SIMPLE_PROP(FLOAT, StartOffset); - SIMPLE_PROP(FLOAT, EndOffset); - SIMPLE_PROP(D2D_MATRIX_3X2_F, Transform); -}; - -} // namespace gfx -} // namespace mozilla -#undef SIMPLE_PROP - -#endif diff --git a/gfx/2d/DrawTargetD2D1.cpp b/gfx/2d/DrawTargetD2D1.cpp @@ -1,2413 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include <optional> - -#include <initguid.h> -#include "DrawTargetD2D1.h" -#include "FilterNodeSoftware.h" -#include "GradientStopsD2D.h" -#include "SourceSurfaceD2D1.h" -#include "ConicGradientEffectD2D1.h" -#include "RadialGradientEffectD2D1.h" - -#include "HelpersD2D.h" -#include "FilterNodeD2D1.h" -#include "ExtendInputEffectD2D1.h" -#include "nsAppRunner.h" -#include "MainThreadUtils.h" - -#include "mozilla/Mutex.h" - -// decltype is not usable for overloaded functions. -typedef HRESULT(WINAPI* D2D1CreateFactoryFunc)( - D2D1_FACTORY_TYPE factoryType, REFIID iid, - CONST D2D1_FACTORY_OPTIONS* pFactoryOptions, void** factory); - -namespace mozilla { -namespace gfx { - -uint64_t DrawTargetD2D1::mVRAMUsageDT; -uint64_t DrawTargetD2D1::mVRAMUsageSS; -StaticRefPtr<ID2D1Factory1> DrawTargetD2D1::mFactory; - -MOZ_RUNINIT const D2D1_MATRIX_5X4_F kLuminanceMatrix = - D2D1::Matrix5x4F(0, 0, 0, 0.2125f, 0, 0, 0, 0.7154f, 0, 0, 0, 0.0721f, 0, 0, - 0, 0, 0, 0, 0, 0); - -RefPtr<ID2D1Factory1> D2DFactory() { return DrawTargetD2D1::factory(); } - -DrawTargetD2D1::DrawTargetD2D1() - : mPushedLayers(1), - mSnapshotLock(std::make_shared<Mutex>("DrawTargetD2D1::mSnapshotLock")), - mUsedCommandListsSincePurge(0), - mTransformedGlyphsSinceLastPurge(0), - mComplexBlendsWithListInList(0), - mDeviceSeq(0), - mInitState(InitState::Uninitialized) {} - -DrawTargetD2D1::~DrawTargetD2D1() { - PopAllClips(); - - if (mSnapshot) { - MutexAutoLock lock(*mSnapshotLock); - // We may hold the only reference. MarkIndependent will clear mSnapshot; - // keep the snapshot object alive so it doesn't get destroyed while - // MarkIndependent is running. - RefPtr<SourceSurfaceD2D1> deathGrip = mSnapshot; - // mSnapshot can be treated as independent of this DrawTarget since we know - // this DrawTarget won't change again. - deathGrip->MarkIndependent(); - // mSnapshot will be cleared now. - } - - if (mDC && IsDeviceContextValid()) { - // The only way mDC can be null is if Init failed, but it can happen and the - // destructor is the only place where we need to check for it since the - // DrawTarget will destroyed right after Init fails. - mDC->EndDraw(); - } - - { - // Until this point in the destructor it -must- still be valid for - // FlushInternal to be called on this. - StaticMutexAutoLock lock(Factory::mDTDependencyLock); - // Targets depending on us can break that dependency, since we're obviously - // not going to be modified in the future. - for (auto iter = mDependentTargets.begin(); iter != mDependentTargets.end(); - iter++) { - (*iter)->mDependingOnTargets.erase(this); - } - // Our dependencies on other targets no longer matter. - for (TargetSet::iterator iter = mDependingOnTargets.begin(); - iter != mDependingOnTargets.end(); iter++) { - (*iter)->mDependentTargets.erase(this); - } - } -} - -bool DrawTargetD2D1::IsValid() const { - if (mInitState != InitState::Uninitialized && !IsDeviceContextValid()) { - return false; - } - if (NS_IsMainThread()) { - // Uninitialized DTs are considered valid. - return mInitState != InitState::Failure; - } else { - return const_cast<DrawTargetD2D1*>(this)->EnsureInitialized(); - } -} - -already_AddRefed<SourceSurface> DrawTargetD2D1::Snapshot() { - if (!EnsureInitialized()) { - return nullptr; - } - - MutexAutoLock lock(*mSnapshotLock); - if (mSnapshot) { - RefPtr<SourceSurface> snapshot(mSnapshot); - return snapshot.forget(); - } - PopAllClips(); - - Flush(); - - mSnapshot = new SourceSurfaceD2D1(mBitmap, mDC, mFormat, mSize, this); - - RefPtr<SourceSurface> snapshot(mSnapshot); - return snapshot.forget(); -} - -bool DrawTargetD2D1::EnsureLuminanceEffect() { - if (mLuminanceEffect.get()) { - return true; - } - - HRESULT hr = mDC->CreateEffect(CLSID_D2D1ColorMatrix, - getter_AddRefs(mLuminanceEffect)); - if (FAILED(hr)) { - gfxCriticalError() << "Failed to create luminance effect. Code: " - << hexa(hr); - return false; - } - - mLuminanceEffect->SetValue(D2D1_COLORMATRIX_PROP_COLOR_MATRIX, - kLuminanceMatrix); - mLuminanceEffect->SetValue(D2D1_COLORMATRIX_PROP_ALPHA_MODE, - D2D1_COLORMATRIX_ALPHA_MODE_STRAIGHT); - return true; -} - -already_AddRefed<SourceSurface> DrawTargetD2D1::IntoLuminanceSource( - LuminanceType aLuminanceType, float aOpacity) { - if (!EnsureInitialized()) { - return nullptr; - } - if ((aLuminanceType != LuminanceType::LUMINANCE) || - // See bug 1372577, some race condition where we get invalid - // results with D2D in the parent process. Fallback in that case. - XRE_IsParentProcess()) { - return DrawTarget::IntoLuminanceSource(aLuminanceType, aOpacity); - } - - // Create the luminance effect - if (!EnsureLuminanceEffect()) { - return DrawTarget::IntoLuminanceSource(aLuminanceType, aOpacity); - } - - Flush(); - - { - D2D1_MATRIX_5X4_F matrix = kLuminanceMatrix; - matrix._14 *= aOpacity; - matrix._24 *= aOpacity; - matrix._34 *= aOpacity; - - mLuminanceEffect->SetValue(D2D1_COLORMATRIX_PROP_COLOR_MATRIX, matrix); - } - - mLuminanceEffect->SetInput(0, mBitmap); - - RefPtr<ID2D1Image> luminanceOutput; - mLuminanceEffect->GetOutput(getter_AddRefs(luminanceOutput)); - - return MakeAndAddRef<SourceSurfaceD2D1>(luminanceOutput, mDC, - SurfaceFormat::B8G8R8A8, mSize); -} - -// Command lists are kept around by device contexts until EndDraw is called, -// this can cause issues with memory usage (see bug 1238328). EndDraw/BeginDraw -// are expensive though, especially relatively when little work is done, so -// we try to reduce the amount of times we execute these purges. -static const uint32_t kPushedLayersBeforePurge = 25; -// Rendering glyphs with different transforms causes the glyph cache to grow -// very large (see bug 1474883) so we must call EndDraw every so often. -static const uint32_t kTransformedGlyphsBeforePurge = 1000; - -void DrawTargetD2D1::Flush() { FlushInternal(); } - -bool DrawTargetD2D1::MaybeClearRect(CompositionOp aOp, const Rect& aBounds) { - if (aOp == CompositionOp::OP_CLEAR) { - FillRect(aBounds, ColorPattern(DeviceColor(1.0f, 1.0f, 1.0f, 1.0f)), - DrawOptions(1.0f, aOp)); - return true; - } - return false; -} - -void DrawTargetD2D1::DrawSurface(SourceSurface* aSurface, const Rect& aDest, - const Rect& aSource, - const DrawSurfaceOptions& aSurfOptions, - const DrawOptions& aOptions) { - if (MaybeClearRect(aOptions.mCompositionOp, aDest)) { - return; - } - - if (!PrepareForDrawing(aOptions.mCompositionOp, - ColorPattern(DeviceColor()))) { - return; - } - - Rect source = aSource - aSurface->GetRect().TopLeft(); - - D2D1_RECT_F samplingBounds; - - if (aSurfOptions.mSamplingBounds == SamplingBounds::BOUNDED) { - samplingBounds = D2DRect(source); - } else { - samplingBounds = D2D1::RectF(0, 0, Float(aSurface->GetSize().width), - Float(aSurface->GetSize().height)); - } - - Float xScale = aDest.Width() / source.Width(); - Float yScale = aDest.Height() / source.Height(); - - RefPtr<ID2D1ImageBrush> brush; - - // Here we scale the source pattern up to the size and position where we want - // it to be. - Matrix transform; - transform.PreTranslate(aDest.X() - source.X() * xScale, - aDest.Y() - source.Y() * yScale); - transform.PreScale(xScale, yScale); - - RefPtr<ID2D1Image> image = - GetImageForSurface(aSurface, transform, ExtendMode::CLAMP); - - if (!image) { - gfxWarning() << *this << ": Unable to get D2D image for surface."; - return; - } - - RefPtr<ID2D1Bitmap> bitmap; - HRESULT hr = E_FAIL; - if (aSurface->GetType() == SurfaceType::D2D1_1_IMAGE) { - // If this is called with a DataSourceSurface it might do a partial upload - // that our DrawBitmap call doesn't support. - hr = image->QueryInterface((ID2D1Bitmap**)getter_AddRefs(bitmap)); - } - - if (SUCCEEDED(hr) && bitmap && - aSurfOptions.mSamplingBounds == SamplingBounds::UNBOUNDED) { - mDC->DrawBitmap(bitmap, D2DRect(aDest), aOptions.mAlpha, - D2DFilter(aSurfOptions.mSamplingFilter), D2DRect(source)); - } else { - // This has issues ignoring the alpha channel on windows 7 with images - // marked opaque. - MOZ_ASSERT(aSurface->GetFormat() != SurfaceFormat::B8G8R8X8); - - // Bug 1275478 - D2D1 cannot draw A8 surface correctly. - MOZ_ASSERT(aSurface->GetFormat() != SurfaceFormat::A8); - - mDC->CreateImageBrush( - image, - D2D1::ImageBrushProperties( - samplingBounds, D2D1_EXTEND_MODE_CLAMP, D2D1_EXTEND_MODE_CLAMP, - D2DInterpolationMode(aSurfOptions.mSamplingFilter)), - D2D1::BrushProperties(aOptions.mAlpha, D2DMatrix(transform)), - getter_AddRefs(brush)); - mDC->FillRectangle(D2DRect(aDest), brush); - } - - FinalizeDrawing(aOptions.mCompositionOp, ColorPattern(DeviceColor())); -} - -void DrawTargetD2D1::DrawFilter(FilterNode* aNode, const Rect& aSourceRect, - const Point& aDestPoint, - const DrawOptions& aOptions) { - if (aNode->GetBackendType() != FILTER_BACKEND_DIRECT2D1_1) { - gfxWarning() << *this << ": Incompatible filter passed to DrawFilter."; - return; - } - - if (MaybeClearRect(aOptions.mCompositionOp, - Rect(aDestPoint, aSourceRect.Size()))) { - return; - } - - if (!PrepareForDrawing(aOptions.mCompositionOp, - ColorPattern(DeviceColor()))) { - return; - } - - mDC->SetAntialiasMode(D2DAAMode(aOptions.mAntialiasMode)); - - FilterNodeD2D1* node = static_cast<FilterNodeD2D1*>(aNode); - node->WillDraw(this); - - if (aOptions.mAlpha == 1.0f) { - mDC->DrawImage(node->OutputEffect(), D2DPoint(aDestPoint), - D2DRect(aSourceRect)); - } else { - RefPtr<ID2D1Image> image; - node->OutputEffect()->GetOutput(getter_AddRefs(image)); - - Matrix mat = Matrix::Translation(aDestPoint); - - RefPtr<ID2D1ImageBrush> imageBrush; - mDC->CreateImageBrush( - image, D2D1::ImageBrushProperties(D2DRect(aSourceRect)), - D2D1::BrushProperties(aOptions.mAlpha, D2DMatrix(mat)), - getter_AddRefs(imageBrush)); - mDC->FillRectangle(D2D1::RectF(aDestPoint.x, aDestPoint.y, - aDestPoint.x + aSourceRect.width, - aDestPoint.y + aSourceRect.height), - imageBrush); - } - - FinalizeDrawing(aOptions.mCompositionOp, ColorPattern(DeviceColor())); -} - -void DrawTargetD2D1::DrawSurfaceWithShadow(SourceSurface* aSurface, - const Point& aDest, - const ShadowOptions& aShadow, - CompositionOp aOperator) { - if (!EnsureInitialized()) { - return; - } - - if (MaybeClearRect(aOperator, Rect(aDest, Size(aSurface->GetSize())))) { - return; - } - - MarkChanged(); - - Matrix mat; - RefPtr<ID2D1Image> image = - GetImageForSurface(aSurface, mat, ExtendMode::CLAMP, nullptr, false); - - if (!image) { - gfxWarning() << "Couldn't get image for surface."; - return; - } - - if (!mat.IsIdentity()) { - gfxDebug() << *this - << ": At this point complex partial uploads are not supported " - "for Shadow surfaces."; - return; - } - - if (!PrepareForDrawing(aOperator, ColorPattern(aShadow.mColor))) { - return; - } - - mDC->SetTransform(D2D1::IdentityMatrix()); - mTransformDirty = true; - - RefPtr<ID2D1Effect> shadowEffect; - HRESULT hr = mDC->CreateEffect( - mFormat == SurfaceFormat::A8 ? CLSID_D2D1GaussianBlur : CLSID_D2D1Shadow, - getter_AddRefs(shadowEffect)); - if (SUCCEEDED(hr) && shadowEffect) { - shadowEffect->SetInput(0, image); - if (mFormat == SurfaceFormat::A8) { - shadowEffect->SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, - aShadow.mSigma); - shadowEffect->SetValue(D2D1_GAUSSIANBLUR_PROP_BORDER_MODE, - D2D1_BORDER_MODE_HARD); - } else { - shadowEffect->SetValue(D2D1_SHADOW_PROP_BLUR_STANDARD_DEVIATION, - aShadow.mSigma); - D2D1_VECTOR_4F color = {aShadow.mColor.r, aShadow.mColor.g, - aShadow.mColor.b, aShadow.mColor.a}; - shadowEffect->SetValue(D2D1_SHADOW_PROP_COLOR, color); - } - - D2D1_POINT_2F shadowPoint = D2DPoint(aDest + aShadow.mOffset); - mDC->DrawImage(shadowEffect, &shadowPoint, nullptr, - D2D1_INTERPOLATION_MODE_LINEAR, - D2D1_COMPOSITE_MODE_SOURCE_OVER); - } else { - gfxWarning() << "Failed to create shadow effect. Code: " << hexa(hr); - } - - if (aSurface->GetFormat() != SurfaceFormat::A8) { - D2D1_POINT_2F imgPoint = D2DPoint(aDest); - mDC->DrawImage(image, &imgPoint, nullptr, D2D1_INTERPOLATION_MODE_LINEAR, - D2D1_COMPOSITE_MODE_SOURCE_OVER); - } - - FinalizeDrawing(aOperator, ColorPattern(aShadow.mColor)); -} - -void DrawTargetD2D1::ClearRect(const Rect& aRect) { - if (!EnsureInitialized()) { - return; - } - - if (aRect.IsEmpty()) { - // Nothing to be done. - return; - } - - MarkChanged(); - - PopAllClips(); - - PushClipRect(aRect); - - if (mTransformDirty || !mTransform.IsIdentity()) { - mDC->SetTransform(D2D1::IdentityMatrix()); - mTransformDirty = true; - } - - D2D1_RECT_F clipRect; - bool isPixelAligned; - if (mTransform.IsRectilinear() && - GetDeviceSpaceClipRect(clipRect, isPixelAligned)) { - mDC->PushAxisAlignedClip(clipRect, isPixelAligned - ? D2D1_ANTIALIAS_MODE_ALIASED - : D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); - mDC->Clear(); - mDC->PopAxisAlignedClip(); - - PopClip(); - return; - } - - RefPtr<ID2D1CommandList> list; - mUsedCommandListsSincePurge++; - mDC->CreateCommandList(getter_AddRefs(list)); - mDC->SetTarget(list); - - IntRect addClipRect; - RefPtr<ID2D1Geometry> geom = GetClippedGeometry(&addClipRect); - - RefPtr<ID2D1SolidColorBrush> brush; - mDC->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::White), - getter_AddRefs(brush)); - mDC->PushAxisAlignedClip( - D2D1::RectF(addClipRect.X(), addClipRect.Y(), addClipRect.XMost(), - addClipRect.YMost()), - D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); - mDC->FillGeometry(geom, brush); - mDC->PopAxisAlignedClip(); - - mDC->SetTarget(CurrentTarget()); - list->Close(); - - mDC->DrawImage(list, D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR, - D2D1_COMPOSITE_MODE_DESTINATION_OUT); - - PopClip(); - - return; -} - -void DrawTargetD2D1::MaskSurface(const Pattern& aSource, SourceSurface* aMask, - Point aOffset, const DrawOptions& aOptions) { - if (!EnsureInitialized()) { - return; - } - MarkChanged(); - - RefPtr<ID2D1Bitmap> bitmap; - - Matrix mat = Matrix::Translation(aOffset); - RefPtr<ID2D1Image> image = - GetImageForSurface(aMask, mat, ExtendMode::CLAMP, nullptr); - - MOZ_ASSERT(!mat.HasNonTranslation()); - aOffset.x = mat._31; - aOffset.y = mat._32; - - if (!image) { - gfxWarning() << "Failed to get image for surface."; - return; - } - - if (!PrepareForDrawing(aOptions.mCompositionOp, aSource)) { - return; - } - - IntSize size = - IntSize::Truncate(aMask->GetSize().width, aMask->GetSize().height); - Rect dest = - Rect(aOffset.x + aMask->GetRect().x, aOffset.y + aMask->GetRect().y, - Float(size.width), Float(size.height)); - - HRESULT hr = image->QueryInterface((ID2D1Bitmap**)getter_AddRefs(bitmap)); - if (!bitmap || FAILED(hr)) { - // D2D says if we have an actual ID2D1Image and not a bitmap underlying the - // object, we can't query for a bitmap. Instead, Push/PopLayer - gfxWarning() << "FillOpacityMask only works with Bitmap source surfaces. " - "Falling back to push/pop layer"; - - RefPtr<ID2D1Brush> source = CreateBrushForPattern(aSource, aOptions); - RefPtr<ID2D1ImageBrush> maskBrush; - hr = mDC->CreateImageBrush( - image, - D2D1::ImageBrushProperties(D2D1::RectF(0, 0, size.width, size.height)), - D2D1::BrushProperties( - 1.0f, D2D1::Matrix3x2F::Translation(aMask->GetRect().x, - aMask->GetRect().y)), - getter_AddRefs(maskBrush)); - MOZ_ASSERT(SUCCEEDED(hr)); - - mDC->PushLayer( - D2D1::LayerParameters1(D2D1::InfiniteRect(), nullptr, - D2D1_ANTIALIAS_MODE_PER_PRIMITIVE, - D2D1::Matrix3x2F::Translation( - aMask->GetRect().x, aMask->GetRect().y), - 1.0f, maskBrush, D2D1_LAYER_OPTIONS1_NONE), - nullptr); - - mDC->FillRectangle(D2DRect(dest), source); - mDC->PopLayer(); - - FinalizeDrawing(aOptions.mCompositionOp, aSource); - return; - } else { - // If this is a data source surface, we might have created a partial bitmap - // for this surface and only uploaded part of the mask. In that case, - // we have to fixup our sizes here. - size.width = bitmap->GetSize().width; - size.height = bitmap->GetSize().height; - dest.SetWidth(size.width); - dest.SetHeight(size.height); - } - - // FillOpacityMask only works if the antialias mode is MODE_ALIASED - mDC->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED); - - Rect maskRect = Rect(aMask->GetRect().x, aMask->GetRect().y, - Float(size.width), Float(size.height)); - RefPtr<ID2D1Brush> brush = CreateBrushForPattern(aSource, aOptions); - mDC->FillOpacityMask(bitmap, brush, D2D1_OPACITY_MASK_CONTENT_GRAPHICS, - D2DRect(dest), D2DRect(maskRect)); - - mDC->SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); - - FinalizeDrawing(aOptions.mCompositionOp, aSource); -} - -void DrawTargetD2D1::CopySurface(SourceSurface* aSurface, - const IntRect& aSourceRect, - const IntPoint& aDestination) { - if (!EnsureInitialized()) { - return; - } - MarkChanged(); - - PopAllClips(); - - mDC->SetTransform(D2D1::IdentityMatrix()); - mTransformDirty = true; - - Matrix mat = Matrix::Translation(aDestination - aSourceRect.TopLeft() + - aSurface->GetRect().TopLeft()); - RefPtr<ID2D1Image> image = - GetImageForSurface(aSurface, mat, ExtendMode::CLAMP, nullptr, false); - - if (!image) { - gfxWarning() << "Couldn't get image for surface."; - return; - } - - if (mat.HasNonIntegerTranslation()) { - gfxDebug() << *this - << ": At this point scaled partial uploads are not supported " - "for CopySurface."; - return; - } - - IntRect srcRect(aDestination - IntPoint::Round(mat.GetTranslation()), - aSourceRect.Size()); - IntRect dstRect(aDestination, aSourceRect.Size()); - - RefPtr<ID2D1Bitmap> bitmap; - HRESULT hr = image->QueryInterface((ID2D1Bitmap**)getter_AddRefs(bitmap)); - - if (SUCCEEDED(hr) && bitmap && mFormat == SurfaceFormat::A8) { - RefPtr<ID2D1SolidColorBrush> brush; - mDC->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::White), - D2D1::BrushProperties(), getter_AddRefs(brush)); - mDC->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED); - mDC->SetPrimitiveBlend(D2D1_PRIMITIVE_BLEND_COPY); - mDC->FillOpacityMask(bitmap, brush, D2D1_OPACITY_MASK_CONTENT_GRAPHICS); - mDC->SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); - mDC->SetPrimitiveBlend(D2D1_PRIMITIVE_BLEND_SOURCE_OVER); - return; - } - - if (SUCCEEDED(hr) && bitmap) { - mDC->SetPrimitiveBlend(D2D1_PRIMITIVE_BLEND_COPY); - mDC->DrawBitmap(bitmap, D2DRect(dstRect), 1.0f, - D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, - D2DRect(srcRect)); - mDC->SetPrimitiveBlend(D2D1_PRIMITIVE_BLEND_SOURCE_OVER); - return; - } - - mDC->DrawImage(image, D2DPoint(aDestination), D2DRect(srcRect), - D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR, - D2D1_COMPOSITE_MODE_BOUNDED_SOURCE_COPY); -} - -void DrawTargetD2D1::FillRect(const Rect& aRect, const Pattern& aPattern, - const DrawOptions& aOptions) { - if (!PrepareForDrawing(aOptions.mCompositionOp, aPattern)) { - return; - } - - mDC->SetAntialiasMode(D2DAAMode(aOptions.mAntialiasMode)); - - RefPtr<ID2D1Brush> brush = CreateBrushForPattern(aPattern, aOptions); - mDC->FillRectangle(D2DRect(aRect), brush); - - FinalizeDrawing(aOptions.mCompositionOp, aPattern); -} - -void DrawTargetD2D1::FillRoundedRect(const RoundedRect& aRect, - const Pattern& aPattern, - const DrawOptions& aOptions) { - if (!aRect.corners.AreRadiiSame()) { - return DrawTarget::FillRoundedRect(aRect, aPattern, aOptions); - } - - if (!PrepareForDrawing(aOptions.mCompositionOp, aPattern)) { - return; - } - - mDC->SetAntialiasMode(D2DAAMode(aOptions.mAntialiasMode)); - - RefPtr<ID2D1Brush> brush = CreateBrushForPattern(aPattern, aOptions); - mDC->FillRoundedRectangle(D2DRoundedRect(aRect), brush); - - FinalizeDrawing(aOptions.mCompositionOp, aPattern); -} - -void DrawTargetD2D1::StrokeRect(const Rect& aRect, const Pattern& aPattern, - const StrokeOptions& aStrokeOptions, - const DrawOptions& aOptions) { - if (!PrepareForDrawing(aOptions.mCompositionOp, aPattern)) { - return; - } - - mDC->SetAntialiasMode(D2DAAMode(aOptions.mAntialiasMode)); - - RefPtr<ID2D1Brush> brush = CreateBrushForPattern(aPattern, aOptions); - RefPtr<ID2D1StrokeStyle> strokeStyle = - CreateStrokeStyleForOptions(aStrokeOptions); - - mDC->DrawRectangle(D2DRect(aRect), brush, aStrokeOptions.mLineWidth, - strokeStyle); - - FinalizeDrawing(aOptions.mCompositionOp, aPattern); -} - -void DrawTargetD2D1::StrokeLine(const Point& aStart, const Point& aEnd, - const Pattern& aPattern, - const StrokeOptions& aStrokeOptions, - const DrawOptions& aOptions) { - if (!PrepareForDrawing(aOptions.mCompositionOp, aPattern)) { - return; - } - - mDC->SetAntialiasMode(D2DAAMode(aOptions.mAntialiasMode)); - - RefPtr<ID2D1Brush> brush = CreateBrushForPattern(aPattern, aOptions); - RefPtr<ID2D1StrokeStyle> strokeStyle = - CreateStrokeStyleForOptions(aStrokeOptions); - - mDC->DrawLine(D2DPoint(aStart), D2DPoint(aEnd), brush, - aStrokeOptions.mLineWidth, strokeStyle); - - FinalizeDrawing(aOptions.mCompositionOp, aPattern); -} -void DrawTargetD2D1::StrokeCircle(const Point& aOrigin, float radius, - const Pattern& aPattern, - const StrokeOptions& aStrokeOptions, - const DrawOptions& aOptions) { - if (!PrepareForDrawing(aOptions.mCompositionOp, aPattern)) { - return; - } - - mDC->SetAntialiasMode(D2DAAMode(aOptions.mAntialiasMode)); - - RefPtr<ID2D1Brush> brush = CreateBrushForPattern(aPattern, aOptions); - RefPtr<ID2D1StrokeStyle> strokeStyle = - CreateStrokeStyleForOptions(aStrokeOptions); - - mDC->DrawEllipse(D2D1::Ellipse(D2DPoint(aOrigin), radius, radius), brush, - aStrokeOptions.mLineWidth, strokeStyle); - - FinalizeDrawing(aOptions.mCompositionOp, aPattern); -} - -void DrawTargetD2D1::FillCircle(const Point& aOrigin, float radius, - const Pattern& aPattern, - const DrawOptions& aOptions) { - if (!PrepareForDrawing(aOptions.mCompositionOp, aPattern)) { - return; - } - - mDC->SetAntialiasMode(D2DAAMode(aOptions.mAntialiasMode)); - - RefPtr<ID2D1Brush> brush = CreateBrushForPattern(aPattern, aOptions); - - mDC->FillEllipse(D2D1::Ellipse(D2DPoint(aOrigin), radius, radius), brush); - - FinalizeDrawing(aOptions.mCompositionOp, aPattern); -} - -void DrawTargetD2D1::Stroke(const Path* aPath, const Pattern& aPattern, - const StrokeOptions& aStrokeOptions, - const DrawOptions& aOptions) { - const Path* path = aPath; - if (path->GetBackendType() != BackendType::DIRECT2D1_1) { - gfxDebug() << *this << ": Ignoring drawing call for incompatible path."; - return; - } - const PathD2D* d2dPath = static_cast<const PathD2D*>(path); - - if (!PrepareForDrawing(aOptions.mCompositionOp, aPattern)) { - return; - } - - mDC->SetAntialiasMode(D2DAAMode(aOptions.mAntialiasMode)); - - RefPtr<ID2D1Brush> brush = CreateBrushForPattern(aPattern, aOptions); - RefPtr<ID2D1StrokeStyle> strokeStyle = - CreateStrokeStyleForOptions(aStrokeOptions); - - mDC->DrawGeometry(d2dPath->mGeometry, brush, aStrokeOptions.mLineWidth, - strokeStyle); - - FinalizeDrawing(aOptions.mCompositionOp, aPattern); -} - -void DrawTargetD2D1::Fill(const Path* aPath, const Pattern& aPattern, - const DrawOptions& aOptions) { - const Path* path = aPath; - if (!path || path->GetBackendType() != BackendType::DIRECT2D1_1) { - gfxDebug() << *this << ": Ignoring drawing call for incompatible path."; - return; - } - const PathD2D* d2dPath = static_cast<const PathD2D*>(path); - - if (!PrepareForDrawing(aOptions.mCompositionOp, aPattern)) { - return; - } - - mDC->SetAntialiasMode(D2DAAMode(aOptions.mAntialiasMode)); - - RefPtr<ID2D1Brush> brush = CreateBrushForPattern(aPattern, aOptions); - - mDC->FillGeometry(d2dPath->mGeometry, brush); - - FinalizeDrawing(aOptions.mCompositionOp, aPattern); -} - -void DrawTargetD2D1::FillGlyphs(ScaledFont* aFont, const GlyphBuffer& aBuffer, - const Pattern& aPattern, - const DrawOptions& aOptions) { - if (aFont->GetType() != FontType::DWRITE) { - gfxDebug() << *this << ": Ignoring drawing call for incompatible font."; - return; - } - - ScaledFontDWrite* font = static_cast<ScaledFontDWrite*>(aFont); - - // May be null, if we failed to initialize the default rendering params. - RefPtr<IDWriteRenderingParams> params = - font->DWriteSettings().RenderingParams(); - - AntialiasMode aaMode = font->GetDefaultAAMode(); - - if (aOptions.mAntialiasMode != AntialiasMode::DEFAULT) { - aaMode = aOptions.mAntialiasMode; - } - - if (!PrepareForDrawing(aOptions.mCompositionOp, aPattern)) { - return; - } - - bool forceClearType = false; - if (!CurrentLayer().mIsOpaque && mPermitSubpixelAA && - aOptions.mCompositionOp == CompositionOp::OP_OVER && - aaMode == AntialiasMode::SUBPIXEL) { - forceClearType = true; - } - - D2D1_TEXT_ANTIALIAS_MODE d2dAAMode = D2D1_TEXT_ANTIALIAS_MODE_DEFAULT; - - switch (aaMode) { - case AntialiasMode::NONE: - d2dAAMode = D2D1_TEXT_ANTIALIAS_MODE_ALIASED; - break; - case AntialiasMode::GRAY: - d2dAAMode = D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE; - break; - case AntialiasMode::SUBPIXEL: - d2dAAMode = D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE; - break; - default: - d2dAAMode = D2D1_TEXT_ANTIALIAS_MODE_DEFAULT; - } - - if (d2dAAMode == D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE && - !CurrentLayer().mIsOpaque && !forceClearType) { - d2dAAMode = D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE; - } - - mDC->SetTextAntialiasMode(d2dAAMode); - - if (params != mTextRenderingParams) { - // According to - // https://docs.microsoft.com/en-us/windows/win32/api/d2d1/nf-d2d1-id2d1rendertarget-settextrenderingparams - // it's OK to pass null for params here; it will just "clear current text - // rendering options". - mDC->SetTextRenderingParams(params); - mTextRenderingParams = params; - } - - RefPtr<ID2D1Brush> brush = CreateBrushForPattern(aPattern, aOptions); - - AutoDWriteGlyphRun autoRun; - DWriteGlyphRunFromGlyphs(aBuffer, font, &autoRun); - - bool needsRepushedLayers = false; - if (forceClearType) { - D2D1_RECT_F rect; - bool isAligned; - needsRepushedLayers = CurrentLayer().mPushedClips.size() && - !GetDeviceSpaceClipRect(rect, isAligned); - - // If we have a complex clip in our stack and we have a transparent - // background, and subpixel AA is permitted, we need to repush our layer - // stack limited by the glyph run bounds initializing our layers for - // subpixel AA. - if (needsRepushedLayers) { - mDC->GetGlyphRunWorldBounds(D2D1::Point2F(), &autoRun, - DWRITE_MEASURING_MODE_NATURAL, &rect); - rect.left = std::floor(rect.left); - rect.right = std::ceil(rect.right); - rect.top = std::floor(rect.top); - rect.bottom = std::ceil(rect.bottom); - - PopAllClips(); - - if (!mTransform.IsRectilinear()) { - // We must limit the pixels we touch to the -user space- bounds of - // the glyphs being drawn. In order not to get transparent pixels - // copied up in our pushed layer stack. - D2D1_RECT_F userRect; - mDC->SetTransform(D2D1::IdentityMatrix()); - mDC->GetGlyphRunWorldBounds(D2D1::Point2F(), &autoRun, - DWRITE_MEASURING_MODE_NATURAL, &userRect); - - RefPtr<ID2D1PathGeometry> path; - factory()->CreatePathGeometry(getter_AddRefs(path)); - RefPtr<ID2D1GeometrySink> sink; - path->Open(getter_AddRefs(sink)); - AddRectToSink(sink, userRect); - sink->Close(); - - mDC->PushLayer( - D2D1::LayerParameters1( - D2D1::InfiniteRect(), path, D2D1_ANTIALIAS_MODE_ALIASED, - D2DMatrix(mTransform), 1.0f, nullptr, - D2D1_LAYER_OPTIONS1_INITIALIZE_FROM_BACKGROUND | - D2D1_LAYER_OPTIONS1_IGNORE_ALPHA), - nullptr); - } - - PushClipsToDC(mDC, true, rect); - mDC->SetTransform(D2DMatrix(mTransform)); - } - } - - if (brush) { - mDC->DrawGlyphRun(D2D1::Point2F(), &autoRun, brush); - } - - if (mTransform.HasNonTranslation()) { - mTransformedGlyphsSinceLastPurge += aBuffer.mNumGlyphs; - } - - if (needsRepushedLayers) { - PopClipsFromDC(mDC); - - if (!mTransform.IsRectilinear()) { - mDC->PopLayer(); - } - } - - FinalizeDrawing(aOptions.mCompositionOp, aPattern); -} - -void DrawTargetD2D1::Mask(const Pattern& aSource, const Pattern& aMask, - const DrawOptions& aOptions) { - if (!PrepareForDrawing(aOptions.mCompositionOp, aSource)) { - return; - } - - RefPtr<ID2D1Brush> source = CreateBrushForPattern(aSource, aOptions); - RefPtr<ID2D1Brush> mask = CreateBrushForPattern(aMask, DrawOptions()); - mDC->PushLayer(D2D1::LayerParameters(D2D1::InfiniteRect(), nullptr, - D2D1_ANTIALIAS_MODE_PER_PRIMITIVE, - D2D1::IdentityMatrix(), 1.0f, mask), - nullptr); - - Rect rect(0, 0, (Float)mSize.width, (Float)mSize.height); - Matrix mat = mTransform; - mat.Invert(); - - mDC->FillRectangle(D2DRect(mat.TransformBounds(rect)), source); - - mDC->PopLayer(); - - FinalizeDrawing(aOptions.mCompositionOp, aSource); -} - -void DrawTargetD2D1::PushClipGeometry(ID2D1Geometry* aGeometry, - const D2D1_MATRIX_3X2_F& aTransform, - bool aPixelAligned) { - mCurrentClippedGeometry = nullptr; - - PushedClip clip; - clip.mGeometry = aGeometry; - clip.mTransform = aTransform; - clip.mIsPixelAligned = aPixelAligned; - - aGeometry->GetBounds(aTransform, &clip.mBounds); - - CurrentLayer().mPushedClips.push_back(clip); - - // The transform of clips is relative to the world matrix, since we use the - // total transform for the clips, make the world matrix identity. - mDC->SetTransform(D2D1::IdentityMatrix()); - mTransformDirty = true; - - if (CurrentLayer().mClipsArePushed) { - PushD2DLayer(mDC, clip.mGeometry, clip.mTransform, clip.mIsPixelAligned); - } -} - -void DrawTargetD2D1::PushClip(const Path* aPath) { - const Path* path = aPath; - if (path->GetBackendType() != BackendType::DIRECT2D1_1) { - gfxDebug() << *this << ": Ignoring clipping call for incompatible path."; - return; - } - if (!EnsureInitialized()) { - return; - } - - RefPtr<PathD2D> pathD2D = static_cast<PathD2D*>(const_cast<Path*>(path)); - - PushClipGeometry(pathD2D->GetGeometry(), D2DMatrix(mTransform)); -} - -void DrawTargetD2D1::PushClipRect(const Rect& aRect) { - if (!EnsureInitialized()) { - return; - } - if (!mTransform.IsRectilinear()) { - // Whoops, this isn't a rectangle in device space, Direct2D will not deal - // with this transform the way we want it to. - // See remarks: - // http://msdn.microsoft.com/en-us/library/dd316860%28VS.85%29.aspx - RefPtr<ID2D1Geometry> geom = ConvertRectToGeometry(D2DRect(aRect)); - return PushClipGeometry(geom, D2DMatrix(mTransform)); - } - - mCurrentClippedGeometry = nullptr; - - PushedClip clip; - Rect rect = mTransform.TransformBounds(aRect); - IntRect intRect; - clip.mIsPixelAligned = rect.ToIntRect(&intRect); - - // Do not store the transform, just store the device space rectangle directly. - clip.mBounds = D2DRect(rect); - - CurrentLayer().mPushedClips.push_back(clip); - - mDC->SetTransform(D2D1::IdentityMatrix()); - mTransformDirty = true; - - if (CurrentLayer().mClipsArePushed) { - mDC->PushAxisAlignedClip( - clip.mBounds, clip.mIsPixelAligned ? D2D1_ANTIALIAS_MODE_ALIASED - : D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); - } -} - -void DrawTargetD2D1::PushDeviceSpaceClipRects(const IntRect* aRects, - uint32_t aCount) { - if (!EnsureInitialized()) { - return; - } - // Build a path for the union of the rects. - RefPtr<ID2D1PathGeometry> path; - factory()->CreatePathGeometry(getter_AddRefs(path)); - RefPtr<ID2D1GeometrySink> sink; - path->Open(getter_AddRefs(sink)); - sink->SetFillMode(D2D1_FILL_MODE_WINDING); - for (uint32_t i = 0; i < aCount; i++) { - const IntRect& rect = aRects[i]; - sink->BeginFigure(D2DPoint(rect.TopLeft()), D2D1_FIGURE_BEGIN_FILLED); - D2D1_POINT_2F lines[3] = {D2DPoint(rect.TopRight()), - D2DPoint(rect.BottomRight()), - D2DPoint(rect.BottomLeft())}; - sink->AddLines(lines, 3); - sink->EndFigure(D2D1_FIGURE_END_CLOSED); - } - sink->Close(); - - // The path is in device-space, so there is no transform needed, - // and all rects are pixel aligned. - PushClipGeometry(path, D2D1::IdentityMatrix(), true); -} - -void DrawTargetD2D1::PopClip() { - if (!EnsureInitialized()) { - return; - } - mCurrentClippedGeometry = nullptr; - if (CurrentLayer().mPushedClips.empty()) { - gfxDevCrash(LogReason::UnbalancedClipStack) - << "DrawTargetD2D1::PopClip: No clip to pop."; - return; - } - - if (CurrentLayer().mClipsArePushed) { - if (CurrentLayer().mPushedClips.back().mGeometry) { - mDC->PopLayer(); - } else { - mDC->PopAxisAlignedClip(); - } - } - CurrentLayer().mPushedClips.pop_back(); -} - -bool DrawTargetD2D1::RemoveAllClips() { - if (!EnsureInitialized()) { - return false; - } - mCurrentClippedGeometry = nullptr; - while (!CurrentLayer().mPushedClips.empty()) { - PopClip(); - } - return true; -} - -void DrawTargetD2D1::PushLayer(bool aOpaque, Float aOpacity, - SourceSurface* aMask, - const Matrix& aMaskTransform, - const IntRect& aBounds, bool aCopyBackground) { - if (!EnsureInitialized()) { - return; - } - D2D1_LAYER_OPTIONS1 options = D2D1_LAYER_OPTIONS1_NONE; - - if (aOpaque) { - options |= D2D1_LAYER_OPTIONS1_IGNORE_ALPHA; - } - if (aCopyBackground) { - options |= D2D1_LAYER_OPTIONS1_INITIALIZE_FROM_BACKGROUND; - } - - RefPtr<ID2D1ImageBrush> mask; - Matrix maskTransform = aMaskTransform; - RefPtr<ID2D1PathGeometry> clip; - - if (aMask) { - RefPtr<ID2D1Image> image = - GetImageForSurface(aMask, maskTransform, ExtendMode::CLAMP); - mDC->SetTransform(D2D1::IdentityMatrix()); - mTransformDirty = true; - - maskTransform = - maskTransform.PreTranslate(aMask->GetRect().X(), aMask->GetRect().Y()); - // The mask is given in user space. Our layer will apply it in device space. - maskTransform = maskTransform * mTransform; - - if (image) { - IntSize maskSize = aMask->GetSize(); - HRESULT hr = mDC->CreateImageBrush( - image, - D2D1::ImageBrushProperties( - D2D1::RectF(0, 0, maskSize.width, maskSize.height)), - D2D1::BrushProperties(1.0f, D2DMatrix(maskTransform)), - getter_AddRefs(mask)); - if (FAILED(hr)) { - gfxWarning() << "[D2D1.1] Failed to create a ImageBrush, code: " - << hexa(hr); - } - - factory()->CreatePathGeometry(getter_AddRefs(clip)); - RefPtr<ID2D1GeometrySink> sink; - clip->Open(getter_AddRefs(sink)); - AddRectToSink(sink, D2D1::RectF(0, 0, aMask->GetSize().width, - aMask->GetSize().height)); - sink->Close(); - } else { - gfxCriticalError() << "Failed to get image for mask surface!"; - } - } - - PushAllClips(); - - mDC->PushLayer(D2D1::LayerParameters1( - D2D1::InfiniteRect(), clip, D2D1_ANTIALIAS_MODE_ALIASED, - D2DMatrix(maskTransform), aOpacity, mask, options), - nullptr); - PushedLayer pushedLayer; - pushedLayer.mClipsArePushed = false; - pushedLayer.mIsOpaque = aOpaque; - pushedLayer.mOldPermitSubpixelAA = mPermitSubpixelAA; - mPermitSubpixelAA = aOpaque; - - mDC->CreateCommandList(getter_AddRefs(pushedLayer.mCurrentList)); - mPushedLayers.push_back(pushedLayer); - - mDC->SetTarget(CurrentTarget()); - - mUsedCommandListsSincePurge++; -} - -void DrawTargetD2D1::PopLayer() { - // We must have at least one layer at all times. - MOZ_ASSERT(mPushedLayers.size() > 1); - MOZ_ASSERT(CurrentLayer().mPushedClips.size() == 0); - if (!EnsureInitialized() || mPushedLayers.size() <= 1) { - return; - } - RefPtr<ID2D1CommandList> list = CurrentLayer().mCurrentList; - mPermitSubpixelAA = CurrentLayer().mOldPermitSubpixelAA; - - mPushedLayers.pop_back(); - mDC->SetTarget(CurrentTarget()); - - list->Close(); - mDC->SetTransform(D2D1::IdentityMatrix()); - mTransformDirty = true; - - DCCommandSink sink(mDC); - list->Stream(&sink); - - mComplexBlendsWithListInList = 0; - - mDC->PopLayer(); -} - -already_AddRefed<SourceSurface> DrawTargetD2D1::CreateSourceSurfaceFromData( - unsigned char* aData, const IntSize& aSize, int32_t aStride, - SurfaceFormat aFormat) const { - RefPtr<ID2D1Bitmap1> bitmap; - - RefPtr<ID2D1DeviceContext> dc = Factory::GetD2DDeviceContext(); - if (!dc) { - return nullptr; - } - - HRESULT hr = - dc->CreateBitmap(D2DIntSize(aSize), aData, aStride, - D2D1::BitmapProperties1(D2D1_BITMAP_OPTIONS_NONE, - D2DPixelFormat(aFormat)), - getter_AddRefs(bitmap)); - - if (FAILED(hr) || !bitmap) { - gfxCriticalError( - CriticalLog::DefaultOptions(Factory::ReasonableSurfaceSize(aSize))) - << "[D2D1.1] 1CreateBitmap failure " << aSize << " Code: " << hexa(hr) - << " format " << (int)aFormat; - return nullptr; - } - - return MakeAndAddRef<SourceSurfaceD2D1>(bitmap.get(), dc.get(), aFormat, - aSize); -} - -already_AddRefed<DrawTarget> DrawTargetD2D1::CreateSimilarDrawTarget( - const IntSize& aSize, SurfaceFormat aFormat) const { - RefPtr<DrawTargetD2D1> dt = new DrawTargetD2D1(); - - if (!dt->Init(aSize, aFormat)) { - return nullptr; - } - - return dt.forget(); -} - -bool DrawTargetD2D1::CanCreateSimilarDrawTarget(const IntSize& aSize, - SurfaceFormat aFormat) const { - RefPtr<ID2D1DeviceContext> dc = Factory::GetD2DDeviceContext(); - if (!dc) { - return false; - } - return (dc->GetMaximumBitmapSize() >= UINT32(aSize.width) && - dc->GetMaximumBitmapSize() >= UINT32(aSize.height)); -} - -RefPtr<DrawTarget> DrawTargetD2D1::CreateClippedDrawTarget( - const Rect& aBounds, SurfaceFormat aFormat) { - RefPtr<DrawTarget> result; - - if (!aBounds.IsEmpty()) { - PushClipRect(aBounds); - } - - D2D1_RECT_F clipRect; - bool isAligned; - GetDeviceSpaceClipRect(clipRect, isAligned); - IntRect rect = RoundedOut(ToRect(clipRect)); - - RefPtr<DrawTarget> dt = CreateSimilarDrawTarget(rect.Size(), aFormat); - if (dt) { - result = gfx::Factory::CreateOffsetDrawTarget(dt, rect.TopLeft()); - if (result) { - result->SetTransform(mTransform); - } - } - if (!aBounds.IsEmpty()) { - PopClip(); - } - - return result; -} - -already_AddRefed<GradientStops> DrawTargetD2D1::CreateGradientStops( - GradientStop* rawStops, uint32_t aNumStops, ExtendMode aExtendMode) const { - if (aNumStops == 0) { - gfxWarning() << *this - << ": Failed to create GradientStopCollection with no stops."; - return nullptr; - } - - D2D1_GRADIENT_STOP* stops = new D2D1_GRADIENT_STOP[aNumStops]; - - for (uint32_t i = 0; i < aNumStops; i++) { - stops[i].position = rawStops[i].offset; - stops[i].color = D2DColor(rawStops[i].color); - } - - RefPtr<ID2D1GradientStopCollection1> stopCollection; - - RefPtr<ID2D1DeviceContext> dc = Factory::GetD2DDeviceContext(); - - if (!dc) { - return nullptr; - } - - HRESULT hr = dc->CreateGradientStopCollection( - stops, aNumStops, D2D1_COLOR_SPACE_SRGB, D2D1_COLOR_SPACE_SRGB, - D2D1_BUFFER_PRECISION_8BPC_UNORM, D2DExtend(aExtendMode, Axis::BOTH), - D2D1_COLOR_INTERPOLATION_MODE_PREMULTIPLIED, - getter_AddRefs(stopCollection)); - delete[] stops; - - if (FAILED(hr)) { - gfxWarning() << *this << ": Failed to create GradientStopCollection. Code: " - << hexa(hr); - return nullptr; - } - - RefPtr<ID3D11Device> device = Factory::GetDirect3D11Device(); - return MakeAndAddRef<GradientStopsD2D>(stopCollection, device); -} - -already_AddRefed<FilterNode> DrawTargetD2D1::CreateFilter(FilterType aType) { - if (!EnsureInitialized()) { - return nullptr; - } - return FilterNodeD2D1::Create(mDC, aType); -} - -bool DrawTargetD2D1::Init(ID3D11Texture2D* aTexture, SurfaceFormat aFormat) { - RefPtr<ID2D1Device> device = Factory::GetD2D1Device(&mDeviceSeq); - if (!device) { - gfxCriticalNote << "[D2D1.1] Failed to obtain a device for " - "DrawTargetD2D1::Init(ID3D11Texture2D*, SurfaceFormat)."; - return false; - } - - aTexture->QueryInterface(__uuidof(IDXGISurface), - (void**)((IDXGISurface**)getter_AddRefs(mSurface))); - if (!mSurface) { - gfxCriticalError() << "[D2D1.1] Failed to obtain a DXGI surface."; - return false; - } - - mFormat = aFormat; - - D3D11_TEXTURE2D_DESC desc; - aTexture->GetDesc(&desc); - mSize.width = desc.Width; - mSize.height = desc.Height; - - return true; -} - -bool DrawTargetD2D1::Init(const IntSize& aSize, SurfaceFormat aFormat) { - RefPtr<ID2D1Device> device = Factory::GetD2D1Device(&mDeviceSeq); - if (!device) { - gfxCriticalNote << "[D2D1.1] Failed to obtain a device for " - "DrawTargetD2D1::Init(IntSize, SurfaceFormat)."; - return false; - } - - if (!CanCreateSimilarDrawTarget(aSize, aFormat)) { - // Size unsupported. - return false; - } - - mFormat = aFormat; - mSize = aSize; - - return true; -} - -/** - * Private helpers. - */ -uint32_t DrawTargetD2D1::GetByteSize() const { - return mSize.width * mSize.height * BytesPerPixel(mFormat); -} - -RefPtr<ID2D1Factory1> DrawTargetD2D1::factory() { - StaticMutexAutoLock lock(Factory::mDeviceLock); - - if (mFactory || !NS_IsMainThread()) { - return mFactory; - } - - // We don't allow initializing the factory off the main thread. - MOZ_RELEASE_ASSERT(NS_IsMainThread()); - - RefPtr<ID2D1Factory> factory; - D2D1CreateFactoryFunc createD2DFactory; - HMODULE d2dModule = LoadLibraryW(L"d2d1.dll"); - createD2DFactory = - (D2D1CreateFactoryFunc)GetProcAddress(d2dModule, "D2D1CreateFactory"); - - if (!createD2DFactory) { - gfxWarning() << "Failed to locate D2D1CreateFactory function."; - return nullptr; - } - - D2D1_FACTORY_OPTIONS options; -#ifdef _DEBUG - options.debugLevel = D2D1_DEBUG_LEVEL_WARNING; -#else - options.debugLevel = D2D1_DEBUG_LEVEL_NONE; -#endif - // options.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION; - - HRESULT hr = - createD2DFactory(D2D1_FACTORY_TYPE_MULTI_THREADED, __uuidof(ID2D1Factory), - &options, getter_AddRefs(factory)); - - if (FAILED(hr) || !factory) { - gfxCriticalNote << "Failed to create a D2D1 content device: " << hexa(hr); - return nullptr; - } - - RefPtr<ID2D1Factory1> factory1; - hr = factory->QueryInterface(__uuidof(ID2D1Factory1), - getter_AddRefs(factory1)); - if (FAILED(hr) || !factory1) { - return nullptr; - } - - mFactory = factory1; - - ExtendInputEffectD2D1::Register(mFactory); - ConicGradientEffectD2D1::Register(mFactory); - RadialGradientEffectD2D1::Register(mFactory); - - return mFactory; -} - -void DrawTargetD2D1::CleanupD2D() { - MOZ_RELEASE_ASSERT(NS_IsMainThread()); - Factory::mDeviceLock.AssertCurrentThreadOwns(); - - if (mFactory) { - RadialGradientEffectD2D1::Unregister(mFactory); - ConicGradientEffectD2D1::Unregister(mFactory); - ExtendInputEffectD2D1::Unregister(mFactory); - mFactory = nullptr; - } -} - -void DrawTargetD2D1::FlushInternal(bool aHasDependencyMutex /* = false */) { - if (IsDeviceContextValid()) { - if ((mUsedCommandListsSincePurge >= kPushedLayersBeforePurge || - mTransformedGlyphsSinceLastPurge >= kTransformedGlyphsBeforePurge) && - mPushedLayers.size() == 1) { - // It's important to pop all clips as otherwise layers can forget about - // their clip when doing an EndDraw. When we have layers pushed we cannot - // easily pop all underlying clips to delay the purge until we have no - // layers pushed. - PopAllClips(); - mUsedCommandListsSincePurge = 0; - mTransformedGlyphsSinceLastPurge = 0; - mDC->EndDraw(); - mDC->BeginDraw(); - } else { - mDC->Flush(); - } - } - - Maybe<StaticMutexAutoLock> lock; - - if (!aHasDependencyMutex) { - lock.emplace(Factory::mDTDependencyLock); - } - - Factory::mDTDependencyLock.AssertCurrentThreadOwns(); - // We no longer depend on any target. - for (TargetSet::iterator iter = mDependingOnTargets.begin(); - iter != mDependingOnTargets.end(); iter++) { - (*iter)->mDependentTargets.erase(this); - } - mDependingOnTargets.clear(); -} - -bool DrawTargetD2D1::EnsureInitialized() { - if (mInitState != InitState::Uninitialized) { - return mInitState == InitState::Success; - } - - // Don't retry. - mInitState = InitState::Failure; - - HRESULT hr; - - RefPtr<ID2D1Device> device = Factory::GetD2D1Device(&mDeviceSeq); - if (!device) { - gfxCriticalNote << "[D2D1.1] Failed to obtain a device for " - "DrawTargetD2D1::EnsureInitialized()."; - return false; - } - - hr = device->CreateDeviceContext( - D2D1_DEVICE_CONTEXT_OPTIONS_ENABLE_MULTITHREADED_OPTIMIZATIONS, - getter_AddRefs(mDC)); - - if (FAILED(hr)) { - gfxCriticalError() << "[D2D1.1] 2Failed to create a DeviceContext, code: " - << hexa(hr) << " format " << (int)mFormat; - return false; - } - - if (!mSurface) { - if (mDC->GetMaximumBitmapSize() < UINT32(mSize.width) || - mDC->GetMaximumBitmapSize() < UINT32(mSize.height)) { - // This is 'ok', so don't assert - gfxCriticalNote << "[D2D1.1] Attempt to use unsupported surface size " - << mSize; - return false; - } - - D2D1_BITMAP_PROPERTIES1 props; - props.dpiX = 96; - props.dpiY = 96; - props.pixelFormat = D2DPixelFormat(mFormat); - props.colorContext = nullptr; - props.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET; - hr = mDC->CreateBitmap(D2DIntSize(mSize), nullptr, 0, props, - (ID2D1Bitmap1**)getter_AddRefs(mBitmap)); - - if (FAILED(hr)) { - gfxCriticalError() << "[D2D1.1] 3CreateBitmap failure " << mSize - << " Code: " << hexa(hr) << " format " << (int)mFormat; - return false; - } - } else { - D2D1_BITMAP_PROPERTIES1 props; - props.dpiX = 96; - props.dpiY = 96; - props.pixelFormat = D2DPixelFormat(mFormat); - props.colorContext = nullptr; - props.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET; - hr = mDC->CreateBitmapFromDxgiSurface( - mSurface, props, (ID2D1Bitmap1**)getter_AddRefs(mBitmap)); - - if (FAILED(hr)) { - gfxCriticalError() - << "[D2D1.1] CreateBitmapFromDxgiSurface failure Code: " << hexa(hr) - << " format " << (int)mFormat; - return false; - } - } - - mDC->SetTarget(CurrentTarget()); - - hr = mDC->CreateSolidColorBrush(D2D1::ColorF(0, 0), - getter_AddRefs(mSolidColorBrush)); - - if (FAILED(hr)) { - gfxCriticalError() << "[D2D1.1] Failure creating solid color brush (I2)."; - return false; - } - - mDC->BeginDraw(); - - CurrentLayer().mIsOpaque = mFormat == SurfaceFormat::B8G8R8X8; - - if (!mSurface) { - mDC->Clear(); - } - - mInitState = InitState::Success; - - return true; -} - -void DrawTargetD2D1::MarkChanged() { - if (mSnapshot) { - MutexAutoLock lock(*mSnapshotLock); - if (mSnapshot->hasOneRef()) { - // Just destroy it, since no-one else knows about it. - mSnapshot = nullptr; - } else { - mSnapshot->DrawTargetWillChange(); - // The snapshot will no longer depend on this target. - MOZ_ASSERT(!mSnapshot); - } - } - - { - StaticMutexAutoLock lock(Factory::mDTDependencyLock); - if (mDependentTargets.size()) { - // Copy mDependentTargets since the Flush()es below will modify it. - TargetSet tmpTargets = mDependentTargets; - for (TargetSet::iterator iter = tmpTargets.begin(); - iter != tmpTargets.end(); iter++) { - (*iter)->FlushInternal(true); - } - // The Flush() should have broken all dependencies on this target. - MOZ_ASSERT(!mDependentTargets.size()); - } - } -} - -bool DrawTargetD2D1::ShouldClipTemporarySurfaceDrawing(CompositionOp aOp, - const Pattern& aPattern, - bool aClipIsComplex) { - bool patternSupported = IsPatternSupportedByD2D(aPattern, aOp); - return patternSupported && !CurrentLayer().mIsOpaque && - D2DSupportsCompositeMode(aOp) && IsOperatorBoundByMask(aOp) && - aClipIsComplex; -} - -bool DrawTargetD2D1::PrepareForDrawing(CompositionOp aOp, - const Pattern& aPattern) { - if (!EnsureInitialized()) { - return false; - } - - MarkChanged(); - - PushAllClips(); - - bool patternSupported = IsPatternSupportedByD2D(aPattern, aOp); - if (D2DSupportsPrimitiveBlendMode(aOp) && patternSupported) { - // It's important to do this before FlushTransformToDC! As this will cause - // the transform to become dirty. - - FlushTransformToDC(); - - if (aOp != CompositionOp::OP_OVER) { - mDC->SetPrimitiveBlend(D2DPrimitiveBlendMode(aOp)); - } - - return true; - } - - HRESULT result = mDC->CreateCommandList(getter_AddRefs(mCommandList)); - mDC->SetTarget(mCommandList); - mUsedCommandListsSincePurge++; - - // This is where we should have a valid command list. If we don't, something - // is wrong, and it's likely an OOM. - if (!mCommandList) { - gfxDevCrash(LogReason::InvalidCommandList) - << "Invalid D2D1.1 command list on creation " - << mUsedCommandListsSincePurge << ", " << gfx::hexa(result); - } - - D2D1_RECT_F rect; - bool isAligned; - bool clipIsComplex = CurrentLayer().mPushedClips.size() && - !GetDeviceSpaceClipRect(rect, isAligned); - - if (ShouldClipTemporarySurfaceDrawing(aOp, aPattern, clipIsComplex)) { - PushClipsToDC(mDC); - } - - FlushTransformToDC(); - - return true; -} - -void DrawTargetD2D1::FinalizeDrawing(CompositionOp aOp, - const Pattern& aPattern) { - bool patternSupported = IsPatternSupportedByD2D(aPattern, aOp); - - if (D2DSupportsPrimitiveBlendMode(aOp) && patternSupported) { - if (aOp != CompositionOp::OP_OVER) - mDC->SetPrimitiveBlend(D2D1_PRIMITIVE_BLEND_SOURCE_OVER); - return; - } - - D2D1_RECT_F rect; - bool isAligned; - bool clipIsComplex = CurrentLayer().mPushedClips.size() && - !GetDeviceSpaceClipRect(rect, isAligned); - - if (ShouldClipTemporarySurfaceDrawing(aOp, aPattern, clipIsComplex)) { - PopClipsFromDC(mDC); - } - - mDC->SetTarget(CurrentTarget()); - if (!mCommandList) { - gfxDevCrash(LogReason::InvalidCommandList) - << "Invalid D21.1 command list on finalize"; - return; - } - mCommandList->Close(); - - RefPtr<ID2D1CommandList> source = mCommandList; - mCommandList = nullptr; - - mDC->SetTransform(D2D1::IdentityMatrix()); - mTransformDirty = true; - - if (patternSupported) { - if (D2DSupportsCompositeMode(aOp)) { - RefPtr<ID2D1Image> tmpImage; - if (clipIsComplex) { - PopAllClips(); - if (!IsOperatorBoundByMask(aOp)) { - tmpImage = GetImageForLayerContent(); - } - } - mDC->DrawImage(source, D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR, - D2DCompositionMode(aOp)); - - if (tmpImage) { - RefPtr<ID2D1ImageBrush> brush; - RefPtr<ID2D1Geometry> inverseGeom = GetInverseClippedGeometry(); - mDC->CreateImageBrush(tmpImage, - D2D1::ImageBrushProperties( - D2D1::RectF(0, 0, mSize.width, mSize.height)), - getter_AddRefs(brush)); - - mDC->SetPrimitiveBlend(D2D1_PRIMITIVE_BLEND_COPY); - mDC->FillGeometry(inverseGeom, brush); - mDC->SetPrimitiveBlend(D2D1_PRIMITIVE_BLEND_SOURCE_OVER); - } - return; - } - - RefPtr<ID2D1Effect> blendEffect; - HRESULT hr = - mDC->CreateEffect(CLSID_D2D1Blend, getter_AddRefs(blendEffect)); - - if (FAILED(hr) || !blendEffect) { - gfxWarning() << "Failed to create blend effect!"; - return; - } - - IntRect bounds(IntPoint(), mSize); - RefPtr<ID2D1Geometry> geom; - if (CurrentLayer().mPushedClips.size() > 0) { - geom = GetClippedGeometry(&bounds); - } - RefPtr<ID2D1Image> tmpImage = GetImageForLayerContent(&bounds, bool(geom)); - if (!tmpImage) { - return; - } - - blendEffect->SetInput(0, tmpImage); - blendEffect->SetInput(1, source); - blendEffect->SetValue(D2D1_BLEND_PROP_MODE, D2DBlendMode(aOp)); - - if (geom) { - RefPtr<ID2D1Image> blendOutput; - blendEffect->GetOutput(getter_AddRefs(blendOutput)); - - RefPtr<ID2D1ImageBrush> brush; - mDC->CreateImageBrush( - blendOutput, D2D1::ImageBrushProperties(D2DRect(bounds)), - D2D1::BrushProperties( - 1.0f, D2D1::Matrix3x2F::Translation(bounds.x, bounds.y)), - getter_AddRefs(brush)); - - mDC->SetPrimitiveBlend(D2D1_PRIMITIVE_BLEND_COPY); - mDC->FillGeometry(geom, brush); - mDC->SetPrimitiveBlend(D2D1_PRIMITIVE_BLEND_SOURCE_OVER); - } else { - mDC->DrawImage(blendEffect, D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR, - D2D1_COMPOSITE_MODE_BOUNDED_SOURCE_COPY); - } - - mComplexBlendsWithListInList++; - return; - } - - if (aPattern.GetType() == PatternType::CONIC_GRADIENT) { - const ConicGradientPattern* pat = - static_cast<const ConicGradientPattern*>(&aPattern); - - if (!pat->mStops || - pat->mStops->GetBackendType() != BackendType::DIRECT2D) { - // Draw nothing because of no color stops - return; - } - RefPtr<ID2D1Effect> conicGradientEffect; - - HRESULT hr = mDC->CreateEffect(CLSID_ConicGradientEffect, - getter_AddRefs(conicGradientEffect)); - if (FAILED(hr) || !conicGradientEffect) { - gfxWarning() << "Failed to create conic gradient effect. Code: " - << hexa(hr); - return; - } - - PushAllClips(); - - conicGradientEffect->SetValue( - CONIC_PROP_STOP_COLLECTION, - static_cast<const GradientStopsD2D*>(pat->mStops.get()) - ->mStopCollection); - conicGradientEffect->SetValue( - CONIC_PROP_CENTER, D2D1::Vector2F(pat->mCenter.x, pat->mCenter.y)); - conicGradientEffect->SetValue(CONIC_PROP_ANGLE, pat->mAngle); - conicGradientEffect->SetValue(CONIC_PROP_START_OFFSET, pat->mStartOffset); - conicGradientEffect->SetValue(CONIC_PROP_END_OFFSET, pat->mEndOffset); - conicGradientEffect->SetValue(CONIC_PROP_TRANSFORM, - D2DMatrix(pat->mMatrix * mTransform)); - conicGradientEffect->SetInput(0, source); - - mDC->DrawImage(conicGradientEffect, - D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR, - D2DCompositionMode(aOp)); - return; - } - - MOZ_ASSERT(aPattern.GetType() == PatternType::RADIAL_GRADIENT); - - const RadialGradientPattern* pat = - static_cast<const RadialGradientPattern*>(&aPattern); - if (pat->mCenter1 == pat->mCenter2 && pat->mRadius1 == pat->mRadius2) { - // Draw nothing! - return; - } - - if (!pat->mStops || pat->mStops->GetBackendType() != BackendType::DIRECT2D) { - // Draw nothing because of no color stops - return; - } - - RefPtr<ID2D1Effect> radialGradientEffect; - - HRESULT hr = mDC->CreateEffect(CLSID_RadialGradientEffect, - getter_AddRefs(radialGradientEffect)); - if (FAILED(hr) || !radialGradientEffect) { - gfxWarning() << "Failed to create radial gradient effect. Code: " - << hexa(hr); - return; - } - - PushAllClips(); - - radialGradientEffect->SetValue( - RADIAL_PROP_STOP_COLLECTION, - static_cast<const GradientStopsD2D*>(pat->mStops.get())->mStopCollection); - radialGradientEffect->SetValue( - RADIAL_PROP_CENTER_1, D2D1::Vector2F(pat->mCenter1.x, pat->mCenter1.y)); - radialGradientEffect->SetValue( - RADIAL_PROP_CENTER_2, D2D1::Vector2F(pat->mCenter2.x, pat->mCenter2.y)); - radialGradientEffect->SetValue(RADIAL_PROP_RADIUS_1, pat->mRadius1); - radialGradientEffect->SetValue(RADIAL_PROP_RADIUS_2, pat->mRadius2); - radialGradientEffect->SetValue(RADIAL_PROP_RADIUS_2, pat->mRadius2); - radialGradientEffect->SetValue(RADIAL_PROP_TRANSFORM, - D2DMatrix(pat->mMatrix * mTransform)); - radialGradientEffect->SetInput(0, source); - - mDC->DrawImage(radialGradientEffect, D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR, - D2DCompositionMode(aOp)); -} - -void DrawTargetD2D1::AddDependencyOnSource(SourceSurfaceD2D1* aSource) { - Maybe<MutexAutoLock> snapshotLock; - // We grab the SnapshotLock as well, this guaranteeds aSource->mDrawTarget - // cannot be cleared in between the if statement and the dereference. - if (aSource->mSnapshotLock) { - snapshotLock.emplace(*aSource->mSnapshotLock); - } - { - StaticMutexAutoLock lock(Factory::mDTDependencyLock); - if (aSource->mDrawTarget && - !mDependingOnTargets.count(aSource->mDrawTarget)) { - aSource->mDrawTarget->mDependentTargets.insert(this); - mDependingOnTargets.insert(aSource->mDrawTarget); - } - } -} - -static D2D1_RECT_F IntersectRect(const D2D1_RECT_F& aRect1, - const D2D1_RECT_F& aRect2) { - D2D1_RECT_F result; - result.left = std::max(aRect1.left, aRect2.left); - result.top = std::max(aRect1.top, aRect2.top); - result.right = std::min(aRect1.right, aRect2.right); - result.bottom = std::min(aRect1.bottom, aRect2.bottom); - - result.right = std::max(result.right, result.left); - result.bottom = std::max(result.bottom, result.top); - - return result; -} - -bool DrawTargetD2D1::GetDeviceSpaceClipRect(D2D1_RECT_F& aClipRect, - bool& aIsPixelAligned) { - aIsPixelAligned = true; - aClipRect = D2D1::RectF(0, 0, mSize.width, mSize.height); - - if (!CurrentLayer().mPushedClips.size()) { - return false; - } - - for (auto iter = CurrentLayer().mPushedClips.begin(); - iter != CurrentLayer().mPushedClips.end(); iter++) { - if (iter->mGeometry) { - return false; - } - aClipRect = IntersectRect(aClipRect, iter->mBounds); - if (!iter->mIsPixelAligned) { - aIsPixelAligned = false; - } - } - return true; -} - -static const uint32_t sComplexBlendsWithListAllowedInList = 4; - -already_AddRefed<ID2D1Image> DrawTargetD2D1::GetImageForLayerContent( - const IntRect* aBounds, bool aShouldPreserveContent) { - PopAllClips(); - - IntRect bounds = aBounds ? *aBounds : IntRect(IntPoint(), mSize); - IntSize size(bounds.XMost(), bounds.YMost()); - if (!CurrentLayer().mCurrentList) { - RefPtr<ID2D1Bitmap> tmpBitmap; - HRESULT hr = mDC->CreateBitmap( - D2DIntSize(size), D2D1::BitmapProperties(D2DPixelFormat(mFormat)), - getter_AddRefs(tmpBitmap)); - if (FAILED(hr)) { - gfxCriticalError( - CriticalLog::DefaultOptions(Factory::ReasonableSurfaceSize(size))) - << "[D2D1.1] 6CreateBitmap failure " << size << " Code: " << hexa(hr) - << " format " << (int)mFormat; - // If it's a recreate target error, return and handle it elsewhere. - if (hr == D2DERR_RECREATE_TARGET) { - mDC->Flush(); - return nullptr; - } - // For now, crash in other scenarios; this should happen because tmpBitmap - // is null and CopyFromBitmap call below dereferences it. - } - mDC->Flush(); - - D2D1_POINT_2U destOffset = D2D1::Point2U(bounds.x, bounds.y); - D2D1_RECT_U srcRect = - D2D1::RectU(bounds.x, bounds.y, bounds.width, bounds.height); - tmpBitmap->CopyFromBitmap(&destOffset, mBitmap, &srcRect); - return tmpBitmap.forget(); - } else { - RefPtr<ID2D1CommandList> list = CurrentLayer().mCurrentList; - mDC->CreateCommandList(getter_AddRefs(CurrentLayer().mCurrentList)); - mDC->SetTarget(CurrentTarget()); - list->Close(); - - RefPtr<ID2D1Bitmap1> tmpBitmap; - if (mComplexBlendsWithListInList >= sComplexBlendsWithListAllowedInList) { - D2D1_BITMAP_PROPERTIES1 props = D2D1::BitmapProperties1( - D2D1_BITMAP_OPTIONS_TARGET, - D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, - D2D1_ALPHA_MODE_PREMULTIPLIED)); - mDC->CreateBitmap(D2DIntSize(size), nullptr, 0, &props, - getter_AddRefs(tmpBitmap)); - mDC->SetTransform(D2D1::IdentityMatrix()); - mTransformDirty = true; - mDC->SetTarget(tmpBitmap); - mDC->DrawImage(list, D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR, - D2D1_COMPOSITE_MODE_BOUNDED_SOURCE_COPY); - mDC->SetTarget(CurrentTarget()); - mComplexBlendsWithListInList = 0; - } - - DCCommandSink sink(mDC); - - if (aShouldPreserveContent) { - list->Stream(&sink); - } - - if (tmpBitmap) { - return tmpBitmap.forget(); - } - - return list.forget(); - } -} - -already_AddRefed<ID2D1Geometry> DrawTargetD2D1::GetClippedGeometry( - IntRect* aClipBounds) { - if (mCurrentClippedGeometry) { - *aClipBounds = mCurrentClipBounds; - RefPtr<ID2D1Geometry> clippedGeometry(mCurrentClippedGeometry); - return clippedGeometry.forget(); - } - - MOZ_ASSERT(CurrentLayer().mPushedClips.size()); - - mCurrentClipBounds = IntRect(IntPoint(0, 0), mSize); - - // if pathGeom is null then pathRect represents the path. - RefPtr<ID2D1Geometry> pathGeom; - D2D1_RECT_F pathRect; - bool pathRectIsAxisAligned = false; - auto iter = CurrentLayer().mPushedClips.begin(); - - if (iter->mGeometry) { - pathGeom = GetTransformedGeometry(iter->mGeometry, iter->mTransform); - } else { - pathRect = iter->mBounds; - pathRectIsAxisAligned = iter->mIsPixelAligned; - } - - iter++; - for (; iter != CurrentLayer().mPushedClips.end(); iter++) { - // Do nothing but add it to the current clip bounds. - if (!iter->mGeometry && iter->mIsPixelAligned) { - mCurrentClipBounds.IntersectRect( - mCurrentClipBounds, - IntRect(int32_t(iter->mBounds.left), int32_t(iter->mBounds.top), - int32_t(iter->mBounds.right - iter->mBounds.left), - int32_t(iter->mBounds.bottom - iter->mBounds.top))); - continue; - } - - if (!pathGeom) { - if (pathRectIsAxisAligned) { - mCurrentClipBounds.IntersectRect( - mCurrentClipBounds, - IntRect(int32_t(pathRect.left), int32_t(pathRect.top), - int32_t(pathRect.right - pathRect.left), - int32_t(pathRect.bottom - pathRect.top))); - } - if (iter->mGeometry) { - // See if pathRect needs to go into the path geometry. - if (!pathRectIsAxisAligned) { - pathGeom = ConvertRectToGeometry(pathRect); - } else { - pathGeom = GetTransformedGeometry(iter->mGeometry, iter->mTransform); - } - } else { - pathRect = IntersectRect(pathRect, iter->mBounds); - pathRectIsAxisAligned = false; - continue; - } - } - - RefPtr<ID2D1PathGeometry> newGeom; - factory()->CreatePathGeometry(getter_AddRefs(newGeom)); - - RefPtr<ID2D1GeometrySink> currentSink; - newGeom->Open(getter_AddRefs(currentSink)); - - if (iter->mGeometry) { - pathGeom->CombineWithGeometry(iter->mGeometry, - D2D1_COMBINE_MODE_INTERSECT, - iter->mTransform, currentSink); - } else { - RefPtr<ID2D1Geometry> rectGeom = ConvertRectToGeometry(iter->mBounds); - pathGeom->CombineWithGeometry(rectGeom, D2D1_COMBINE_MODE_INTERSECT, - D2D1::IdentityMatrix(), currentSink); - } - - currentSink->Close(); - - pathGeom = newGeom.forget(); - } - - // For now we need mCurrentClippedGeometry to always be non-nullptr. This - // method might seem a little strange but it is just fine, if pathGeom is - // nullptr pathRect will always still contain 1 clip unaccounted for - // regardless of mCurrentClipBounds. - if (!pathGeom) { - pathGeom = ConvertRectToGeometry(pathRect); - } - mCurrentClippedGeometry = pathGeom.forget(); - *aClipBounds = mCurrentClipBounds; - RefPtr<ID2D1Geometry> clippedGeometry(mCurrentClippedGeometry); - return clippedGeometry.forget(); -} - -already_AddRefed<ID2D1Geometry> DrawTargetD2D1::GetInverseClippedGeometry() { - IntRect bounds; - RefPtr<ID2D1Geometry> geom = GetClippedGeometry(&bounds); - RefPtr<ID2D1RectangleGeometry> rectGeom; - RefPtr<ID2D1PathGeometry> inverseGeom; - - factory()->CreateRectangleGeometry( - D2D1::RectF(0, 0, mSize.width, mSize.height), getter_AddRefs(rectGeom)); - factory()->CreatePathGeometry(getter_AddRefs(inverseGeom)); - RefPtr<ID2D1GeometrySink> sink; - inverseGeom->Open(getter_AddRefs(sink)); - rectGeom->CombineWithGeometry(geom, D2D1_COMBINE_MODE_EXCLUDE, - D2D1::IdentityMatrix(), sink); - sink->Close(); - - return inverseGeom.forget(); -} - -void DrawTargetD2D1::PopAllClips() { - if (CurrentLayer().mClipsArePushed) { - PopClipsFromDC(mDC); - - CurrentLayer().mClipsArePushed = false; - } -} - -void DrawTargetD2D1::PushAllClips() { - if (!CurrentLayer().mClipsArePushed) { - PushClipsToDC(mDC); - - CurrentLayer().mClipsArePushed = true; - } -} - -void DrawTargetD2D1::PushClipsToDC(ID2D1DeviceContext* aDC, - bool aForceIgnoreAlpha, - const D2D1_RECT_F& aMaxRect) { - mDC->SetTransform(D2D1::IdentityMatrix()); - mTransformDirty = true; - - for (auto iter = CurrentLayer().mPushedClips.begin(); - iter != CurrentLayer().mPushedClips.end(); iter++) { - if (iter->mGeometry) { - PushD2DLayer(aDC, iter->mGeometry, iter->mTransform, - iter->mIsPixelAligned, aForceIgnoreAlpha, aMaxRect); - } else { - mDC->PushAxisAlignedClip(iter->mBounds, - iter->mIsPixelAligned - ? D2D1_ANTIALIAS_MODE_ALIASED - : D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); - } - } -} - -void DrawTargetD2D1::PopClipsFromDC(ID2D1DeviceContext* aDC) { - for (int i = CurrentLayer().mPushedClips.size() - 1; i >= 0; i--) { - if (CurrentLayer().mPushedClips[i].mGeometry) { - aDC->PopLayer(); - } else { - aDC->PopAxisAlignedClip(); - } - } -} - -already_AddRefed<ID2D1Brush> DrawTargetD2D1::CreateTransparentBlackBrush() { - return GetSolidColorBrush(D2D1::ColorF(0, 0)); -} - -already_AddRefed<ID2D1SolidColorBrush> DrawTargetD2D1::GetSolidColorBrush( - const D2D_COLOR_F& aColor) { - RefPtr<ID2D1SolidColorBrush> brush = mSolidColorBrush; - brush->SetColor(aColor); - return brush.forget(); -} - -already_AddRefed<ID2D1Brush> DrawTargetD2D1::CreateBrushForPattern( - const Pattern& aPattern, const DrawOptions& aOptions) { - if (!IsPatternSupportedByD2D(aPattern) || - aOptions.mCompositionOp == CompositionOp::OP_CLEAR) { - return GetSolidColorBrush(D2D1::ColorF(1.0f, 1.0f, 1.0f, 1.0f)); - } - - if (aPattern.GetType() == PatternType::COLOR) { - DeviceColor color = static_cast<const ColorPattern*>(&aPattern)->mColor; - return GetSolidColorBrush( - D2D1::ColorF(color.r, color.g, color.b, color.a * aOptions.mAlpha)); - } - if (aPattern.GetType() == PatternType::LINEAR_GRADIENT) { - RefPtr<ID2D1LinearGradientBrush> gradBrush; - const LinearGradientPattern* pat = - static_cast<const LinearGradientPattern*>(&aPattern); - - if (!pat->mStops || - pat->mStops->GetBackendType() != BackendType::DIRECT2D) { - gfxDebug() << "No stops specified for gradient pattern."; - return CreateTransparentBlackBrush(); - } - - if (pat->mBegin == pat->mEnd) { - return CreateTransparentBlackBrush(); - } - - GradientStopsD2D* stops = static_cast<GradientStopsD2D*>(pat->mStops.get()); - - mDC->CreateLinearGradientBrush( - D2D1::LinearGradientBrushProperties(D2DPoint(pat->mBegin), - D2DPoint(pat->mEnd)), - D2D1::BrushProperties(aOptions.mAlpha, D2DMatrix(pat->mMatrix)), - stops->mStopCollection, getter_AddRefs(gradBrush)); - - if (!gradBrush) { - gfxWarning() << "Couldn't create gradient brush."; - return CreateTransparentBlackBrush(); - } - - return gradBrush.forget(); - } - if (aPattern.GetType() == PatternType::RADIAL_GRADIENT) { - RefPtr<ID2D1RadialGradientBrush> gradBrush; - const RadialGradientPattern* pat = - static_cast<const RadialGradientPattern*>(&aPattern); - - if (!pat->mStops || - pat->mStops->GetBackendType() != BackendType::DIRECT2D) { - gfxDebug() << "No stops specified for gradient pattern."; - return CreateTransparentBlackBrush(); - } - - if (pat->mCenter1 == pat->mCenter2 && pat->mRadius1 == pat->mRadius2) { - return CreateTransparentBlackBrush(); - } - - GradientStopsD2D* stops = static_cast<GradientStopsD2D*>(pat->mStops.get()); - - // This will not be a complex radial gradient brush. - mDC->CreateRadialGradientBrush( - D2D1::RadialGradientBrushProperties( - D2DPoint(pat->mCenter2), D2DPoint(pat->mCenter1 - pat->mCenter2), - pat->mRadius2, pat->mRadius2), - D2D1::BrushProperties(aOptions.mAlpha, D2DMatrix(pat->mMatrix)), - stops->mStopCollection, getter_AddRefs(gradBrush)); - - if (!gradBrush) { - gfxWarning() << "Couldn't create gradient brush."; - return CreateTransparentBlackBrush(); - } - - return gradBrush.forget(); - } - if (aPattern.GetType() == PatternType::SURFACE) { - const SurfacePattern* pat = static_cast<const SurfacePattern*>(&aPattern); - - if (!pat->mSurface) { - gfxDebug() << "No source surface specified for surface pattern"; - return CreateTransparentBlackBrush(); - } - - D2D1_RECT_F samplingBounds; - Matrix mat = pat->mMatrix; - - MOZ_ASSERT(pat->mSurface->IsValid()); - - RefPtr<SourceSurface> surf = pat->mSurface; - - RefPtr<ID2D1Image> image = GetImageForSurface( - surf, mat, pat->mExtendMode, - !pat->mSamplingRect.IsEmpty() ? &pat->mSamplingRect : nullptr); - - if (!image) { - return CreateTransparentBlackBrush(); - } - - if (surf->GetFormat() == SurfaceFormat::A8) { - // See bug 1251431, at least FillOpacityMask does not appear to allow a - // source bitmapbrush with source format A8. This creates a BGRA surface - // with the same alpha values that the A8 surface has. - RefPtr<ID2D1Bitmap> bitmap; - HRESULT hr = image->QueryInterface((ID2D1Bitmap**)getter_AddRefs(bitmap)); - if (SUCCEEDED(hr) && bitmap) { - RefPtr<ID2D1Image> oldTarget; - RefPtr<ID2D1Bitmap1> tmpBitmap; - mDC->CreateBitmap(D2D1::SizeU(pat->mSurface->GetSize().width, - pat->mSurface->GetSize().height), - nullptr, 0, - D2D1::BitmapProperties1( - D2D1_BITMAP_OPTIONS_TARGET, - D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, - D2D1_ALPHA_MODE_PREMULTIPLIED)), - getter_AddRefs(tmpBitmap)); - - if (!tmpBitmap) { - return CreateTransparentBlackBrush(); - } - - mDC->GetTarget(getter_AddRefs(oldTarget)); - mDC->SetTarget(tmpBitmap); - - RefPtr<ID2D1SolidColorBrush> brush; - mDC->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::White), - getter_AddRefs(brush)); - mDC->FillOpacityMask(bitmap, brush); - mDC->SetTarget(oldTarget); - image = tmpBitmap; - } - } - - if (pat->mSamplingRect.IsEmpty()) { - RefPtr<ID2D1Bitmap> bitmap; - HRESULT hr = image->QueryInterface((ID2D1Bitmap**)getter_AddRefs(bitmap)); - if (SUCCEEDED(hr) && bitmap) { - /** - * Create the brush with the proper repeat modes. - */ - RefPtr<ID2D1BitmapBrush> bitmapBrush; - D2D1_EXTEND_MODE xRepeat = D2DExtend(pat->mExtendMode, Axis::X_AXIS); - D2D1_EXTEND_MODE yRepeat = D2DExtend(pat->mExtendMode, Axis::Y_AXIS); - - mDC->CreateBitmapBrush( - bitmap, - D2D1::BitmapBrushProperties(xRepeat, yRepeat, - D2DFilter(pat->mSamplingFilter)), - D2D1::BrushProperties(aOptions.mAlpha, D2DMatrix(mat)), - getter_AddRefs(bitmapBrush)); - if (!bitmapBrush) { - gfxWarning() << "Couldn't create bitmap brush!"; - return CreateTransparentBlackBrush(); - } - return bitmapBrush.forget(); - } - } - - RefPtr<ID2D1ImageBrush> imageBrush; - if (pat->mSamplingRect.IsEmpty()) { - samplingBounds = D2D1::RectF(0, 0, Float(pat->mSurface->GetSize().width), - Float(pat->mSurface->GetSize().height)); - } else if (surf->GetType() == SurfaceType::D2D1_1_IMAGE) { - samplingBounds = D2DRect(pat->mSamplingRect); - mat.PreTranslate(pat->mSamplingRect.X(), pat->mSamplingRect.Y()); - } else { - // We will do a partial upload of the sampling restricted area from - // GetImageForSurface. - samplingBounds = D2D1::RectF(0, 0, pat->mSamplingRect.Width(), - pat->mSamplingRect.Height()); - } - - D2D1_EXTEND_MODE xRepeat = D2DExtend(pat->mExtendMode, Axis::X_AXIS); - D2D1_EXTEND_MODE yRepeat = D2DExtend(pat->mExtendMode, Axis::Y_AXIS); - - mDC->CreateImageBrush( - image, - D2D1::ImageBrushProperties(samplingBounds, xRepeat, yRepeat, - D2DInterpolationMode(pat->mSamplingFilter)), - D2D1::BrushProperties(aOptions.mAlpha, D2DMatrix(mat)), - getter_AddRefs(imageBrush)); - - if (!imageBrush) { - gfxWarning() << "Couldn't create image brush!"; - return CreateTransparentBlackBrush(); - } - - return imageBrush.forget(); - } - - gfxWarning() << "Invalid pattern type detected."; - return CreateTransparentBlackBrush(); -} - -already_AddRefed<ID2D1Image> DrawTargetD2D1::GetImageForSurface( - SourceSurface* aSurface, Matrix& aSourceTransform, ExtendMode aExtendMode, - const IntRect* aSourceRect, bool aUserSpace) { - RefPtr<ID2D1Image> image; - RefPtr<SourceSurface> surface = aSurface->GetUnderlyingSurface(); - - if (!surface) { - return nullptr; - } - - switch (surface->GetType()) { - case SurfaceType::D2D1_1_IMAGE: { - SourceSurfaceD2D1* surf = static_cast<SourceSurfaceD2D1*>(surface.get()); - image = surf->GetImage(); - AddDependencyOnSource(surf); - } break; - default: { - RefPtr<DataSourceSurface> dataSurf = surface->GetDataSurface(); - if (!dataSurf) { - gfxWarning() << "Invalid surface type."; - return nullptr; - } - Matrix transform = aUserSpace ? mTransform : Matrix(); - return CreatePartialBitmapForSurface(dataSurf, transform, mSize, - aExtendMode, aSourceTransform, mDC, - aSourceRect); - } break; - } - - return image.forget(); -} - -already_AddRefed<SourceSurface> DrawTargetD2D1::OptimizeSourceSurface( - SourceSurface* aSurface) const { - if (aSurface->GetType() == SurfaceType::D2D1_1_IMAGE) { - RefPtr<SourceSurface> surface(aSurface); - return surface.forget(); - } - - RefPtr<ID2D1DeviceContext> dc = Factory::GetD2DDeviceContext(); - if (!dc) { - return nullptr; - } - - RefPtr<DataSourceSurface> data = aSurface->GetDataSurface(); - - std::optional<SurfaceFormat> convertTo; - switch (data->GetFormat()) { - case gfx::SurfaceFormat::R8G8B8X8: - convertTo = SurfaceFormat::B8G8R8X8; - break; - case gfx::SurfaceFormat::R8G8B8A8: - convertTo = SurfaceFormat::B8G8R8X8; - break; - default: - break; - } - - if (convertTo) { - const auto size = data->GetSize(); - const RefPtr<DrawTarget> dt = - Factory::CreateDrawTarget(BackendType::SKIA, size, *convertTo); - if (!dt) { - return nullptr; - } - dt->CopySurface(data, {{}, size}, {}); - - const RefPtr<SourceSurface> snapshot = dt->Snapshot(); - data = snapshot->GetDataSurface(); - } - - RefPtr<ID2D1Bitmap1> bitmap; - { - DataSourceSurface::ScopedMap map(data, DataSourceSurface::READ); - if (MOZ2D_WARN_IF(!map.IsMapped())) { - return nullptr; - } - - HRESULT hr = dc->CreateBitmap( - D2DIntSize(data->GetSize()), map.GetData(), map.GetStride(), - D2D1::BitmapProperties1(D2D1_BITMAP_OPTIONS_NONE, - D2DPixelFormat(data->GetFormat())), - getter_AddRefs(bitmap)); - - if (FAILED(hr)) { - gfxCriticalError(CriticalLog::DefaultOptions( - Factory::ReasonableSurfaceSize(data->GetSize()))) - << "[D2D1.1] 4CreateBitmap failure " << data->GetSize() - << " Code: " << hexa(hr) << " format " << (int)data->GetFormat(); - } - } - - if (!bitmap) { - return data.forget(); - } - - return MakeAndAddRef<SourceSurfaceD2D1>(bitmap.get(), dc.get(), - data->GetFormat(), data->GetSize()); -} - -void DrawTargetD2D1::PushD2DLayer(ID2D1DeviceContext* aDC, - ID2D1Geometry* aGeometry, - const D2D1_MATRIX_3X2_F& aTransform, - bool aPixelAligned, bool aForceIgnoreAlpha, - const D2D1_RECT_F& aMaxRect) { - D2D1_LAYER_OPTIONS1 options = D2D1_LAYER_OPTIONS1_NONE; - - if (CurrentLayer().mIsOpaque || aForceIgnoreAlpha) { - options = D2D1_LAYER_OPTIONS1_IGNORE_ALPHA | - D2D1_LAYER_OPTIONS1_INITIALIZE_FROM_BACKGROUND; - } - - D2D1_ANTIALIAS_MODE antialias = aPixelAligned - ? D2D1_ANTIALIAS_MODE_ALIASED - : D2D1_ANTIALIAS_MODE_PER_PRIMITIVE; - - mDC->PushLayer(D2D1::LayerParameters1(aMaxRect, aGeometry, antialias, - aTransform, 1.0, nullptr, options), - nullptr); -} - -bool DrawTargetD2D1::IsDeviceContextValid() const { - uint32_t seqNo; - return mDC && Factory::GetD2D1Device(&seqNo) && seqNo == mDeviceSeq; -} - -} // namespace gfx -} // namespace mozilla diff --git a/gfx/2d/DrawTargetD2D1.h b/gfx/2d/DrawTargetD2D1.h @@ -1,339 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef MOZILLA_GFX_DRAWTARGETD2D1_H_ -#define MOZILLA_GFX_DRAWTARGETD2D1_H_ - -#include "2D.h" -#include <d3d11.h> -#include <d2d1_1.h> -#include "PathD2D.h" -#include "HelpersD2D.h" -#include "mozilla/StaticPtr.h" - -#include <vector> -#include <sstream> - -#include <unordered_set> - -struct IDWriteFactory; - -namespace mozilla { -namespace gfx { - -class SourceSurfaceD2D1; - -const int32_t kLayerCacheSize1 = 5; - -class DrawTargetD2D1 : public DrawTarget { - public: - MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawTargetD2D1, override) - DrawTargetD2D1(); - virtual ~DrawTargetD2D1(); - - virtual bool IsValid() const override; - virtual DrawTargetType GetType() const override { - return DrawTargetType::HARDWARE_RASTER; - } - virtual BackendType GetBackendType() const override { - return BackendType::DIRECT2D1_1; - } - virtual already_AddRefed<SourceSurface> Snapshot() override; - virtual already_AddRefed<SourceSurface> IntoLuminanceSource( - LuminanceType aLuminanceType, float aOpacity) override; - virtual IntSize GetSize() const override { return mSize; } - - virtual void Flush() override; - virtual void DrawSurface(SourceSurface* aSurface, const Rect& aDest, - const Rect& aSource, - const DrawSurfaceOptions& aSurfOptions, - const DrawOptions& aOptions) override; - virtual void DrawFilter(FilterNode* aNode, const Rect& aSourceRect, - const Point& aDestPoint, - const DrawOptions& aOptions = DrawOptions()) override; - virtual void DrawSurfaceWithShadow(SourceSurface* aSurface, - const Point& aDest, - const ShadowOptions& aShadow, - CompositionOp aOperator) override; - virtual void ClearRect(const Rect& aRect) override; - virtual void MaskSurface( - const Pattern& aSource, SourceSurface* aMask, Point aOffset, - const DrawOptions& aOptions = DrawOptions()) override; - - virtual void CopySurface(SourceSurface* aSurface, const IntRect& aSourceRect, - const IntPoint& aDestination) override; - - virtual void FillRect(const Rect& aRect, const Pattern& aPattern, - const DrawOptions& aOptions = DrawOptions()) override; - virtual void FillRoundedRect( - const RoundedRect& aRect, const Pattern& aPattern, - const DrawOptions& aOptions = DrawOptions()) override; - - virtual void StrokeRect(const Rect& aRect, const Pattern& aPattern, - const StrokeOptions& aStrokeOptions = StrokeOptions(), - const DrawOptions& aOptions = DrawOptions()) override; - virtual void StrokeLine(const Point& aStart, const Point& aEnd, - const Pattern& aPattern, - const StrokeOptions& aStrokeOptions = StrokeOptions(), - const DrawOptions& aOptions = DrawOptions()) override; - virtual void StrokeCircle( - const Point& aOrigin, float radius, const Pattern& aPattern, - const StrokeOptions& aStrokeOptions = StrokeOptions(), - const DrawOptions& aOptions = DrawOptions()) override; - virtual void Stroke(const Path* aPath, const Pattern& aPattern, - const StrokeOptions& aStrokeOptions = StrokeOptions(), - const DrawOptions& aOptions = DrawOptions()) override; - virtual void Fill(const Path* aPath, const Pattern& aPattern, - const DrawOptions& aOptions = DrawOptions()) override; - virtual void FillCircle(const Point& aOrigin, float radius, - const Pattern& aPattern, - const DrawOptions& aOptions = DrawOptions()) override; - virtual void FillGlyphs(ScaledFont* aFont, const GlyphBuffer& aBuffer, - const Pattern& aPattern, - const DrawOptions& aOptions = DrawOptions()) override; - virtual void Mask(const Pattern& aSource, const Pattern& aMask, - const DrawOptions& aOptions = DrawOptions()) override; - virtual void PushClip(const Path* aPath) override; - virtual void PushClipRect(const Rect& aRect) override; - virtual void PushDeviceSpaceClipRects(const IntRect* aRects, - uint32_t aCount) override; - - virtual void PopClip() override; - virtual bool RemoveAllClips() override; - - virtual void PushLayer(bool aOpaque, Float aOpacity, SourceSurface* aMask, - const Matrix& aMaskTransform, - const IntRect& aBounds = IntRect(), - bool aCopyBackground = false) override; - virtual void PopLayer() override; - - virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromData( - unsigned char* aData, const IntSize& aSize, int32_t aStride, - SurfaceFormat aFormat) const override; - virtual already_AddRefed<SourceSurface> OptimizeSourceSurface( - SourceSurface* aSurface) const override; - - virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromNativeSurface( - const NativeSurface& aSurface) const override { - return nullptr; - } - - virtual already_AddRefed<DrawTarget> CreateSimilarDrawTarget( - const IntSize& aSize, SurfaceFormat aFormat) const override; - virtual bool CanCreateSimilarDrawTarget(const IntSize& aSize, - SurfaceFormat aFormat) const override; - virtual RefPtr<DrawTarget> CreateClippedDrawTarget( - const Rect& aBounds, SurfaceFormat aFormat) override; - - virtual already_AddRefed<PathBuilder> CreatePathBuilder( - FillRule aFillRule = FillRule::FILL_WINDING) const override { - return PathBuilderD2D::Create(aFillRule); - } - - virtual already_AddRefed<GradientStops> CreateGradientStops( - GradientStop* aStops, uint32_t aNumStops, - ExtendMode aExtendMode = ExtendMode::CLAMP) const override; - - virtual already_AddRefed<FilterNode> CreateFilter(FilterType aType) override; - - virtual bool SupportsRegionClipping() const override { return false; } - virtual bool IsCurrentGroupOpaque() override { - return CurrentLayer().mIsOpaque; - } - - virtual void* GetNativeSurface(NativeSurfaceType aType) override { - return nullptr; - } - - virtual void DetachAllSnapshots() override { MarkChanged(); } - - bool Init(const IntSize& aSize, SurfaceFormat aFormat); - bool Init(ID3D11Texture2D* aTexture, SurfaceFormat aFormat); - uint32_t GetByteSize() const; - - // This function will get an image for a surface, it may adjust the source - // transform for any transformation of the resulting image relative to the - // oritingal SourceSurface. By default, the surface and its transform are - // interpreted in user-space, but may be specified in device-space instead. - already_AddRefed<ID2D1Image> GetImageForSurface( - SourceSurface* aSurface, Matrix& aSourceTransform, ExtendMode aExtendMode, - const IntRect* aSourceRect = nullptr, bool aUserSpace = true); - - already_AddRefed<ID2D1Image> GetImageForSurface(SourceSurface* aSurface, - ExtendMode aExtendMode) { - Matrix mat; - return GetImageForSurface(aSurface, mat, aExtendMode, nullptr); - } - - static RefPtr<ID2D1Factory1> factory(); - static void CleanupD2D(); - - operator std::string() const { - std::stringstream stream; - stream << "DrawTargetD2D 1.1 (" << this << ")"; - return stream.str(); - } - - static uint32_t GetMaxSurfaceSize() { - return D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; - } - - static uint64_t mVRAMUsageDT; - static uint64_t mVRAMUsageSS; - - private: - friend class SourceSurfaceD2D1; - - void FlushInternal(bool aHasDependencyMutex = false); - bool EnsureInitialized(); - - typedef std::unordered_set<DrawTargetD2D1*> TargetSet; - - // This function will mark the surface as changing, and make sure any - // copy-on-write snapshots are notified. - void MarkChanged(); - bool ShouldClipTemporarySurfaceDrawing(CompositionOp aOp, - const Pattern& aPattern, - bool aClipIsComplex); - bool PrepareForDrawing(CompositionOp aOp, const Pattern& aPattern); - void FinalizeDrawing(CompositionOp aOp, const Pattern& aPattern); - bool MaybeClearRect(CompositionOp aOp, const Rect& aBounds); - void FlushTransformToDC() { - if (mTransformDirty) { - mDC->SetTransform(D2DMatrix(mTransform)); - mTransformDirty = false; - } - } - void AddDependencyOnSource(SourceSurfaceD2D1* aSource); - - // Must be called with all clips popped and an identity matrix set. - already_AddRefed<ID2D1Image> GetImageForLayerContent( - const IntRect* aBounds = nullptr, bool aShouldPreserveContent = true); - - ID2D1Image* CurrentTarget() { - if (CurrentLayer().mCurrentList) { - return CurrentLayer().mCurrentList; - } - return mBitmap; - } - - // This returns the clipped geometry, in addition it returns aClipBounds which - // represents the intersection of all pixel-aligned rectangular clips that - // are currently set. The returned clipped geometry must be clipped by these - // bounds to correctly reflect the total clip. This is in device space and - // only for clips applied to the -current layer-. - already_AddRefed<ID2D1Geometry> GetClippedGeometry(IntRect* aClipBounds); - - already_AddRefed<ID2D1Geometry> GetInverseClippedGeometry(); - - // This gives the device space clip rect applied to the -current layer-. - bool GetDeviceSpaceClipRect(D2D1_RECT_F& aClipRect, bool& aIsPixelAligned); - - void PopAllClips(); - void PushAllClips(); - void PushClipsToDC(ID2D1DeviceContext* aDC, bool aForceIgnoreAlpha = false, - const D2D1_RECT_F& aMaxRect = D2D1::InfiniteRect()); - void PopClipsFromDC(ID2D1DeviceContext* aDC); - - already_AddRefed<ID2D1Brush> CreateTransparentBlackBrush(); - already_AddRefed<ID2D1SolidColorBrush> GetSolidColorBrush( - const D2D_COLOR_F& aColor); - already_AddRefed<ID2D1Brush> CreateBrushForPattern( - const Pattern& aPattern, const DrawOptions& aOptions); - - void PushClipGeometry(ID2D1Geometry* aGeometry, - const D2D1_MATRIX_3X2_F& aTransform, - bool aPixelAligned = false); - - void PushD2DLayer(ID2D1DeviceContext* aDC, ID2D1Geometry* aGeometry, - const D2D1_MATRIX_3X2_F& aTransform, - bool aPixelAligned = false, bool aForceIgnoreAlpha = false, - const D2D1_RECT_F& aLayerRect = D2D1::InfiniteRect()); - - // This function is used to determine if the mDC is still valid; if it is - // stale, we should avoid using it to execute any draw commands. - bool IsDeviceContextValid() const; - - IntSize mSize; - - RefPtr<ID2D1Geometry> mCurrentClippedGeometry; - // This is only valid if mCurrentClippedGeometry is non-null. And will - // only be the intersection of all pixel-aligned retangular clips. This is in - // device space. - IntRect mCurrentClipBounds; - mutable RefPtr<ID2D1DeviceContext> mDC; - RefPtr<ID2D1Bitmap1> mBitmap; - RefPtr<ID2D1CommandList> mCommandList; - - RefPtr<ID2D1SolidColorBrush> mSolidColorBrush; - - // We store this to prevent excessive SetTextRenderingParams calls. - RefPtr<IDWriteRenderingParams> mTextRenderingParams; - - // List of pushed clips. - struct PushedClip { - D2D1_RECT_F mBounds; - // If mGeometry is non-null, the mTransform member will be used. - D2D1_MATRIX_3X2_F mTransform; - RefPtr<ID2D1Geometry> mGeometry; - // Indicates if mBounds, and when non-null, mGeometry with mTransform - // applied, are pixel-aligned. - bool mIsPixelAligned; - }; - - // List of pushed layers. - struct PushedLayer { - PushedLayer() - : mClipsArePushed(false), - mIsOpaque(false), - mOldPermitSubpixelAA(false) {} - - std::vector<PushedClip> mPushedClips; - RefPtr<ID2D1CommandList> mCurrentList; - // True if the current clip stack is pushed to the CurrentTarget(). - bool mClipsArePushed; - bool mIsOpaque; - bool mOldPermitSubpixelAA; - }; - std::vector<PushedLayer> mPushedLayers; - PushedLayer& CurrentLayer() { return mPushedLayers.back(); } - - // The latest snapshot of this surface. This needs to be told when this - // target is modified. We keep it alive as a cache. - RefPtr<SourceSurfaceD2D1> mSnapshot; - std::shared_ptr<Mutex> mSnapshotLock; - // A list of targets we need to flush when we're modified. - TargetSet mDependentTargets; - // A list of targets which have this object in their mDependentTargets set - TargetSet mDependingOnTargets; - - uint32_t mUsedCommandListsSincePurge; - uint32_t mTransformedGlyphsSinceLastPurge; - // When a BlendEffect has been drawn to a command list, and that command list - // is subsequently used -again- as an input to a blend effect for a command - // list, this causes an infinite recursion inside D2D as it tries to resolve - // the bounds. If we resolve the current command list before this happens we - // can avoid the subsequent hang. (See bug 1293586) - uint32_t mComplexBlendsWithListInList; - - static StaticRefPtr<ID2D1Factory1> mFactory; - // This value is uesed to verify if the DrawTarget is created by a stale - // device. - uint32_t mDeviceSeq; - - // List of effects we use - bool EnsureLuminanceEffect(); - RefPtr<ID2D1Effect> mLuminanceEffect; - - enum class InitState { Uninitialized, Success, Failure }; - InitState mInitState; - RefPtr<IDXGISurface> mSurface; -}; - -} // namespace gfx -} // namespace mozilla - -#endif /* MOZILLA_GFX_DRAWTARGETD2D_H_ */ diff --git a/gfx/2d/ExtendInputEffectD2D1.cpp b/gfx/2d/ExtendInputEffectD2D1.cpp @@ -1,190 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "ExtendInputEffectD2D1.h" - -#include "Logging.h" - -#include "ShadersD2D1.h" -#include "HelpersD2D.h" - -#include <vector> - -#define TEXTW(x) L##x -#define XML(X) \ - TEXTW(#X) // This macro creates a single string from multiple lines of text. - -static const PCWSTR kXmlDescription = - XML( - <?xml version='1.0'?> - <Effect> - <!-- System Properties --> - <Property name='DisplayName' type='string' value='ExtendInputEffect'/> - <Property name='Author' type='string' value='Mozilla'/> - <Property name='Category' type='string' value='Utility Effects'/> - <Property name='Description' type='string' value='This effect is used to extend the output rect of any input effect to a specified rect.'/> - <Inputs> - <Input name='InputEffect'/> - </Inputs> - <Property name='OutputRect' type='vector4'> - <Property name='DisplayName' type='string' value='Output Rect'/> - </Property> - </Effect> - ); - -namespace mozilla { -namespace gfx { - -ExtendInputEffectD2D1::ExtendInputEffectD2D1() - : mRefCount(0), - mOutputRect(D2D1::Vector4F(-FLT_MAX, -FLT_MAX, FLT_MAX, FLT_MAX)) {} - -IFACEMETHODIMP -ExtendInputEffectD2D1::Initialize(ID2D1EffectContext* pContextInternal, - ID2D1TransformGraph* pTransformGraph) { - HRESULT hr; - hr = pTransformGraph->SetSingleTransformNode(this); - - if (FAILED(hr)) { - return hr; - } - - return S_OK; -} - -IFACEMETHODIMP -ExtendInputEffectD2D1::PrepareForRender(D2D1_CHANGE_TYPE changeType) { - return S_OK; -} - -IFACEMETHODIMP -ExtendInputEffectD2D1::SetGraph(ID2D1TransformGraph* pGraph) { - return E_NOTIMPL; -} - -IFACEMETHODIMP_(ULONG) -ExtendInputEffectD2D1::AddRef() { return ++mRefCount; } - -IFACEMETHODIMP_(ULONG) -ExtendInputEffectD2D1::Release() { - if (!--mRefCount) { - delete this; - return 0; - } - return mRefCount; -} - -IFACEMETHODIMP -ExtendInputEffectD2D1::QueryInterface(const IID& aIID, void** aPtr) { - if (!aPtr) { - return E_POINTER; - } - - if (aIID == IID_IUnknown) { - *aPtr = static_cast<IUnknown*>(static_cast<ID2D1EffectImpl*>(this)); - } else if (aIID == IID_ID2D1EffectImpl) { - *aPtr = static_cast<ID2D1EffectImpl*>(this); - } else if (aIID == IID_ID2D1DrawTransform) { - *aPtr = static_cast<ID2D1DrawTransform*>(this); - } else if (aIID == IID_ID2D1Transform) { - *aPtr = static_cast<ID2D1Transform*>(this); - } else if (aIID == IID_ID2D1TransformNode) { - *aPtr = static_cast<ID2D1TransformNode*>(this); - } else { - return E_NOINTERFACE; - } - - static_cast<IUnknown*>(*aPtr)->AddRef(); - return S_OK; -} - -static D2D1_RECT_L ConvertFloatToLongRect(const D2D1_VECTOR_4F& aRect) { - // Clamp values to LONG range. We can't use std::min/max here because we want - // the comparison to operate on a type that's different from the type of the - // result. - return D2D1::RectL(aRect.x <= float(LONG_MIN) ? LONG_MIN : LONG(aRect.x), - aRect.y <= float(LONG_MIN) ? LONG_MIN : LONG(aRect.y), - aRect.z >= float(LONG_MAX) ? LONG_MAX : LONG(aRect.z), - aRect.w >= float(LONG_MAX) ? LONG_MAX : LONG(aRect.w)); -} - -static D2D1_RECT_L IntersectRect(const D2D1_RECT_L& aRect1, - const D2D1_RECT_L& aRect2) { - return D2D1::RectL(std::max(aRect1.left, aRect2.left), - std::max(aRect1.top, aRect2.top), - std::min(aRect1.right, aRect2.right), - std::min(aRect1.bottom, aRect2.bottom)); -} - -IFACEMETHODIMP -ExtendInputEffectD2D1::MapInputRectsToOutputRect( - const D2D1_RECT_L* pInputRects, const D2D1_RECT_L* pInputOpaqueSubRects, - UINT32 inputRectCount, D2D1_RECT_L* pOutputRect, - D2D1_RECT_L* pOutputOpaqueSubRect) { - // This transform only accepts one input, so there will only be one input - // rect. - if (inputRectCount != 1) { - return E_INVALIDARG; - } - - // Set the output rect to the specified rect. This is the whole purpose of - // this effect. - *pOutputRect = ConvertFloatToLongRect(mOutputRect); - *pOutputOpaqueSubRect = IntersectRect(*pOutputRect, pInputOpaqueSubRects[0]); - return S_OK; -} - -IFACEMETHODIMP -ExtendInputEffectD2D1::MapOutputRectToInputRects(const D2D1_RECT_L* pOutputRect, - D2D1_RECT_L* pInputRects, - UINT32 inputRectCount) const { - if (inputRectCount != 1) { - return E_INVALIDARG; - } - - *pInputRects = *pOutputRect; - return S_OK; -} - -IFACEMETHODIMP -ExtendInputEffectD2D1::MapInvalidRect(UINT32 inputIndex, - D2D1_RECT_L invalidInputRect, - D2D1_RECT_L* pInvalidOutputRect) const { - MOZ_ASSERT(inputIndex == 0); - - *pInvalidOutputRect = invalidInputRect; - return S_OK; -} - -HRESULT -ExtendInputEffectD2D1::Register(ID2D1Factory1* aFactory) { - D2D1_PROPERTY_BINDING bindings[] = { - D2D1_VALUE_TYPE_BINDING(L"OutputRect", - &ExtendInputEffectD2D1::SetOutputRect, - &ExtendInputEffectD2D1::GetOutputRect), - }; - HRESULT hr = aFactory->RegisterEffectFromString( - CLSID_ExtendInputEffect, kXmlDescription, bindings, 1, CreateEffect); - - if (FAILED(hr)) { - gfxWarning() << "Failed to register extend input effect."; - } - return hr; -} - -void ExtendInputEffectD2D1::Unregister(ID2D1Factory1* aFactory) { - aFactory->UnregisterEffect(CLSID_ExtendInputEffect); -} - -HRESULT __stdcall ExtendInputEffectD2D1::CreateEffect(IUnknown** aEffectImpl) { - *aEffectImpl = static_cast<ID2D1EffectImpl*>(new ExtendInputEffectD2D1()); - (*aEffectImpl)->AddRef(); - - return S_OK; -} - -} // namespace gfx -} // namespace mozilla diff --git a/gfx/2d/ExtendInputEffectD2D1.h b/gfx/2d/ExtendInputEffectD2D1.h @@ -1,86 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef MOZILLA_GFX_EXTENDINPUTEFFECTD2D1_H_ -#define MOZILLA_GFX_EXTENDINPUTEFFECTD2D1_H_ - -#include <d2d1_1.h> -#include <d2d1effectauthor.h> -#include <d2d1effecthelpers.h> - -#include "2D.h" - -// {97143DC6-CBC4-4DD4-A8BA-13342B0BA46D} -DEFINE_GUID(CLSID_ExtendInputEffect, 0x5fb55c7c, 0xd795, 0x4ba3, 0xa9, 0x5c, - 0x22, 0x82, 0x5d, 0x0c, 0x4d, 0xf7); - -namespace mozilla { -namespace gfx { - -enum { EXTENDINPUT_PROP_OUTPUT_RECT = 0 }; - -// An effect type that passes through its input unchanged but sets the effect's -// output rect to a specified rect. Unlike the built-in Crop effect, the -// ExtendInput effect can extend the input rect, and not just make it smaller. -// The added margins are filled with transparent black. -// Some effects have different output depending on their input effect's output -// rect, for example the Border effect (which repeats the edges of its input -// effect's output rect) or the component transfer and color matrix effects -// (which can transform transparent pixels into non-transparent ones, but only -// inside their input effect's output rect). -class ExtendInputEffectD2D1 final : public ID2D1EffectImpl, - public ID2D1DrawTransform { - public: - // ID2D1EffectImpl - IFACEMETHODIMP Initialize(ID2D1EffectContext* pContextInternal, - ID2D1TransformGraph* pTransformGraph); - IFACEMETHODIMP PrepareForRender(D2D1_CHANGE_TYPE changeType); - IFACEMETHODIMP SetGraph(ID2D1TransformGraph* pGraph); - - // IUnknown - IFACEMETHODIMP_(ULONG) AddRef(); - IFACEMETHODIMP_(ULONG) Release(); - IFACEMETHODIMP QueryInterface(REFIID riid, void** ppOutput); - - // ID2D1Transform - IFACEMETHODIMP MapInputRectsToOutputRect( - const D2D1_RECT_L* pInputRects, const D2D1_RECT_L* pInputOpaqueSubRects, - UINT32 inputRectCount, D2D1_RECT_L* pOutputRect, - D2D1_RECT_L* pOutputOpaqueSubRect); - IFACEMETHODIMP MapOutputRectToInputRects(const D2D1_RECT_L* pOutputRect, - D2D1_RECT_L* pInputRects, - UINT32 inputRectCount) const; - IFACEMETHODIMP MapInvalidRect(UINT32 inputIndex, D2D1_RECT_L invalidInputRect, - D2D1_RECT_L* pInvalidOutputRect) const; - - // ID2D1TransformNode - IFACEMETHODIMP_(UINT32) GetInputCount() const { return 1; } - - // ID2D1DrawTransform - IFACEMETHODIMP SetDrawInfo(ID2D1DrawInfo* pDrawInfo) { return S_OK; } - - static HRESULT Register(ID2D1Factory1* aFactory); - static void Unregister(ID2D1Factory1* aFactory); - static HRESULT __stdcall CreateEffect(IUnknown** aEffectImpl); - - HRESULT SetOutputRect(D2D1_VECTOR_4F aOutputRect) { - mOutputRect = aOutputRect; - return S_OK; - } - D2D1_VECTOR_4F GetOutputRect() const { return mOutputRect; } - - private: - ExtendInputEffectD2D1(); - - uint32_t mRefCount; - D2D1_VECTOR_4F mOutputRect; -}; - -} // namespace gfx -} // namespace mozilla -#undef SIMPLE_PROP - -#endif diff --git a/gfx/2d/Factory.cpp b/gfx/2d/Factory.cpp @@ -42,14 +42,12 @@ #endif #ifdef WIN32 -# include "DrawTargetD2D1.h" -# include "PathD2D.h" # include "ScaledFontDWrite.h" # include "NativeFontResourceDWrite.h" # include "UnscaledFontDWrite.h" # include <d3d10_1.h> # include <stdlib.h> -# include "HelpersD2D.h" +# include "HelpersWin.h" # include "ImageContainer.h" # include "mozilla/layers/LayersSurfaces.h" # include "mozilla/layers/TextureD3D11.h" @@ -228,16 +226,11 @@ already_AddRefed<SharedFTFace> FTUserFontData::CloneFace(int aFaceIndex) { #ifdef WIN32 // Note: mDeviceLock must be held when mutating these values. -static uint32_t mDeviceSeq = 0; StaticRefPtr<ID3D11Device> Factory::mD3D11Device; -StaticRefPtr<ID2D1Device> Factory::mD2D1Device; StaticRefPtr<IDWriteFactory> Factory::mDWriteFactory; -StaticRefPtr<ID2D1DeviceContext> Factory::mMTDC; -StaticRefPtr<ID2D1DeviceContext> Factory::mOffMTDC; bool Factory::mDWriteFactoryInitialized = false; StaticRefPtr<IDWriteFontCollection> Factory::mDWriteSystemFonts; StaticMutex Factory::mDeviceLock; -StaticMutex Factory::mDTDependencyLock; #endif SubpixelOrder Factory::mSubpixelOrder = SubpixelOrder::UNKNOWN; @@ -377,16 +370,6 @@ already_AddRefed<DrawTarget> Factory::CreateDrawTarget(BackendType aBackend, RefPtr<DrawTarget> retVal; switch (aBackend) { -#ifdef WIN32 - case BackendType::DIRECT2D1_1: { - RefPtr<DrawTargetD2D1> newTarget; - newTarget = new DrawTargetD2D1(); - if (newTarget->Init(aSize, aFormat)) { - retVal = newTarget; - } - break; - } -#endif case BackendType::SKIA: { RefPtr<DrawTargetSkia> newTarget; newTarget = new DrawTargetSkia(); @@ -422,10 +405,6 @@ already_AddRefed<DrawTarget> Factory::CreateDrawTarget(BackendType aBackend, already_AddRefed<PathBuilder> Factory::CreatePathBuilder(BackendType aBackend, FillRule aFillRule) { switch (aBackend) { -#ifdef WIN32 - case BackendType::DIRECT2D1_1: - return PathBuilderD2D::Create(aFillRule); -#endif case BackendType::SKIA: case BackendType::WEBGL: return PathBuilderSkia::Create(aFillRule); @@ -510,8 +489,6 @@ already_AddRefed<DrawTarget> Factory::CreateOffsetDrawTarget( bool Factory::DoesBackendSupportDataDrawtarget(BackendType aType) { switch (aType) { - case BackendType::DIRECT2D: - case BackendType::DIRECT2D1_1: case BackendType::RECORDING: case BackendType::NONE: case BackendType::BACKEND_LAST: @@ -532,10 +509,6 @@ uint32_t Factory::GetMaxSurfaceSize(BackendType aType) { return DrawTargetCairo::GetMaxSurfaceSize(); case BackendType::SKIA: return DrawTargetSkia::GetMaxSurfaceSize(); -#ifdef WIN32 - case BackendType::DIRECT2D1_1: - return DrawTargetD2D1::GetMaxSurfaceSize(); -#endif default: return 0; } @@ -750,91 +723,13 @@ FT_Error Factory::LoadFTGlyph(FT_Face aFace, uint32_t aGlyphIndex, } #endif -AutoSerializeWithMoz2D::AutoSerializeWithMoz2D(BackendType aBackendType) { -#ifdef WIN32 - // We use a multi-threaded ID2D1Factory1, so that makes the calls through the - // Direct2D API thread-safe. However, if the Moz2D objects are using Direct3D - // resources we need to make sure that calls through the Direct3D or DXGI API - // use the Direct2D synchronization. It's possible that this should be pushed - // down into the TextureD3D11 objects, so that we always use this. - if (aBackendType == BackendType::DIRECT2D1_1 || - aBackendType == BackendType::DIRECT2D) { - auto factory = D2DFactory(); - if (factory) { - factory->QueryInterface( - static_cast<ID2D1Multithread**>(getter_AddRefs(mMT))); - if (mMT) { - mMT->Enter(); - } - } - } -#endif -} - -AutoSerializeWithMoz2D::~AutoSerializeWithMoz2D() { -#ifdef WIN32 - if (mMT) { - mMT->Leave(); - } -#endif -}; - #ifdef WIN32 -already_AddRefed<DrawTarget> Factory::CreateDrawTargetForD3D11Texture( - ID3D11Texture2D* aTexture, SurfaceFormat aFormat) { - MOZ_ASSERT(aTexture); - - RefPtr<DrawTargetD2D1> newTarget; - - newTarget = new DrawTargetD2D1(); - if (newTarget->Init(aTexture, aFormat)) { - RefPtr<DrawTarget> retVal = newTarget; - return retVal.forget(); - } - - gfxWarning() << "Failed to create draw target for D3D11 texture."; - - // Failed - return nullptr; -} - bool Factory::SetDirect3D11Device(ID3D11Device* aDevice) { MOZ_RELEASE_ASSERT(NS_IsMainThread()); - // D2DFactory already takes the device lock, so we get the factory before - // entering the lock scope. - RefPtr<ID2D1Factory1> factory = D2DFactory(); - StaticMutexAutoLock lock(mDeviceLock); mD3D11Device = aDevice; - - if (mD2D1Device) { - mD2D1Device = nullptr; - mMTDC = nullptr; - mOffMTDC = nullptr; - } - - if (!aDevice) { - return true; - } - - RefPtr<IDXGIDevice> device; - aDevice->QueryInterface((IDXGIDevice**)getter_AddRefs(device)); - - RefPtr<ID2D1Device> d2dDevice; - HRESULT hr = factory->CreateDevice(device, getter_AddRefs(d2dDevice)); - if (FAILED(hr)) { - gfxCriticalError() - << "[D2D1] Failed to create gfx factory's D2D1 device, code: " - << hexa(hr); - - mD3D11Device = nullptr; - return false; - } - - mDeviceSeq++; - mD2D1Device = d2dDevice; return true; } @@ -843,16 +738,6 @@ RefPtr<ID3D11Device> Factory::GetDirect3D11Device() { return mD3D11Device; } -RefPtr<ID2D1Device> Factory::GetD2D1Device(uint32_t* aOutSeqNo) { - StaticMutexAutoLock lock(mDeviceLock); - if (aOutSeqNo) { - *aOutSeqNo = mDeviceSeq; - } - return mD2D1Device.get(); -} - -bool Factory::HasD2D1Device() { return !!GetD2D1Device(); } - RefPtr<IDWriteFactory> Factory::GetDWriteFactory() { StaticMutexAutoLock lock(mDeviceLock); return mDWriteFactory; @@ -925,63 +810,11 @@ RefPtr<IDWriteFontCollection> Factory::GetDWriteSystemFonts(bool aUpdate) { return mDWriteSystemFonts; } -RefPtr<ID2D1DeviceContext> Factory::GetD2DDeviceContext() { - StaticRefPtr<ID2D1DeviceContext>* ptr; - - if (NS_IsMainThread()) { - ptr = &mMTDC; - } else { - ptr = &mOffMTDC; - } - - if (*ptr) { - return *ptr; - } - - RefPtr<ID2D1Device> device = GetD2D1Device(); - - if (!device) { - return nullptr; - } - - RefPtr<ID2D1DeviceContext> dc; - HRESULT hr = device->CreateDeviceContext( - D2D1_DEVICE_CONTEXT_OPTIONS_ENABLE_MULTITHREADED_OPTIMIZATIONS, - getter_AddRefs(dc)); - - if (FAILED(hr)) { - gfxCriticalError() << "Failed to create global device context"; - return nullptr; - } - - *ptr = dc; - - return *ptr; -} - -bool Factory::SupportsD2D1() { return !!D2DFactory(); } - BYTE sSystemTextQuality = CLEARTYPE_QUALITY; void Factory::SetSystemTextQuality(uint8_t aQuality) { sSystemTextQuality = aQuality; } -uint64_t Factory::GetD2DVRAMUsageDrawTarget() { - return DrawTargetD2D1::mVRAMUsageDT; -} - -uint64_t Factory::GetD2DVRAMUsageSourceSurface() { - return DrawTargetD2D1::mVRAMUsageSS; -} - -void Factory::D2DCleanup() { - StaticMutexAutoLock lock(mDeviceLock); - if (mD2D1Device) { - mD2D1Device = nullptr; - } - DrawTargetD2D1::CleanupD2D(); -} - already_AddRefed<ScaledFont> Factory::CreateScaledFontForDWriteFont( IDWriteFontFace* aFontFace, const gfxFontStyle* aStyle, const RefPtr<UnscaledFont>& aUnscaledFont, float aSize, diff --git a/gfx/2d/FilterNodeD2D1.cpp b/gfx/2d/FilterNodeD2D1.cpp @@ -1,1259 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "FilterNodeD2D1.h" - -#include "Logging.h" - -#include "SourceSurfaceD2D1.h" -#include "DrawTargetD2D1.h" -#include "ExtendInputEffectD2D1.h" - -namespace mozilla { -namespace gfx { - -D2D1_COLORMATRIX_ALPHA_MODE D2DAlphaMode(uint32_t aMode) { - switch (aMode) { - case ALPHA_MODE_PREMULTIPLIED: - return D2D1_COLORMATRIX_ALPHA_MODE_PREMULTIPLIED; - case ALPHA_MODE_STRAIGHT: - return D2D1_COLORMATRIX_ALPHA_MODE_STRAIGHT; - default: - MOZ_CRASH("GFX: Unknown enum value D2DAlphaMode!"); - } - - return D2D1_COLORMATRIX_ALPHA_MODE_PREMULTIPLIED; -} - -D2D1_2DAFFINETRANSFORM_INTERPOLATION_MODE D2DAffineTransformInterpolationMode( - SamplingFilter aSamplingFilter) { - switch (aSamplingFilter) { - case SamplingFilter::GOOD: - return D2D1_2DAFFINETRANSFORM_INTERPOLATION_MODE_LINEAR; - case SamplingFilter::LINEAR: - return D2D1_2DAFFINETRANSFORM_INTERPOLATION_MODE_LINEAR; - case SamplingFilter::POINT: - return D2D1_2DAFFINETRANSFORM_INTERPOLATION_MODE_NEAREST_NEIGHBOR; - default: - MOZ_CRASH("GFX: Unknown enum value D2DAffineTIM!"); - } - - return D2D1_2DAFFINETRANSFORM_INTERPOLATION_MODE_LINEAR; -} - -D2D1_BLEND_MODE D2DBlendMode(uint32_t aMode) { - switch (aMode) { - case BLEND_MODE_DARKEN: - return D2D1_BLEND_MODE_DARKEN; - case BLEND_MODE_LIGHTEN: - return D2D1_BLEND_MODE_LIGHTEN; - case BLEND_MODE_MULTIPLY: - return D2D1_BLEND_MODE_MULTIPLY; - case BLEND_MODE_SCREEN: - return D2D1_BLEND_MODE_SCREEN; - case BLEND_MODE_OVERLAY: - return D2D1_BLEND_MODE_OVERLAY; - case BLEND_MODE_COLOR_DODGE: - return D2D1_BLEND_MODE_COLOR_DODGE; - case BLEND_MODE_COLOR_BURN: - return D2D1_BLEND_MODE_COLOR_BURN; - case BLEND_MODE_HARD_LIGHT: - return D2D1_BLEND_MODE_HARD_LIGHT; - case BLEND_MODE_SOFT_LIGHT: - return D2D1_BLEND_MODE_SOFT_LIGHT; - case BLEND_MODE_DIFFERENCE: - return D2D1_BLEND_MODE_DIFFERENCE; - case BLEND_MODE_EXCLUSION: - return D2D1_BLEND_MODE_EXCLUSION; - case BLEND_MODE_HUE: - return D2D1_BLEND_MODE_HUE; - case BLEND_MODE_SATURATION: - return D2D1_BLEND_MODE_SATURATION; - case BLEND_MODE_COLOR: - return D2D1_BLEND_MODE_COLOR; - case BLEND_MODE_LUMINOSITY: - return D2D1_BLEND_MODE_LUMINOSITY; - - default: - MOZ_CRASH("GFX: Unknown enum value D2DBlendMode!"); - } - - return D2D1_BLEND_MODE_DARKEN; -} - -D2D1_MORPHOLOGY_MODE D2DMorphologyMode(uint32_t aMode) { - switch (aMode) { - case MORPHOLOGY_OPERATOR_DILATE: - return D2D1_MORPHOLOGY_MODE_DILATE; - case MORPHOLOGY_OPERATOR_ERODE: - return D2D1_MORPHOLOGY_MODE_ERODE; - } - - MOZ_CRASH("GFX: Unknown enum value D2DMorphologyMode!"); - return D2D1_MORPHOLOGY_MODE_DILATE; -} - -D2D1_TURBULENCE_NOISE D2DTurbulenceNoise(uint32_t aMode) { - switch (aMode) { - case TURBULENCE_TYPE_FRACTAL_NOISE: - return D2D1_TURBULENCE_NOISE_FRACTAL_SUM; - case TURBULENCE_TYPE_TURBULENCE: - return D2D1_TURBULENCE_NOISE_TURBULENCE; - } - - MOZ_CRASH("GFX: Unknown enum value D2DTurbulenceNoise!"); - return D2D1_TURBULENCE_NOISE_TURBULENCE; -} - -D2D1_COMPOSITE_MODE D2DFilterCompositionMode(uint32_t aMode) { - switch (aMode) { - case COMPOSITE_OPERATOR_OVER: - return D2D1_COMPOSITE_MODE_SOURCE_OVER; - case COMPOSITE_OPERATOR_IN: - return D2D1_COMPOSITE_MODE_SOURCE_IN; - case COMPOSITE_OPERATOR_OUT: - return D2D1_COMPOSITE_MODE_SOURCE_OUT; - case COMPOSITE_OPERATOR_ATOP: - return D2D1_COMPOSITE_MODE_SOURCE_ATOP; - case COMPOSITE_OPERATOR_XOR: - return D2D1_COMPOSITE_MODE_XOR; - case COMPOSITE_OPERATOR_LIGHTER: - return D2D1_COMPOSITE_MODE_PLUS; - } - - MOZ_CRASH("GFX: Unknown enum value D2DFilterCompositionMode!"); - return D2D1_COMPOSITE_MODE_SOURCE_OVER; -} - -D2D1_CHANNEL_SELECTOR D2DChannelSelector(uint32_t aMode) { - switch (aMode) { - case COLOR_CHANNEL_R: - return D2D1_CHANNEL_SELECTOR_R; - case COLOR_CHANNEL_G: - return D2D1_CHANNEL_SELECTOR_G; - case COLOR_CHANNEL_B: - return D2D1_CHANNEL_SELECTOR_B; - case COLOR_CHANNEL_A: - return D2D1_CHANNEL_SELECTOR_A; - } - - MOZ_CRASH("GFX: Unknown enum value D2DChannelSelector!"); - return D2D1_CHANNEL_SELECTOR_R; -} - -already_AddRefed<ID2D1Image> GetImageForSourceSurface(DrawTarget* aDT, - SourceSurface* aSurface) { - if (aDT->IsTiledDrawTarget()) { - gfxDevCrash(LogReason::FilterNodeD2D1Target) - << "Incompatible draw target type! " << (int)aDT->IsTiledDrawTarget(); - return nullptr; - } - switch (aDT->GetBackendType()) { - case BackendType::DIRECT2D1_1: - return static_cast<DrawTargetD2D1*>(aDT)->GetImageForSurface( - aSurface, ExtendMode::CLAMP); - default: - gfxDevCrash(LogReason::FilterNodeD2D1Backend) - << "Unknown draw target type! " << (int)aDT->GetBackendType(); - return nullptr; - } -} - -uint32_t ConvertValue(FilterType aType, uint32_t aAttribute, uint32_t aValue) { - switch (aType) { - case FilterType::COLOR_MATRIX: - if (aAttribute == ATT_COLOR_MATRIX_ALPHA_MODE) { - aValue = D2DAlphaMode(aValue); - } - break; - case FilterType::TRANSFORM: - if (aAttribute == ATT_TRANSFORM_FILTER) { - aValue = D2DAffineTransformInterpolationMode(SamplingFilter(aValue)); - } - break; - case FilterType::BLEND: - if (aAttribute == ATT_BLEND_BLENDMODE) { - aValue = D2DBlendMode(aValue); - } - break; - case FilterType::MORPHOLOGY: - if (aAttribute == ATT_MORPHOLOGY_OPERATOR) { - aValue = D2DMorphologyMode(aValue); - } - break; - case FilterType::DISPLACEMENT_MAP: - if (aAttribute == ATT_DISPLACEMENT_MAP_X_CHANNEL || - aAttribute == ATT_DISPLACEMENT_MAP_Y_CHANNEL) { - aValue = D2DChannelSelector(aValue); - } - break; - case FilterType::TURBULENCE: - if (aAttribute == ATT_TURBULENCE_TYPE) { - aValue = D2DTurbulenceNoise(aValue); - } - break; - case FilterType::COMPOSITE: - if (aAttribute == ATT_COMPOSITE_OPERATOR) { - aValue = D2DFilterCompositionMode(aValue); - } - break; - default: - break; - } - - return aValue; -} - -void ConvertValue(FilterType aType, uint32_t aAttribute, IntSize& aValue) { - switch (aType) { - case FilterType::MORPHOLOGY: - if (aAttribute == ATT_MORPHOLOGY_RADII) { - aValue.width *= 2; - aValue.width += 1; - aValue.height *= 2; - aValue.height += 1; - } - break; - default: - break; - } -} - -UINT32 -GetD2D1InputForInput(FilterType aType, uint32_t aIndex) { return aIndex; } - -#define CONVERT_PROP(moz2dname, d2dname) \ - case ATT_##moz2dname: \ - return D2D1_##d2dname - -UINT32 -GetD2D1PropForAttribute(FilterType aType, uint32_t aIndex) { - switch (aType) { - case FilterType::COLOR_MATRIX: - switch (aIndex) { - CONVERT_PROP(COLOR_MATRIX_MATRIX, COLORMATRIX_PROP_COLOR_MATRIX); - CONVERT_PROP(COLOR_MATRIX_ALPHA_MODE, COLORMATRIX_PROP_ALPHA_MODE); - } - break; - case FilterType::TRANSFORM: - switch (aIndex) { - CONVERT_PROP(TRANSFORM_MATRIX, 2DAFFINETRANSFORM_PROP_TRANSFORM_MATRIX); - CONVERT_PROP(TRANSFORM_FILTER, - 2DAFFINETRANSFORM_PROP_INTERPOLATION_MODE); - } - case FilterType::BLEND: - switch (aIndex) { CONVERT_PROP(BLEND_BLENDMODE, BLEND_PROP_MODE); } - break; - case FilterType::MORPHOLOGY: - switch (aIndex) { - CONVERT_PROP(MORPHOLOGY_OPERATOR, MORPHOLOGY_PROP_MODE); - } - break; - case FilterType::FLOOD: - switch (aIndex) { CONVERT_PROP(FLOOD_COLOR, FLOOD_PROP_COLOR); } - break; - case FilterType::TILE: - switch (aIndex) { CONVERT_PROP(TILE_SOURCE_RECT, TILE_PROP_RECT); } - break; - case FilterType::TABLE_TRANSFER: - switch (aIndex) { - CONVERT_PROP(TABLE_TRANSFER_DISABLE_R, TABLETRANSFER_PROP_RED_DISABLE); - CONVERT_PROP(TABLE_TRANSFER_DISABLE_G, - TABLETRANSFER_PROP_GREEN_DISABLE); - CONVERT_PROP(TABLE_TRANSFER_DISABLE_B, TABLETRANSFER_PROP_BLUE_DISABLE); - CONVERT_PROP(TABLE_TRANSFER_DISABLE_A, - TABLETRANSFER_PROP_ALPHA_DISABLE); - CONVERT_PROP(TABLE_TRANSFER_TABLE_R, TABLETRANSFER_PROP_RED_TABLE); - CONVERT_PROP(TABLE_TRANSFER_TABLE_G, TABLETRANSFER_PROP_GREEN_TABLE); - CONVERT_PROP(TABLE_TRANSFER_TABLE_B, TABLETRANSFER_PROP_BLUE_TABLE); - CONVERT_PROP(TABLE_TRANSFER_TABLE_A, TABLETRANSFER_PROP_ALPHA_TABLE); - } - break; - case FilterType::DISCRETE_TRANSFER: - switch (aIndex) { - CONVERT_PROP(DISCRETE_TRANSFER_DISABLE_R, - DISCRETETRANSFER_PROP_RED_DISABLE); - CONVERT_PROP(DISCRETE_TRANSFER_DISABLE_G, - DISCRETETRANSFER_PROP_GREEN_DISABLE); - CONVERT_PROP(DISCRETE_TRANSFER_DISABLE_B, - DISCRETETRANSFER_PROP_BLUE_DISABLE); - CONVERT_PROP(DISCRETE_TRANSFER_DISABLE_A, - DISCRETETRANSFER_PROP_ALPHA_DISABLE); - CONVERT_PROP(DISCRETE_TRANSFER_TABLE_R, - DISCRETETRANSFER_PROP_RED_TABLE); - CONVERT_PROP(DISCRETE_TRANSFER_TABLE_G, - DISCRETETRANSFER_PROP_GREEN_TABLE); - CONVERT_PROP(DISCRETE_TRANSFER_TABLE_B, - DISCRETETRANSFER_PROP_BLUE_TABLE); - CONVERT_PROP(DISCRETE_TRANSFER_TABLE_A, - DISCRETETRANSFER_PROP_ALPHA_TABLE); - } - break; - case FilterType::LINEAR_TRANSFER: - switch (aIndex) { - CONVERT_PROP(LINEAR_TRANSFER_DISABLE_R, - LINEARTRANSFER_PROP_RED_DISABLE); - CONVERT_PROP(LINEAR_TRANSFER_DISABLE_G, - LINEARTRANSFER_PROP_GREEN_DISABLE); - CONVERT_PROP(LINEAR_TRANSFER_DISABLE_B, - LINEARTRANSFER_PROP_BLUE_DISABLE); - CONVERT_PROP(LINEAR_TRANSFER_DISABLE_A, - LINEARTRANSFER_PROP_ALPHA_DISABLE); - CONVERT_PROP(LINEAR_TRANSFER_INTERCEPT_R, - LINEARTRANSFER_PROP_RED_Y_INTERCEPT); - CONVERT_PROP(LINEAR_TRANSFER_INTERCEPT_G, - LINEARTRANSFER_PROP_GREEN_Y_INTERCEPT); - CONVERT_PROP(LINEAR_TRANSFER_INTERCEPT_B, - LINEARTRANSFER_PROP_BLUE_Y_INTERCEPT); - CONVERT_PROP(LINEAR_TRANSFER_INTERCEPT_A, - LINEARTRANSFER_PROP_ALPHA_Y_INTERCEPT); - CONVERT_PROP(LINEAR_TRANSFER_SLOPE_R, LINEARTRANSFER_PROP_RED_SLOPE); - CONVERT_PROP(LINEAR_TRANSFER_SLOPE_G, LINEARTRANSFER_PROP_GREEN_SLOPE); - CONVERT_PROP(LINEAR_TRANSFER_SLOPE_B, LINEARTRANSFER_PROP_BLUE_SLOPE); - CONVERT_PROP(LINEAR_TRANSFER_SLOPE_A, LINEARTRANSFER_PROP_ALPHA_SLOPE); - } - break; - case FilterType::GAMMA_TRANSFER: - switch (aIndex) { - CONVERT_PROP(GAMMA_TRANSFER_DISABLE_R, GAMMATRANSFER_PROP_RED_DISABLE); - CONVERT_PROP(GAMMA_TRANSFER_DISABLE_G, - GAMMATRANSFER_PROP_GREEN_DISABLE); - CONVERT_PROP(GAMMA_TRANSFER_DISABLE_B, GAMMATRANSFER_PROP_BLUE_DISABLE); - CONVERT_PROP(GAMMA_TRANSFER_DISABLE_A, - GAMMATRANSFER_PROP_ALPHA_DISABLE); - CONVERT_PROP(GAMMA_TRANSFER_AMPLITUDE_R, - GAMMATRANSFER_PROP_RED_AMPLITUDE); - CONVERT_PROP(GAMMA_TRANSFER_AMPLITUDE_G, - GAMMATRANSFER_PROP_GREEN_AMPLITUDE); - CONVERT_PROP(GAMMA_TRANSFER_AMPLITUDE_B, - GAMMATRANSFER_PROP_BLUE_AMPLITUDE); - CONVERT_PROP(GAMMA_TRANSFER_AMPLITUDE_A, - GAMMATRANSFER_PROP_ALPHA_AMPLITUDE); - CONVERT_PROP(GAMMA_TRANSFER_EXPONENT_R, - GAMMATRANSFER_PROP_RED_EXPONENT); - CONVERT_PROP(GAMMA_TRANSFER_EXPONENT_G, - GAMMATRANSFER_PROP_GREEN_EXPONENT); - CONVERT_PROP(GAMMA_TRANSFER_EXPONENT_B, - GAMMATRANSFER_PROP_BLUE_EXPONENT); - CONVERT_PROP(GAMMA_TRANSFER_EXPONENT_A, - GAMMATRANSFER_PROP_ALPHA_EXPONENT); - CONVERT_PROP(GAMMA_TRANSFER_OFFSET_R, GAMMATRANSFER_PROP_RED_OFFSET); - CONVERT_PROP(GAMMA_TRANSFER_OFFSET_G, GAMMATRANSFER_PROP_GREEN_OFFSET); - CONVERT_PROP(GAMMA_TRANSFER_OFFSET_B, GAMMATRANSFER_PROP_BLUE_OFFSET); - CONVERT_PROP(GAMMA_TRANSFER_OFFSET_A, GAMMATRANSFER_PROP_ALPHA_OFFSET); - } - break; - case FilterType::CONVOLVE_MATRIX: - switch (aIndex) { - CONVERT_PROP(CONVOLVE_MATRIX_BIAS, CONVOLVEMATRIX_PROP_BIAS); - CONVERT_PROP(CONVOLVE_MATRIX_KERNEL_MATRIX, - CONVOLVEMATRIX_PROP_KERNEL_MATRIX); - CONVERT_PROP(CONVOLVE_MATRIX_DIVISOR, CONVOLVEMATRIX_PROP_DIVISOR); - CONVERT_PROP(CONVOLVE_MATRIX_KERNEL_UNIT_LENGTH, - CONVOLVEMATRIX_PROP_KERNEL_UNIT_LENGTH); - CONVERT_PROP(CONVOLVE_MATRIX_PRESERVE_ALPHA, - CONVOLVEMATRIX_PROP_PRESERVE_ALPHA); - } - case FilterType::DISPLACEMENT_MAP: - switch (aIndex) { - CONVERT_PROP(DISPLACEMENT_MAP_SCALE, DISPLACEMENTMAP_PROP_SCALE); - CONVERT_PROP(DISPLACEMENT_MAP_X_CHANNEL, - DISPLACEMENTMAP_PROP_X_CHANNEL_SELECT); - CONVERT_PROP(DISPLACEMENT_MAP_Y_CHANNEL, - DISPLACEMENTMAP_PROP_Y_CHANNEL_SELECT); - } - break; - case FilterType::TURBULENCE: - switch (aIndex) { - CONVERT_PROP(TURBULENCE_BASE_FREQUENCY, TURBULENCE_PROP_BASE_FREQUENCY); - CONVERT_PROP(TURBULENCE_NUM_OCTAVES, TURBULENCE_PROP_NUM_OCTAVES); - CONVERT_PROP(TURBULENCE_SEED, TURBULENCE_PROP_SEED); - CONVERT_PROP(TURBULENCE_STITCHABLE, TURBULENCE_PROP_STITCHABLE); - CONVERT_PROP(TURBULENCE_TYPE, TURBULENCE_PROP_NOISE); - } - break; - case FilterType::ARITHMETIC_COMBINE: - switch (aIndex) { - CONVERT_PROP(ARITHMETIC_COMBINE_COEFFICIENTS, - ARITHMETICCOMPOSITE_PROP_COEFFICIENTS); - } - break; - case FilterType::COMPOSITE: - switch (aIndex) { CONVERT_PROP(COMPOSITE_OPERATOR, COMPOSITE_PROP_MODE); } - break; - case FilterType::GAUSSIAN_BLUR: - switch (aIndex) { - CONVERT_PROP(GAUSSIAN_BLUR_STD_DEVIATION, - GAUSSIANBLUR_PROP_STANDARD_DEVIATION); - } - break; - case FilterType::DIRECTIONAL_BLUR: - switch (aIndex) { - CONVERT_PROP(DIRECTIONAL_BLUR_STD_DEVIATION, - DIRECTIONALBLUR_PROP_STANDARD_DEVIATION); - CONVERT_PROP(DIRECTIONAL_BLUR_DIRECTION, DIRECTIONALBLUR_PROP_ANGLE); - } - break; - case FilterType::POINT_DIFFUSE: - switch (aIndex) { - CONVERT_PROP(POINT_DIFFUSE_DIFFUSE_CONSTANT, - POINTDIFFUSE_PROP_DIFFUSE_CONSTANT); - CONVERT_PROP(POINT_DIFFUSE_POSITION, POINTDIFFUSE_PROP_LIGHT_POSITION); - CONVERT_PROP(POINT_DIFFUSE_COLOR, POINTDIFFUSE_PROP_COLOR); - CONVERT_PROP(POINT_DIFFUSE_SURFACE_SCALE, - POINTDIFFUSE_PROP_SURFACE_SCALE); - CONVERT_PROP(POINT_DIFFUSE_KERNEL_UNIT_LENGTH, - POINTDIFFUSE_PROP_KERNEL_UNIT_LENGTH); - } - break; - case FilterType::SPOT_DIFFUSE: - switch (aIndex) { - CONVERT_PROP(SPOT_DIFFUSE_DIFFUSE_CONSTANT, - SPOTDIFFUSE_PROP_DIFFUSE_CONSTANT); - CONVERT_PROP(SPOT_DIFFUSE_POINTS_AT, SPOTDIFFUSE_PROP_POINTS_AT); - CONVERT_PROP(SPOT_DIFFUSE_FOCUS, SPOTDIFFUSE_PROP_FOCUS); - CONVERT_PROP(SPOT_DIFFUSE_LIMITING_CONE_ANGLE, - SPOTDIFFUSE_PROP_LIMITING_CONE_ANGLE); - CONVERT_PROP(SPOT_DIFFUSE_POSITION, SPOTDIFFUSE_PROP_LIGHT_POSITION); - CONVERT_PROP(SPOT_DIFFUSE_COLOR, SPOTDIFFUSE_PROP_COLOR); - CONVERT_PROP(SPOT_DIFFUSE_SURFACE_SCALE, - SPOTDIFFUSE_PROP_SURFACE_SCALE); - CONVERT_PROP(SPOT_DIFFUSE_KERNEL_UNIT_LENGTH, - SPOTDIFFUSE_PROP_KERNEL_UNIT_LENGTH); - } - break; - case FilterType::DISTANT_DIFFUSE: - switch (aIndex) { - CONVERT_PROP(DISTANT_DIFFUSE_DIFFUSE_CONSTANT, - DISTANTDIFFUSE_PROP_DIFFUSE_CONSTANT); - CONVERT_PROP(DISTANT_DIFFUSE_AZIMUTH, DISTANTDIFFUSE_PROP_AZIMUTH); - CONVERT_PROP(DISTANT_DIFFUSE_ELEVATION, DISTANTDIFFUSE_PROP_ELEVATION); - CONVERT_PROP(DISTANT_DIFFUSE_COLOR, DISTANTDIFFUSE_PROP_COLOR); - CONVERT_PROP(DISTANT_DIFFUSE_SURFACE_SCALE, - DISTANTDIFFUSE_PROP_SURFACE_SCALE); - CONVERT_PROP(DISTANT_DIFFUSE_KERNEL_UNIT_LENGTH, - DISTANTDIFFUSE_PROP_KERNEL_UNIT_LENGTH); - } - break; - case FilterType::POINT_SPECULAR: - switch (aIndex) { - CONVERT_PROP(POINT_SPECULAR_SPECULAR_CONSTANT, - POINTSPECULAR_PROP_SPECULAR_CONSTANT); - CONVERT_PROP(POINT_SPECULAR_SPECULAR_EXPONENT, - POINTSPECULAR_PROP_SPECULAR_EXPONENT); - CONVERT_PROP(POINT_SPECULAR_POSITION, - POINTSPECULAR_PROP_LIGHT_POSITION); - CONVERT_PROP(POINT_SPECULAR_COLOR, POINTSPECULAR_PROP_COLOR); - CONVERT_PROP(POINT_SPECULAR_SURFACE_SCALE, - POINTSPECULAR_PROP_SURFACE_SCALE); - CONVERT_PROP(POINT_SPECULAR_KERNEL_UNIT_LENGTH, - POINTSPECULAR_PROP_KERNEL_UNIT_LENGTH); - } - break; - case FilterType::SPOT_SPECULAR: - switch (aIndex) { - CONVERT_PROP(SPOT_SPECULAR_SPECULAR_CONSTANT, - SPOTSPECULAR_PROP_SPECULAR_CONSTANT); - CONVERT_PROP(SPOT_SPECULAR_SPECULAR_EXPONENT, - SPOTSPECULAR_PROP_SPECULAR_EXPONENT); - CONVERT_PROP(SPOT_SPECULAR_POINTS_AT, SPOTSPECULAR_PROP_POINTS_AT); - CONVERT_PROP(SPOT_SPECULAR_FOCUS, SPOTSPECULAR_PROP_FOCUS); - CONVERT_PROP(SPOT_SPECULAR_LIMITING_CONE_ANGLE, - SPOTSPECULAR_PROP_LIMITING_CONE_ANGLE); - CONVERT_PROP(SPOT_SPECULAR_POSITION, SPOTSPECULAR_PROP_LIGHT_POSITION); - CONVERT_PROP(SPOT_SPECULAR_COLOR, SPOTSPECULAR_PROP_COLOR); - CONVERT_PROP(SPOT_SPECULAR_SURFACE_SCALE, - SPOTSPECULAR_PROP_SURFACE_SCALE); - CONVERT_PROP(SPOT_SPECULAR_KERNEL_UNIT_LENGTH, - SPOTSPECULAR_PROP_KERNEL_UNIT_LENGTH); - } - break; - case FilterType::DISTANT_SPECULAR: - switch (aIndex) { - CONVERT_PROP(DISTANT_SPECULAR_SPECULAR_CONSTANT, - DISTANTSPECULAR_PROP_SPECULAR_CONSTANT); - CONVERT_PROP(DISTANT_SPECULAR_SPECULAR_EXPONENT, - DISTANTSPECULAR_PROP_SPECULAR_EXPONENT); - CONVERT_PROP(DISTANT_SPECULAR_AZIMUTH, DISTANTSPECULAR_PROP_AZIMUTH); - CONVERT_PROP(DISTANT_SPECULAR_ELEVATION, - DISTANTSPECULAR_PROP_ELEVATION); - CONVERT_PROP(DISTANT_SPECULAR_COLOR, DISTANTSPECULAR_PROP_COLOR); - CONVERT_PROP(DISTANT_SPECULAR_SURFACE_SCALE, - DISTANTSPECULAR_PROP_SURFACE_SCALE); - CONVERT_PROP(DISTANT_SPECULAR_KERNEL_UNIT_LENGTH, - DISTANTSPECULAR_PROP_KERNEL_UNIT_LENGTH); - } - break; - case FilterType::CROP: - switch (aIndex) { CONVERT_PROP(CROP_RECT, CROP_PROP_RECT); } - break; - default: - break; - } - - return UINT32_MAX; -} - -bool GetD2D1PropsForIntSize(FilterType aType, uint32_t aIndex, - UINT32* aPropWidth, UINT32* aPropHeight) { - switch (aType) { - case FilterType::MORPHOLOGY: - if (aIndex == ATT_MORPHOLOGY_RADII) { - *aPropWidth = D2D1_MORPHOLOGY_PROP_WIDTH; - *aPropHeight = D2D1_MORPHOLOGY_PROP_HEIGHT; - return true; - } - break; - default: - break; - } - return false; -} - -static inline REFCLSID GetCLDIDForFilterType(FilterType aType) { - switch (aType) { - case FilterType::OPACITY: - case FilterType::COLOR_MATRIX: - return CLSID_D2D1ColorMatrix; - case FilterType::TRANSFORM: - return CLSID_D2D12DAffineTransform; - case FilterType::BLEND: - return CLSID_D2D1Blend; - case FilterType::MORPHOLOGY: - return CLSID_D2D1Morphology; - case FilterType::FLOOD: - return CLSID_D2D1Flood; - case FilterType::TILE: - return CLSID_D2D1Tile; - case FilterType::TABLE_TRANSFER: - return CLSID_D2D1TableTransfer; - case FilterType::LINEAR_TRANSFER: - return CLSID_D2D1LinearTransfer; - case FilterType::DISCRETE_TRANSFER: - return CLSID_D2D1DiscreteTransfer; - case FilterType::GAMMA_TRANSFER: - return CLSID_D2D1GammaTransfer; - case FilterType::DISPLACEMENT_MAP: - return CLSID_D2D1DisplacementMap; - case FilterType::TURBULENCE: - return CLSID_D2D1Turbulence; - case FilterType::ARITHMETIC_COMBINE: - return CLSID_D2D1ArithmeticComposite; - case FilterType::COMPOSITE: - return CLSID_D2D1Composite; - case FilterType::CONVOLVE_MATRIX: - return CLSID_D2D1ConvolveMatrix; - case FilterType::GAUSSIAN_BLUR: - return CLSID_D2D1GaussianBlur; - case FilterType::DIRECTIONAL_BLUR: - return CLSID_D2D1DirectionalBlur; - case FilterType::POINT_DIFFUSE: - return CLSID_D2D1PointDiffuse; - case FilterType::POINT_SPECULAR: - return CLSID_D2D1PointSpecular; - case FilterType::SPOT_DIFFUSE: - return CLSID_D2D1SpotDiffuse; - case FilterType::SPOT_SPECULAR: - return CLSID_D2D1SpotSpecular; - case FilterType::DISTANT_DIFFUSE: - return CLSID_D2D1DistantDiffuse; - case FilterType::DISTANT_SPECULAR: - return CLSID_D2D1DistantSpecular; - case FilterType::CROP: - return CLSID_D2D1Crop; - case FilterType::PREMULTIPLY: - return CLSID_D2D1Premultiply; - case FilterType::UNPREMULTIPLY: - return CLSID_D2D1UnPremultiply; - default: - break; - } - return GUID_NULL; -} - -static bool IsTransferFilterType(FilterType aType) { - switch (aType) { - case FilterType::LINEAR_TRANSFER: - case FilterType::GAMMA_TRANSFER: - case FilterType::TABLE_TRANSFER: - case FilterType::DISCRETE_TRANSFER: - return true; - default: - return false; - } -} - -static bool IsDiffuseLightingFilterType(FilterType aType) { - switch (aType) { - case FilterType::POINT_DIFFUSE: - case FilterType::SPOT_DIFFUSE: - case FilterType::DISTANT_DIFFUSE: - return true; - default: - return false; - } -} - -static bool IsSpecularLightingFilterType(FilterType aType) { - switch (aType) { - case FilterType::POINT_SPECULAR: - case FilterType::SPOT_SPECULAR: - case FilterType::DISTANT_SPECULAR: - return true; - default: - return false; - } -} - -static bool IsLightingFilterType(FilterType aType) { - return IsDiffuseLightingFilterType(aType) || - IsSpecularLightingFilterType(aType); -} - -static bool HasUnboundedOutputRegion(FilterType aType) { - if (IsTransferFilterType(aType) || IsLightingFilterType(aType)) { - return true; - } - - return aType == FilterType::COLOR_MATRIX; -} - -/* static */ -already_AddRefed<FilterNode> FilterNodeD2D1::Create(ID2D1DeviceContext* aDC, - FilterType aType) { - if (aType == FilterType::CONVOLVE_MATRIX) { - return MakeAndAddRef<FilterNodeConvolveD2D1>(aDC); - } else if (IsLightingFilterType(aType)) { - return MakeAndAddRef<FilterNodeLightingD2D1>(aDC, aType); - } - - RefPtr<ID2D1Effect> effect; - HRESULT hr; - - hr = aDC->CreateEffect(GetCLDIDForFilterType(aType), getter_AddRefs(effect)); - - if (FAILED(hr) || !effect) { - gfxCriticalErrorOnce() << "Failed to create effect for FilterType: " - << hexa(hr); - return nullptr; - } - - if (aType == FilterType::ARITHMETIC_COMBINE) { - effect->SetValue(D2D1_ARITHMETICCOMPOSITE_PROP_CLAMP_OUTPUT, TRUE); - } - - if (aType == FilterType::OPACITY) { - return MakeAndAddRef<FilterNodeOpacityD2D1>(effect, aType); - } - - RefPtr<FilterNodeD2D1> filter = new FilterNodeD2D1(effect, aType); - - if (HasUnboundedOutputRegion(aType)) { - // These filters can produce non-transparent output from transparent - // input pixels, and we want them to have an unbounded output region. - filter = new FilterNodeExtendInputAdapterD2D1(aDC, filter, aType); - } - - if (IsTransferFilterType(aType)) { - // Component transfer filters should appear to apply on unpremultiplied - // colors, but the D2D1 effects apply on premultiplied colors. - filter = new FilterNodePremultiplyAdapterD2D1(aDC, filter, aType); - } - - return filter.forget(); -} - -void FilterNodeD2D1::InitUnmappedProperties() { - switch (mType) { - case FilterType::COLOR_MATRIX: - mEffect->SetValue(D2D1_COLORMATRIX_PROP_CLAMP_OUTPUT, TRUE); - break; - case FilterType::TRANSFORM: - mEffect->SetValue(D2D1_2DAFFINETRANSFORM_PROP_BORDER_MODE, - D2D1_BORDER_MODE_HARD); - break; - default: - break; - } -} - -void FilterNodeD2D1::SetInput(uint32_t aIndex, SourceSurface* aSurface) { - UINT32 input = GetD2D1InputForInput(mType, aIndex); - ID2D1Effect* effect = InputEffect(); - - if (mType == FilterType::COMPOSITE) { - UINT32 inputCount = effect->GetInputCount(); - - if (aIndex == inputCount - 1 && aSurface == nullptr) { - effect->SetInputCount(inputCount - 1); - } else if (aIndex >= inputCount && aSurface) { - effect->SetInputCount(aIndex + 1); - } - } - - auto inputCount = effect->GetInputCount(); - MOZ_RELEASE_ASSERT(input < inputCount); - - mInputSurfaces.resize(inputCount); - mInputFilters.resize(inputCount); - - // In order to convert aSurface into an ID2D1Image, we need to know what - // DrawTarget we paint into. However, the same FilterNode object can be - // used on different DrawTargets, so we need to hold on to the SourceSurface - // objects and delay the conversion until we're actually painted and know - // our target DrawTarget. - // The conversion happens in WillDraw(). - - mInputSurfaces[input] = aSurface; - mInputFilters[input] = nullptr; - - // Clear the existing image from the effect. - effect->SetInput(input, nullptr); -} - -void FilterNodeD2D1::SetInput(uint32_t aIndex, FilterNode* aFilter) { - UINT32 input = GetD2D1InputForInput(mType, aIndex); - ID2D1Effect* effect = InputEffect(); - - if (mType == FilterType::COMPOSITE) { - UINT32 inputCount = effect->GetInputCount(); - - if (aIndex == inputCount - 1 && aFilter == nullptr) { - effect->SetInputCount(inputCount - 1); - } else if (aIndex >= inputCount && aFilter) { - effect->SetInputCount(aIndex + 1); - } - } - - auto inputCount = effect->GetInputCount(); - MOZ_RELEASE_ASSERT(input < inputCount); - - if (aFilter && aFilter->GetBackendType() != FILTER_BACKEND_DIRECT2D1_1) { - gfxWarning() << "Unknown input FilterNode set on effect."; - MOZ_ASSERT(0); - return; - } - - FilterNodeD2D1* filter = static_cast<FilterNodeD2D1*>(aFilter); - - mInputSurfaces.resize(inputCount); - mInputFilters.resize(inputCount); - - // We hold on to the FilterNode object so that we can call WillDraw() on it. - mInputSurfaces[input] = nullptr; - mInputFilters[input] = filter; - - if (filter) { - effect->SetInputEffect(input, filter->OutputEffect()); - } -} - -void FilterNodeD2D1::WillDraw(DrawTarget* aDT) { - // Convert input SourceSurfaces into ID2D1Images and set them on the effect. - for (size_t inputIndex = 0; inputIndex < mInputSurfaces.size(); - inputIndex++) { - if (mInputSurfaces[inputIndex]) { - ID2D1Effect* effect = InputEffect(); - RefPtr<ID2D1Image> image = - GetImageForSourceSurface(aDT, mInputSurfaces[inputIndex]); - effect->SetInput(inputIndex, image); - } - } - - // Call WillDraw() on our input filters. - for (std::vector<RefPtr<FilterNodeD2D1>>::iterator it = mInputFilters.begin(); - it != mInputFilters.end(); it++) { - if (*it) { - (*it)->WillDraw(aDT); - } - } -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, uint32_t aValue) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - if (mType == FilterType::TURBULENCE && - aIndex == ATT_TURBULENCE_BASE_FREQUENCY) { - mEffect->SetValue(input, D2D1::Vector2F(FLOAT(aValue), FLOAT(aValue))); - return; - } else if (mType == FilterType::DIRECTIONAL_BLUR && - aIndex == ATT_DIRECTIONAL_BLUR_DIRECTION) { - mEffect->SetValue(input, aValue == BLUR_DIRECTION_X ? 0 : 90.0f); - return; - } - - mEffect->SetValue(input, ConvertValue(mType, aIndex, aValue)); -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, Float aValue) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - mEffect->SetValue(input, aValue); -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, const Point& aValue) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - mEffect->SetValue(input, D2DPoint(aValue)); -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, const Matrix5x4& aValue) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - mEffect->SetValue(input, D2DMatrix5x4(aValue)); -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, const Point3D& aValue) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - mEffect->SetValue(input, D2DVector3D(aValue)); -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, const Size& aValue) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - mEffect->SetValue(input, D2D1::Vector2F(aValue.width, aValue.height)); -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, const IntSize& aValue) { - UINT32 widthProp, heightProp; - - if (!GetD2D1PropsForIntSize(mType, aIndex, &widthProp, &heightProp)) { - return; - } - - IntSize value = aValue; - ConvertValue(mType, aIndex, value); - - mEffect->SetValue(widthProp, (UINT)value.width); - mEffect->SetValue(heightProp, (UINT)value.height); -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, const DeviceColor& aValue) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - mEffect->SetValue(input, - D2D1::Vector4F(aValue.r * aValue.a, aValue.g * aValue.a, - aValue.b * aValue.a, aValue.a)); -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, const Rect& aValue) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - mEffect->SetValue(input, D2DRect(aValue)); -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, const IntRect& aValue) { - if (mType == FilterType::TURBULENCE) { - MOZ_ASSERT(aIndex == ATT_TURBULENCE_RECT); - - mEffect->SetValue(D2D1_TURBULENCE_PROP_OFFSET, - D2D1::Vector2F(Float(aValue.X()), Float(aValue.Y()))); - mEffect->SetValue( - D2D1_TURBULENCE_PROP_SIZE, - D2D1::Vector2F(Float(aValue.Width()), Float(aValue.Height()))); - return; - } - - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - mEffect->SetValue(input, - D2D1::RectF(Float(aValue.X()), Float(aValue.Y()), - Float(aValue.XMost()), Float(aValue.YMost()))); -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, bool aValue) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - mEffect->SetValue(input, (BOOL)aValue); -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, const Float* aValues, - uint32_t aSize) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - mEffect->SetValue(input, (BYTE*)aValues, sizeof(Float) * aSize); -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, const IntPoint& aValue) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - mEffect->SetValue(input, D2DPoint(aValue)); -} - -void FilterNodeD2D1::SetAttribute(uint32_t aIndex, const Matrix& aMatrix) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - mEffect->SetValue(input, D2DMatrix(aMatrix)); -} - -void FilterNodeOpacityD2D1::SetAttribute(uint32_t aIndex, Float aValue) { - D2D1_MATRIX_5X4_F matrix = - D2D1::Matrix5x4F(aValue, 0, 0, 0, 0, aValue, 0, 0, 0, 0, aValue, 0, 0, 0, - 0, aValue, 0, 0, 0, 0); - - mEffect->SetValue(D2D1_COLORMATRIX_PROP_COLOR_MATRIX, matrix); - mEffect->SetValue(D2D1_COLORMATRIX_PROP_ALPHA_MODE, - D2D1_COLORMATRIX_ALPHA_MODE_STRAIGHT); -} - -FilterNodeRenderRectD2D1::FilterNodeRenderRectD2D1(ID2D1DeviceContext* aDC, - FilterType aType) - : FilterNodeD2D1(nullptr, aType) { - HRESULT hr; - - hr = aDC->CreateEffect(GetCLDIDForFilterType(aType), getter_AddRefs(mEffect)); - - if (FAILED(hr) || !mEffect) { - gfxWarning() << "Failed to create FilterNodeRenderRectD2D1 filter! " - << static_cast<int>(aType); - return; - } - - hr = aDC->CreateEffect(CLSID_ExtendInputEffect, - getter_AddRefs(mExtendInputEffect)); - - if (FAILED(hr) || !mExtendInputEffect) { - gfxWarning() << "Failed to create FilterNodeRenderRectD2D1 " - << "ExtendInput filter!"; - return; - } - - hr = aDC->CreateEffect(CLSID_D2D1Border, getter_AddRefs(mBorderEffect)); - - if (FAILED(hr) || !mBorderEffect) { - gfxWarning() << "Failed to create FilterNodeRenderRectD2D1 " - << "BorderEffect filter!"; - return; - } - - mBorderEffect->SetInputEffect(0, mExtendInputEffect.get()); -} - -void FilterNodeRenderRectD2D1::SetInput(uint32_t aIndex, FilterNode* aFilter) { - FilterNodeD2D1::SetInput(aIndex, aFilter); - - UpdateChain(); -} - -void FilterNodeRenderRectD2D1::UpdateRenderRect() { - mExtendInputEffect->SetValue( - EXTENDINPUT_PROP_OUTPUT_RECT, - D2D1::Vector4F(Float(mRenderRect.x), Float(mRenderRect.y), - Float(mRenderRect.XMost()), Float(mRenderRect.YMost()))); -} - -void FilterNodeConvolveD2D1::UpdateOffset() { - D2D1_VECTOR_2F vector = D2D1::Vector2F( - (Float(mKernelSize.width) - 1.0f) / 2.0f - Float(mTarget.x), - (Float(mKernelSize.height) - 1.0f) / 2.0f - Float(mTarget.y)); - - mEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_KERNEL_OFFSET, vector); -} - -FilterNodeLightingD2D1::FilterNodeLightingD2D1(ID2D1DeviceContext* aDC, - FilterType aType) - : FilterNodeRenderRectD2D1(aDC, aType) { - // The shape of the filter graph: - // - // input --> extendinput --> border --> mEffect = Lighting - - mEffect->SetInputEffect(0, mBorderEffect.get()); - - mBorderEffect->SetValue(D2D1_BORDER_PROP_EDGE_MODE_X, - D2D1_BORDER_EDGE_MODE_CLAMP); - mBorderEffect->SetValue(D2D1_BORDER_PROP_EDGE_MODE_Y, - D2D1_BORDER_EDGE_MODE_CLAMP); - - UpdateChain(); - UpdateRenderRect(); -} - -ID2D1Effect* FilterNodeLightingD2D1::InputEffect() { - return mExtendInputEffect.get(); -} - -void FilterNodeLightingD2D1::UpdateChain() { - RefPtr<ID2D1Effect> inputEffect; - if (mInputFilters.size() > 0 && mInputFilters[0]) { - inputEffect = mInputFilters[0]->OutputEffect(); - } - - mExtendInputEffect->SetInputEffect(0, inputEffect); -} - -void FilterNodeLightingD2D1::SetAttribute(uint32_t aIndex, Float aValue) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - // Ranges taken from - // https://learn.microsoft.com/en-us/windows/win32/direct2d/diffuse-lighting - // https://learn.microsoft.com/en-us/windows/win32/direct2d/specular-lighting - - if ((mType == FilterType::DISTANT_DIFFUSE && - (aIndex == ATT_DISTANT_DIFFUSE_AZIMUTH || - aIndex == ATT_DISTANT_DIFFUSE_ELEVATION)) || - (mType == FilterType::DISTANT_SPECULAR && - (aIndex == ATT_DISTANT_SPECULAR_AZIMUTH || - aIndex == ATT_DISTANT_SPECULAR_ELEVATION))) { - // D2D requires an angle between 0 and 360. - if (aValue < 0) { - aValue = std::fmod(aValue, 360.f) + 360.f; - } else if (aValue > 360.f) { - aValue = std::fmod(aValue, 360.f); - } - } - - if ((mType == FilterType::SPOT_DIFFUSE && - aIndex == ATT_SPOT_DIFFUSE_LIMITING_CONE_ANGLE) || - (mType == FilterType::SPOT_SPECULAR && - aIndex == ATT_SPOT_SPECULAR_LIMITING_CONE_ANGLE)) { - // On input limitingConeAngle is between -90 and 90, and in practice D2D - // deals with that as desired, but the D2D documentation says the angle - // must be between 0 and 90, so since it doesn't change behavior - // we just conform give D2D an angle between 0 and 90. - if (aValue < 0.f) { - aValue = -aValue; - } - } - - if ((mType == FilterType::SPOT_DIFFUSE && aIndex == ATT_SPOT_DIFFUSE_FOCUS) || - (mType == FilterType::SPOT_SPECULAR && - aIndex == ATT_SPOT_SPECULAR_FOCUS)) { - aValue = std::clamp(aValue, 0.0f, 200.0f); - } - - if (IsDiffuseLightingFilterType(mType) && - aIndex == ATT_DIFFUSE_LIGHTING_DIFFUSE_CONSTANT) { - aValue = std::clamp(aValue, 0.0f, 10000.0f); - } - - if (IsSpecularLightingFilterType(mType)) { - if (aIndex == ATT_SPECULAR_LIGHTING_SPECULAR_CONSTANT) { - aValue = std::clamp(aValue, 0.0f, 10000.0f); - } - if (aIndex == ATT_SPECULAR_LIGHTING_SPECULAR_EXPONENT) { - // In practice this is the SVG valid range anyway so we'd - // never be called with values outside this range. - aValue = std::clamp(aValue, 1.0f, 128.0f); - } - } - - if (aIndex == ATT_LIGHTING_SURFACE_SCALE) { - aValue = std::clamp(aValue, 0.0f, 10000.0f); - } - - mEffect->SetValue(input, aValue); -} - -void FilterNodeLightingD2D1::SetAttribute(uint32_t aIndex, - const IntRect& aValue) { - if (aIndex != ATT_LIGHTING_RENDER_RECT) { - MOZ_ASSERT(false); - return; - } - - mRenderRect = aValue; - - UpdateRenderRect(); -} - -void FilterNodeLightingD2D1::SetAttribute(uint32_t aIndex, - const DeviceColor& aValue) { - UINT32 input = GetD2D1PropForAttribute(mType, aIndex); - MOZ_ASSERT(input < mEffect->GetPropertyCount()); - - mEffect->SetValue(input, D2D1::Vector3F(aValue.r, aValue.g, aValue.b)); -} - -FilterNodeConvolveD2D1::FilterNodeConvolveD2D1(ID2D1DeviceContext* aDC) - : FilterNodeRenderRectD2D1(nullptr, FilterType::CONVOLVE_MATRIX), - mEdgeMode(EDGE_MODE_DUPLICATE) { - mEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_BORDER_MODE, - D2D1_BORDER_MODE_SOFT); - - UpdateChain(); - UpdateRenderRect(); -} - -void FilterNodeConvolveD2D1::SetAttribute(uint32_t aIndex, uint32_t aValue) { - if (aIndex != ATT_CONVOLVE_MATRIX_EDGE_MODE) { - return FilterNodeD2D1::SetAttribute(aIndex, aValue); - } - - mEdgeMode = (ConvolveMatrixEdgeMode)aValue; - - UpdateChain(); -} - -ID2D1Effect* FilterNodeConvolveD2D1::InputEffect() { - return mEdgeMode == EDGE_MODE_NONE ? mEffect.get() : mExtendInputEffect.get(); -} - -void FilterNodeConvolveD2D1::UpdateChain() { - // The shape of the filter graph: - // - // EDGE_MODE_NONE: - // input --> convolvematrix - // - // EDGE_MODE_DUPLICATE or EDGE_MODE_WRAP: - // input --> extendinput --> border --> convolvematrix - // - // mEffect is convolvematrix. - - if (mEdgeMode != EDGE_MODE_NONE) { - mEffect->SetInputEffect(0, mBorderEffect.get()); - } - - RefPtr<ID2D1Effect> inputEffect; - if (mInputFilters.size() > 0 && mInputFilters[0]) { - inputEffect = mInputFilters[0]->OutputEffect(); - } - InputEffect()->SetInputEffect(0, inputEffect); - - if (mEdgeMode == EDGE_MODE_DUPLICATE) { - mBorderEffect->SetValue(D2D1_BORDER_PROP_EDGE_MODE_X, - D2D1_BORDER_EDGE_MODE_CLAMP); - mBorderEffect->SetValue(D2D1_BORDER_PROP_EDGE_MODE_Y, - D2D1_BORDER_EDGE_MODE_CLAMP); - } else if (mEdgeMode == EDGE_MODE_WRAP) { - mBorderEffect->SetValue(D2D1_BORDER_PROP_EDGE_MODE_X, - D2D1_BORDER_EDGE_MODE_WRAP); - mBorderEffect->SetValue(D2D1_BORDER_PROP_EDGE_MODE_Y, - D2D1_BORDER_EDGE_MODE_WRAP); - } -} - -void FilterNodeConvolveD2D1::SetAttribute(uint32_t aIndex, - const IntSize& aValue) { - if (aIndex != ATT_CONVOLVE_MATRIX_KERNEL_SIZE) { - MOZ_ASSERT(false); - return; - } - - mKernelSize = aValue; - - mEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_KERNEL_SIZE_X, aValue.width); - mEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_KERNEL_SIZE_Y, aValue.height); - - UpdateOffset(); -} - -void FilterNodeConvolveD2D1::SetAttribute(uint32_t aIndex, - const IntPoint& aValue) { - if (aIndex != ATT_CONVOLVE_MATRIX_TARGET) { - MOZ_ASSERT(false); - return; - } - - mTarget = aValue; - - UpdateOffset(); -} - -void FilterNodeConvolveD2D1::SetAttribute(uint32_t aIndex, - const IntRect& aValue) { - if (aIndex != ATT_CONVOLVE_MATRIX_RENDER_RECT) { - MOZ_ASSERT(false); - return; - } - - mRenderRect = aValue; - - UpdateRenderRect(); -} - -FilterNodeExtendInputAdapterD2D1::FilterNodeExtendInputAdapterD2D1( - ID2D1DeviceContext* aDC, FilterNodeD2D1* aFilterNode, FilterType aType) - : FilterNodeD2D1(aFilterNode->MainEffect(), aType), - mWrappedFilterNode(aFilterNode) { - // We have an mEffect that looks at the bounds of the input effect, and we - // want mEffect to regard its input as unbounded. So we take the input, - // pipe it through an ExtendInput effect (which has an infinite output rect - // by default), and feed the resulting unbounded composition into mEffect. - - HRESULT hr; - - hr = aDC->CreateEffect(CLSID_ExtendInputEffect, - getter_AddRefs(mExtendInputEffect)); - - if (FAILED(hr) || !mExtendInputEffect) { - gfxWarning() << "Failed to create extend input effect for filter: " - << hexa(hr); - return; - } - - aFilterNode->InputEffect()->SetInputEffect(0, mExtendInputEffect.get()); -} - -FilterNodePremultiplyAdapterD2D1::FilterNodePremultiplyAdapterD2D1( - ID2D1DeviceContext* aDC, FilterNodeD2D1* aFilterNode, FilterType aType) - : FilterNodeD2D1(aFilterNode->MainEffect(), aType) { - // D2D1 component transfer effects do strange things when it comes to - // premultiplication. - // For our purposes we only need the transfer filters to apply straight to - // unpremultiplied source channels and output unpremultiplied results. - // However, the D2D1 effects are designed differently: They can apply to both - // premultiplied and unpremultiplied inputs, and they always premultiply - // their result - at least in those color channels that have not been - // disabled. - // In order to determine whether the input needs to be unpremultiplied as - // part of the transfer, the effect consults the alpha mode metadata of the - // input surface or the input effect. We don't have such a concept in Moz2D, - // and giving Moz2D users different results based on something that cannot be - // influenced through Moz2D APIs seems like a bad idea. - // We solve this by applying a premultiply effect to the input before feeding - // it into the transfer effect. The premultiply effect always premultiplies - // regardless of any alpha mode metadata on inputs, and it always marks its - // output as premultiplied so that the transfer effect will unpremultiply - // consistently. Feeding always-premultiplied input into the transfer effect - // also avoids another problem that would appear when individual color - // channels disable the transfer: In that case, the disabled channels would - // pass through unchanged in their unpremultiplied form and the other - // channels would be premultiplied, giving a mixed result. - // But since we now ensure that the input is premultiplied, disabled channels - // will pass premultiplied values through to the result, which is consistent - // with the enabled channels. - // We also add an unpremultiply effect that postprocesses the result of the - // transfer effect because getting unpremultiplied results from the transfer - // filters is part of the FilterNode API. - HRESULT hr; - - hr = aDC->CreateEffect(CLSID_D2D1Premultiply, - getter_AddRefs(mPrePremultiplyEffect)); - - if (FAILED(hr) || !mPrePremultiplyEffect) { - gfxWarning() << "Failed to create ComponentTransfer filter!"; - return; - } - - hr = aDC->CreateEffect(CLSID_D2D1UnPremultiply, - getter_AddRefs(mPostUnpremultiplyEffect)); - - if (FAILED(hr) || !mPostUnpremultiplyEffect) { - gfxWarning() << "Failed to create ComponentTransfer filter!"; - return; - } - - aFilterNode->InputEffect()->SetInputEffect(0, mPrePremultiplyEffect.get()); - mPostUnpremultiplyEffect->SetInputEffect(0, aFilterNode->OutputEffect()); -} - -} // namespace gfx -} // namespace mozilla diff --git a/gfx/2d/FilterNodeD2D1.h b/gfx/2d/FilterNodeD2D1.h @@ -1,193 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef MOZILLA_GFX_FILTERNODED2D1_H_ -#define MOZILLA_GFX_FILTERNODED2D1_H_ - -#include "2D.h" -#include "Filters.h" -#include <vector> -#include <windows.h> -#include <d2d1_1.h> -#include <cguid.h> - -namespace mozilla { -namespace gfx { - -class FilterNodeD2D1 : public FilterNode { - public: - MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeD2D1, override) - - static already_AddRefed<FilterNode> Create(ID2D1DeviceContext* aDC, - FilterType aType); - - FilterNodeD2D1(ID2D1Effect* aEffect, FilterType aType) - : mEffect(aEffect), mType(aType) { - InitUnmappedProperties(); - } - - virtual FilterBackend GetBackendType() { return FILTER_BACKEND_DIRECT2D1_1; } - - virtual void SetInput(uint32_t aIndex, SourceSurface* aSurface); - virtual void SetInput(uint32_t aIndex, FilterNode* aFilter); - - virtual void SetAttribute(uint32_t aIndex, uint32_t aValue); - virtual void SetAttribute(uint32_t aIndex, Float aValue); - virtual void SetAttribute(uint32_t aIndex, const Point& aValue); - virtual void SetAttribute(uint32_t aIndex, const Matrix5x4& aValue); - virtual void SetAttribute(uint32_t aIndex, const Point3D& aValue); - virtual void SetAttribute(uint32_t aIndex, const Size& aValue); - virtual void SetAttribute(uint32_t aIndex, const IntSize& aValue); - virtual void SetAttribute(uint32_t aIndex, const DeviceColor& aValue); - virtual void SetAttribute(uint32_t aIndex, const Rect& aValue); - virtual void SetAttribute(uint32_t aIndex, const IntRect& aValue); - virtual void SetAttribute(uint32_t aIndex, bool aValue); - virtual void SetAttribute(uint32_t aIndex, const Float* aValues, - uint32_t aSize); - virtual void SetAttribute(uint32_t aIndex, const IntPoint& aValue); - virtual void SetAttribute(uint32_t aIndex, const Matrix& aValue); - - // Called by DrawTarget before it draws our OutputEffect, and recursively - // by the filter nodes that have this filter as one of their inputs. This - // gives us a chance to convert any input surfaces to the target format for - // the DrawTarget that we will draw to. - virtual void WillDraw(DrawTarget* aDT); - - virtual ID2D1Effect* MainEffect() { return mEffect.get(); } - virtual ID2D1Effect* InputEffect() { return mEffect.get(); } - virtual ID2D1Effect* OutputEffect() { return mEffect.get(); } - - protected: - friend class DrawTargetD2D1; - friend class DrawTargetD2D; - - void InitUnmappedProperties(); - - RefPtr<ID2D1Effect> mEffect; - std::vector<RefPtr<FilterNodeD2D1>> mInputFilters; - std::vector<RefPtr<SourceSurface>> mInputSurfaces; - FilterType mType; - - private: - using FilterNode::SetAttribute; - using FilterNode::SetInput; -}; - -// Both ConvolveMatrix and Lighting filters have an interaction of edge mode and -// source rect that is a bit tricky with D2D1 effects. We want the edge mode to -// only apply outside of the render rect. So if our input surface or filter is -// smaller than the render rect, we need to add transparency around it until we -// reach the edges of the render rect, and only then do any repeating or edge -// duplicating. Unfortunately, the border effect does not have a render rect -// attribute - it only looks at the output rect of its input filter or -// surface. So we use our custom ExtendInput effect to adjust the output rect of -// our input. All of this is only necessary when our edge mode is not -// EDGE_MODE_NONE, so we update the filter chain dynamically in UpdateChain(). - -class FilterNodeRenderRectD2D1 : public FilterNodeD2D1 { - public: - MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeRenderRectD2D1, override) - FilterNodeRenderRectD2D1(ID2D1DeviceContext* aDC, FilterType aType); - - void SetInput(uint32_t aIndex, FilterNode* aFilter) override; - - protected: - virtual void UpdateChain() = 0; - void UpdateRenderRect(); - - RefPtr<ID2D1Effect> mExtendInputEffect; - RefPtr<ID2D1Effect> mBorderEffect; - IntRect mRenderRect; -}; - -class FilterNodeLightingD2D1 : public FilterNodeRenderRectD2D1 { - public: - MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeLightingD2D1, override) - FilterNodeLightingD2D1(ID2D1DeviceContext* aDC, FilterType aType); - - void SetAttribute(uint32_t aIndex, const Float aValue) override; - void SetAttribute(uint32_t aIndex, const IntRect& aValue) override; - void SetAttribute(uint32_t aIndex, const DeviceColor& aValue) override; - - ID2D1Effect* InputEffect() override; - - private: - void UpdateChain() override; -}; - -class FilterNodeConvolveD2D1 : public FilterNodeRenderRectD2D1 { - public: - MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeConvolveD2D1, override) - explicit FilterNodeConvolveD2D1(ID2D1DeviceContext* aDC); - - void SetAttribute(uint32_t aIndex, uint32_t aValue) override; - void SetAttribute(uint32_t aIndex, const IntSize& aValue) override; - void SetAttribute(uint32_t aIndex, const IntPoint& aValue) override; - void SetAttribute(uint32_t aIndex, const IntRect& aValue) override; - - ID2D1Effect* InputEffect() override; - - private: - using FilterNode::SetAttribute; - using FilterNode::SetInput; - - void UpdateChain() override; - void UpdateOffset(); - - ConvolveMatrixEdgeMode mEdgeMode; - IntPoint mTarget; - IntSize mKernelSize; -}; - -class FilterNodeOpacityD2D1 : public FilterNodeD2D1 { - public: - MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeOpacityD2D1, override) - FilterNodeOpacityD2D1(ID2D1Effect* aEffect, FilterType aType) - : FilterNodeD2D1(aEffect, aType) {} - - void SetAttribute(uint32_t aIndex, Float aValue) override; -}; - -class FilterNodeExtendInputAdapterD2D1 : public FilterNodeD2D1 { - public: - MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeExtendInputAdapterD2D1, - override) - FilterNodeExtendInputAdapterD2D1(ID2D1DeviceContext* aDC, - FilterNodeD2D1* aFilterNode, - FilterType aType); - - ID2D1Effect* InputEffect() override { return mExtendInputEffect.get(); } - ID2D1Effect* OutputEffect() override { - return mWrappedFilterNode->OutputEffect(); - } - - private: - RefPtr<FilterNodeD2D1> mWrappedFilterNode; - RefPtr<ID2D1Effect> mExtendInputEffect; -}; - -class FilterNodePremultiplyAdapterD2D1 : public FilterNodeD2D1 { - public: - MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodePremultiplyAdapterD2D1, - override) - FilterNodePremultiplyAdapterD2D1(ID2D1DeviceContext* aDC, - FilterNodeD2D1* aFilterNode, - FilterType aType); - - ID2D1Effect* InputEffect() override { return mPrePremultiplyEffect.get(); } - ID2D1Effect* OutputEffect() override { - return mPostUnpremultiplyEffect.get(); - } - - private: - RefPtr<ID2D1Effect> mPrePremultiplyEffect; - RefPtr<ID2D1Effect> mPostUnpremultiplyEffect; -}; - -} // namespace gfx -} // namespace mozilla - -#endif diff --git a/gfx/2d/Filters.h b/gfx/2d/Filters.h @@ -22,7 +22,6 @@ class SourceSurface; enum FilterBackend { FILTER_BACKEND_SOFTWARE = 0, - FILTER_BACKEND_DIRECT2D1_1, FILTER_BACKEND_WEBGL, FILTER_BACKEND_RECORDING, FILTER_BACKEND_CAPTURE diff --git a/gfx/2d/GradientStopsD2D.h b/gfx/2d/GradientStopsD2D.h @@ -1,42 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef MOZILLA_GFX_GRADIENTSTOPSD2D_H_ -#define MOZILLA_GFX_GRADIENTSTOPSD2D_H_ - -#include "2D.h" - -#include <d2d1.h> - -namespace mozilla { -namespace gfx { - -class GradientStopsD2D : public GradientStops { - public: - MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(GradientStopsD2D, override) - - GradientStopsD2D(ID2D1GradientStopCollection* aStopCollection, - ID3D11Device* aDevice) - : mStopCollection(aStopCollection), mDevice(aDevice) {} - - virtual BackendType GetBackendType() const { return BackendType::DIRECT2D; } - - bool IsValid() const final { - return mDevice == Factory::GetDirect3D11Device(); - } - - private: - friend class DrawTargetD2D; - friend class DrawTargetD2D1; - - mutable RefPtr<ID2D1GradientStopCollection> mStopCollection; - RefPtr<ID3D11Device> mDevice; -}; - -} // namespace gfx -} // namespace mozilla - -#endif /* MOZILLA_GFX_GRADIENTSTOPSD2D_H_ */ diff --git a/gfx/2d/HelpersD2D.h b/gfx/2d/HelpersD2D.h @@ -1,980 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef MOZILLA_GFX_HELPERSD2D_H_ -#define MOZILLA_GFX_HELPERSD2D_H_ - -#include <d2d1_1.h> - -#include <vector> - -#include <dwrite.h> -#include <float.h> -#include "2D.h" -#include "Logging.h" -#include "ImageScaling.h" - -#include "ScaledFontDWrite.h" - -#undef min -#undef max - -namespace mozilla { -namespace gfx { - -RefPtr<ID2D1Factory1> D2DFactory(); - -template <typename T> -static inline D2D1_POINT_2F D2DPoint(const T& aPoint) { - return D2D1::Point2F(aPoint.x, aPoint.y); -} - -static inline D2D1_SIZE_U D2DIntSize(const IntSize& aSize) { - return D2D1::SizeU(aSize.width, aSize.height); -} - -template <typename T> -static inline D2D1_RECT_F D2DRect(const T& aRect) { - return D2D1::RectF(aRect.X(), aRect.Y(), aRect.XMost(), aRect.YMost()); -} - -static inline D2D1_ROUNDED_RECT D2DRoundedRect(const RoundedRect& aRect) { - return D2D1::RoundedRect(D2DRect(aRect.rect), - aRect.corners.BottomLeft().width, - aRect.corners.BottomLeft().height); -} - -static inline D2D1_EXTEND_MODE D2DExtend(ExtendMode aExtendMode, Axis aAxis) { - D2D1_EXTEND_MODE extend; - switch (aExtendMode) { - case ExtendMode::REPEAT: - extend = D2D1_EXTEND_MODE_WRAP; - break; - case ExtendMode::REPEAT_X: { - extend = aAxis == Axis::X_AXIS ? D2D1_EXTEND_MODE_WRAP - : D2D1_EXTEND_MODE_CLAMP; - break; - } - case ExtendMode::REPEAT_Y: { - extend = aAxis == Axis::Y_AXIS ? D2D1_EXTEND_MODE_WRAP - : D2D1_EXTEND_MODE_CLAMP; - break; - } - case ExtendMode::REFLECT: - extend = D2D1_EXTEND_MODE_MIRROR; - break; - default: - extend = D2D1_EXTEND_MODE_CLAMP; - } - - return extend; -} - -static inline D2D1_BITMAP_INTERPOLATION_MODE D2DFilter( - const SamplingFilter aSamplingFilter) { - switch (aSamplingFilter) { - case SamplingFilter::POINT: - return D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR; - default: - return D2D1_BITMAP_INTERPOLATION_MODE_LINEAR; - } -} - -static inline D2D1_INTERPOLATION_MODE D2DInterpolationMode( - const SamplingFilter aSamplingFilter) { - switch (aSamplingFilter) { - case SamplingFilter::POINT: - return D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR; - default: - return D2D1_INTERPOLATION_MODE_LINEAR; - } -} - -static inline D2D1_MATRIX_5X4_F D2DMatrix5x4(const Matrix5x4& aMatrix) { - return D2D1::Matrix5x4F(aMatrix._11, aMatrix._12, aMatrix._13, aMatrix._14, - aMatrix._21, aMatrix._22, aMatrix._23, aMatrix._24, - aMatrix._31, aMatrix._32, aMatrix._33, aMatrix._34, - aMatrix._41, aMatrix._42, aMatrix._43, aMatrix._44, - aMatrix._51, aMatrix._52, aMatrix._53, aMatrix._54); -} - -static inline D2D1_VECTOR_3F D2DVector3D(const Point3D& aPoint) { - return D2D1::Vector3F(aPoint.x, aPoint.y, aPoint.z); -} - -static inline D2D1_ANTIALIAS_MODE D2DAAMode(AntialiasMode aMode) { - switch (aMode) { - case AntialiasMode::NONE: - return D2D1_ANTIALIAS_MODE_ALIASED; - default: - return D2D1_ANTIALIAS_MODE_PER_PRIMITIVE; - } -} - -static inline D2D1_MATRIX_3X2_F D2DMatrix(const Matrix& aTransform) { - return D2D1::Matrix3x2F(aTransform._11, aTransform._12, aTransform._21, - aTransform._22, aTransform._31, aTransform._32); -} - -static inline D2D1_COLOR_F D2DColor(const DeviceColor& aColor) { - return D2D1::ColorF(aColor.r, aColor.g, aColor.b, aColor.a); -} - -static inline IntSize ToIntSize(const D2D1_SIZE_U& aSize) { - return IntSize(aSize.width, aSize.height); -} - -static inline SurfaceFormat ToPixelFormat(const DXGI_FORMAT& aFormat) { - switch (aFormat) { - case DXGI_FORMAT_A8_UNORM: - case DXGI_FORMAT_R8_UNORM: - return SurfaceFormat::A8; - default: - return SurfaceFormat::B8G8R8A8; - } -} - -static inline SurfaceFormat ToPixelFormat(const D2D1_PIXEL_FORMAT& aFormat) { - switch (aFormat.format) { - case DXGI_FORMAT_A8_UNORM: - case DXGI_FORMAT_R8_UNORM: - return SurfaceFormat::A8; - case DXGI_FORMAT_B8G8R8A8_UNORM: - if (aFormat.alphaMode == D2D1_ALPHA_MODE_IGNORE) { - return SurfaceFormat::B8G8R8X8; - } else { - return SurfaceFormat::B8G8R8A8; - } - default: - return SurfaceFormat::B8G8R8A8; - } -} - -static inline Rect ToRect(const D2D1_RECT_F& aRect) { - return Rect(aRect.left, aRect.top, aRect.right - aRect.left, - aRect.bottom - aRect.top); -} - -static inline Matrix ToMatrix(const D2D1_MATRIX_3X2_F& aTransform) { - return Matrix(aTransform._11, aTransform._12, aTransform._21, aTransform._22, - aTransform._31, aTransform._32); -} - -static inline Point ToPoint(const D2D1_POINT_2F& aPoint) { - return Point(aPoint.x, aPoint.y); -} - -static inline DXGI_FORMAT DXGIFormat(SurfaceFormat aFormat) { - switch (aFormat) { - case SurfaceFormat::B8G8R8A8: - return DXGI_FORMAT_B8G8R8A8_UNORM; - case SurfaceFormat::B8G8R8X8: - return DXGI_FORMAT_B8G8R8A8_UNORM; - case SurfaceFormat::A8: - return DXGI_FORMAT_A8_UNORM; - default: - return DXGI_FORMAT_UNKNOWN; - } -} - -static inline D2D1_ALPHA_MODE D2DAlphaModeForFormat(SurfaceFormat aFormat) { - switch (aFormat) { - case SurfaceFormat::B8G8R8X8: - return D2D1_ALPHA_MODE_IGNORE; - default: - return D2D1_ALPHA_MODE_PREMULTIPLIED; - } -} - -static inline D2D1_PIXEL_FORMAT D2DPixelFormat(SurfaceFormat aFormat) { - return D2D1::PixelFormat(DXGIFormat(aFormat), D2DAlphaModeForFormat(aFormat)); -} - -static inline bool D2DSupportsCompositeMode(CompositionOp aOp) { - switch (aOp) { - case CompositionOp::OP_OVER: - case CompositionOp::OP_ADD: - case CompositionOp::OP_ATOP: - case CompositionOp::OP_OUT: - case CompositionOp::OP_IN: - case CompositionOp::OP_SOURCE: - case CompositionOp::OP_DEST_IN: - case CompositionOp::OP_DEST_OUT: - case CompositionOp::OP_DEST_OVER: - case CompositionOp::OP_DEST_ATOP: - case CompositionOp::OP_XOR: - case CompositionOp::OP_CLEAR: - return true; - default: - return false; - } -} - -static inline D2D1_COMPOSITE_MODE D2DCompositionMode(CompositionOp aOp) { - switch (aOp) { - case CompositionOp::OP_OVER: - return D2D1_COMPOSITE_MODE_SOURCE_OVER; - case CompositionOp::OP_ADD: - return D2D1_COMPOSITE_MODE_PLUS; - case CompositionOp::OP_ATOP: - return D2D1_COMPOSITE_MODE_SOURCE_ATOP; - case CompositionOp::OP_OUT: - return D2D1_COMPOSITE_MODE_SOURCE_OUT; - case CompositionOp::OP_IN: - return D2D1_COMPOSITE_MODE_SOURCE_IN; - case CompositionOp::OP_SOURCE: - return D2D1_COMPOSITE_MODE_SOURCE_COPY; - case CompositionOp::OP_DEST_IN: - return D2D1_COMPOSITE_MODE_DESTINATION_IN; - case CompositionOp::OP_DEST_OUT: - return D2D1_COMPOSITE_MODE_DESTINATION_OUT; - case CompositionOp::OP_DEST_OVER: - return D2D1_COMPOSITE_MODE_DESTINATION_OVER; - case CompositionOp::OP_DEST_ATOP: - return D2D1_COMPOSITE_MODE_DESTINATION_ATOP; - case CompositionOp::OP_XOR: - return D2D1_COMPOSITE_MODE_XOR; - case CompositionOp::OP_CLEAR: - return D2D1_COMPOSITE_MODE_DESTINATION_OUT; - default: - return D2D1_COMPOSITE_MODE_SOURCE_OVER; - } -} - -static inline D2D1_BLEND_MODE D2DBlendMode(CompositionOp aOp) { - switch (aOp) { - case CompositionOp::OP_MULTIPLY: - return D2D1_BLEND_MODE_MULTIPLY; - case CompositionOp::OP_SCREEN: - return D2D1_BLEND_MODE_SCREEN; - case CompositionOp::OP_OVERLAY: - return D2D1_BLEND_MODE_OVERLAY; - case CompositionOp::OP_DARKEN: - return D2D1_BLEND_MODE_DARKEN; - case CompositionOp::OP_LIGHTEN: - return D2D1_BLEND_MODE_LIGHTEN; - case CompositionOp::OP_COLOR_DODGE: - return D2D1_BLEND_MODE_COLOR_DODGE; - case CompositionOp::OP_COLOR_BURN: - return D2D1_BLEND_MODE_COLOR_BURN; - case CompositionOp::OP_HARD_LIGHT: - return D2D1_BLEND_MODE_HARD_LIGHT; - case CompositionOp::OP_SOFT_LIGHT: - return D2D1_BLEND_MODE_SOFT_LIGHT; - case CompositionOp::OP_DIFFERENCE: - return D2D1_BLEND_MODE_DIFFERENCE; - case CompositionOp::OP_EXCLUSION: - return D2D1_BLEND_MODE_EXCLUSION; - case CompositionOp::OP_HUE: - return D2D1_BLEND_MODE_HUE; - case CompositionOp::OP_SATURATION: - return D2D1_BLEND_MODE_SATURATION; - case CompositionOp::OP_COLOR: - return D2D1_BLEND_MODE_COLOR; - case CompositionOp::OP_LUMINOSITY: - return D2D1_BLEND_MODE_LUMINOSITY; - default: - return D2D1_BLEND_MODE_MULTIPLY; - } -} - -static inline bool D2DSupportsPrimitiveBlendMode(CompositionOp aOp) { - switch (aOp) { - case CompositionOp::OP_OVER: - // case CompositionOp::OP_SOURCE: - // case CompositionOp::OP_DARKEN: - case CompositionOp::OP_ADD: - return true; - default: - return false; - } -} - -static inline D2D1_PRIMITIVE_BLEND D2DPrimitiveBlendMode(CompositionOp aOp) { - switch (aOp) { - case CompositionOp::OP_OVER: - return D2D1_PRIMITIVE_BLEND_SOURCE_OVER; - // D2D1_PRIMITIVE_BLEND_COPY should leave pixels out of the source's - // bounds unchanged, but doesn't- breaking unbounded ops. - // D2D1_PRIMITIVE_BLEND_MIN doesn't quite work like darken either, as it - // accounts for the source alpha. - // - // case CompositionOp::OP_SOURCE: - // return D2D1_PRIMITIVE_BLEND_COPY; - // case CompositionOp::OP_DARKEN: - // return D2D1_PRIMITIVE_BLEND_MIN; - case CompositionOp::OP_ADD: - return D2D1_PRIMITIVE_BLEND_ADD; - default: - return D2D1_PRIMITIVE_BLEND_SOURCE_OVER; - } -} - -static inline bool IsPatternSupportedByD2D( - const Pattern& aPattern, CompositionOp aOp = CompositionOp::OP_OVER) { - if (aOp == CompositionOp::OP_CLEAR) { - return true; - } - - if (aPattern.GetType() == PatternType::CONIC_GRADIENT) { - return false; - } - - if (aPattern.GetType() != PatternType::RADIAL_GRADIENT) { - return true; - } - - const RadialGradientPattern* pat = - static_cast<const RadialGradientPattern*>(&aPattern); - - if (pat->mRadius1 != 0) { - return false; - } - - Point diff = pat->mCenter2 - pat->mCenter1; - - if (sqrt(diff.x.value * diff.x.value + diff.y.value * diff.y.value) >= - pat->mRadius2) { - // Inner point lies outside the circle. - return false; - } - - return true; -} - -/** - * This structure is used to pass rectangles to our shader constant. We can use - * this for passing rectangular areas to SetVertexShaderConstant. In the format - * of a 4 component float(x,y,width,height). Our vertex shader can then use - * this to construct rectangular positions from the 0,0-1,1 quad that we source - * it with. - */ -struct ShaderConstantRectD3D10 { - float mX, mY, mWidth, mHeight; - ShaderConstantRectD3D10(float aX, float aY, float aWidth, float aHeight) - : mX(aX), mY(aY), mWidth(aWidth), mHeight(aHeight) {} - - // For easy passing to SetVertexShaderConstantF. - operator float*() { return &mX; } -}; - -static inline DWRITE_MATRIX DWriteMatrixFromMatrix(Matrix& aMatrix) { - DWRITE_MATRIX mat; - mat.m11 = aMatrix._11; - mat.m12 = aMatrix._12; - mat.m21 = aMatrix._21; - mat.m22 = aMatrix._22; - mat.dx = aMatrix._31; - mat.dy = aMatrix._32; - return mat; -} - -class AutoDWriteGlyphRun : public DWRITE_GLYPH_RUN { - static const unsigned kNumAutoGlyphs = 256; - - public: - AutoDWriteGlyphRun() { glyphCount = 0; } - - ~AutoDWriteGlyphRun() { - if (glyphCount > kNumAutoGlyphs) { - delete[] glyphIndices; - delete[] glyphAdvances; - delete[] glyphOffsets; - } - } - - void allocate(unsigned aNumGlyphs) { - glyphCount = aNumGlyphs; - if (aNumGlyphs <= kNumAutoGlyphs) { - glyphIndices = &mAutoIndices[0]; - glyphAdvances = &mAutoAdvances[0]; - glyphOffsets = &mAutoOffsets[0]; - } else { - glyphIndices = new UINT16[aNumGlyphs]; - glyphAdvances = new FLOAT[aNumGlyphs]; - glyphOffsets = new DWRITE_GLYPH_OFFSET[aNumGlyphs]; - } - } - - private: - DWRITE_GLYPH_OFFSET mAutoOffsets[kNumAutoGlyphs]; - FLOAT mAutoAdvances[kNumAutoGlyphs]; - UINT16 mAutoIndices[kNumAutoGlyphs]; -}; - -static inline void DWriteGlyphRunFromGlyphs(const GlyphBuffer& aGlyphs, - ScaledFontDWrite* aFont, - AutoDWriteGlyphRun* run) { - run->allocate(aGlyphs.mNumGlyphs); - - FLOAT* advances = const_cast<FLOAT*>(run->glyphAdvances); - UINT16* indices = const_cast<UINT16*>(run->glyphIndices); - DWRITE_GLYPH_OFFSET* offsets = - const_cast<DWRITE_GLYPH_OFFSET*>(run->glyphOffsets); - - memset(advances, 0, sizeof(FLOAT) * aGlyphs.mNumGlyphs); - for (unsigned int i = 0; i < aGlyphs.mNumGlyphs; i++) { - indices[i] = aGlyphs.mGlyphs[i].mIndex; - offsets[i].advanceOffset = aGlyphs.mGlyphs[i].mPosition.x; - offsets[i].ascenderOffset = -aGlyphs.mGlyphs[i].mPosition.y; - } - - run->bidiLevel = 0; - run->fontFace = aFont->mFontFace; - run->fontEmSize = aFont->GetSize(); - run->glyphCount = aGlyphs.mNumGlyphs; - run->isSideways = FALSE; -} - -static inline already_AddRefed<ID2D1Geometry> ConvertRectToGeometry( - const D2D1_RECT_F& aRect) { - RefPtr<ID2D1RectangleGeometry> rectGeom; - D2DFactory()->CreateRectangleGeometry(&aRect, getter_AddRefs(rectGeom)); - return rectGeom.forget(); -} - -static inline already_AddRefed<ID2D1Geometry> GetTransformedGeometry( - ID2D1Geometry* aGeometry, const D2D1_MATRIX_3X2_F& aTransform) { - RefPtr<ID2D1PathGeometry> tmpGeometry; - D2DFactory()->CreatePathGeometry(getter_AddRefs(tmpGeometry)); - RefPtr<ID2D1GeometrySink> currentSink; - tmpGeometry->Open(getter_AddRefs(currentSink)); - aGeometry->Simplify(D2D1_GEOMETRY_SIMPLIFICATION_OPTION_CUBICS_AND_LINES, - aTransform, currentSink); - currentSink->Close(); - return tmpGeometry.forget(); -} - -static inline already_AddRefed<ID2D1Geometry> IntersectGeometry( - ID2D1Geometry* aGeometryA, ID2D1Geometry* aGeometryB) { - RefPtr<ID2D1PathGeometry> pathGeom; - D2DFactory()->CreatePathGeometry(getter_AddRefs(pathGeom)); - RefPtr<ID2D1GeometrySink> sink; - pathGeom->Open(getter_AddRefs(sink)); - aGeometryA->CombineWithGeometry(aGeometryB, D2D1_COMBINE_MODE_INTERSECT, - nullptr, sink); - sink->Close(); - - return pathGeom.forget(); -} - -static inline already_AddRefed<ID2D1StrokeStyle> CreateStrokeStyleForOptions( - const StrokeOptions& aStrokeOptions) { - RefPtr<ID2D1StrokeStyle> style; - - D2D1_CAP_STYLE capStyle; - D2D1_LINE_JOIN joinStyle; - - switch (aStrokeOptions.mLineCap) { - case CapStyle::BUTT: - capStyle = D2D1_CAP_STYLE_FLAT; - break; - case CapStyle::ROUND: - capStyle = D2D1_CAP_STYLE_ROUND; - break; - case CapStyle::SQUARE: - capStyle = D2D1_CAP_STYLE_SQUARE; - break; - } - - switch (aStrokeOptions.mLineJoin) { - case JoinStyle::MITER: - joinStyle = D2D1_LINE_JOIN_MITER; - break; - case JoinStyle::MITER_OR_BEVEL: - joinStyle = D2D1_LINE_JOIN_MITER_OR_BEVEL; - break; - case JoinStyle::ROUND: - joinStyle = D2D1_LINE_JOIN_ROUND; - break; - case JoinStyle::BEVEL: - joinStyle = D2D1_LINE_JOIN_BEVEL; - break; - } - - HRESULT hr; - // We need to check mDashLength in addition to mDashPattern here since if - // mDashPattern is set but mDashLength is zero then the stroke will fail to - // paint. - if (aStrokeOptions.mDashLength > 0 && aStrokeOptions.mDashPattern) { - typedef std::vector<Float> FloatVector; - // D2D "helpfully" multiplies the dash pattern by the line width. - // That's not what cairo does, or is what <canvas>'s dash wants. - // So fix the multiplication in advance. - Float lineWidth = aStrokeOptions.mLineWidth; - FloatVector dash(aStrokeOptions.mDashPattern, - aStrokeOptions.mDashPattern + aStrokeOptions.mDashLength); - for (FloatVector::iterator it = dash.begin(); it != dash.end(); ++it) { - *it /= lineWidth; - } - - hr = D2DFactory()->CreateStrokeStyle( - D2D1::StrokeStyleProperties( - capStyle, capStyle, capStyle, joinStyle, aStrokeOptions.mMiterLimit, - D2D1_DASH_STYLE_CUSTOM, aStrokeOptions.mDashOffset / lineWidth), - &dash[0], // data() is not C++98, although it's in recent gcc - // and VC10's STL - dash.size(), getter_AddRefs(style)); - } else { - hr = D2DFactory()->CreateStrokeStyle( - D2D1::StrokeStyleProperties(capStyle, capStyle, capStyle, joinStyle, - aStrokeOptions.mMiterLimit), - nullptr, 0, getter_AddRefs(style)); - } - - if (FAILED(hr)) { - gfxWarning() << "Failed to create Direct2D stroke style."; - } - - return style.forget(); -} - -// This creates a (partially) uploaded bitmap for a DataSourceSurface. It -// uploads the minimum requirement and possibly downscales. It adjusts the -// input Matrix to compensate. -static inline already_AddRefed<ID2D1Bitmap> CreatePartialBitmapForSurface( - DataSourceSurface* aSurface, const Matrix& aDestinationTransform, - const IntSize& aDestinationSize, ExtendMode aExtendMode, - Matrix& aSourceTransform, ID2D1RenderTarget* aRT, - const IntRect* aSourceRect = nullptr) { - RefPtr<ID2D1Bitmap> bitmap; - - // This is where things get complicated. The source surface was - // created for a surface that was too large to fit in a texture. - // We'll need to figure out if we can work with a partial upload - // or downsample in software. - - Matrix transform = aDestinationTransform; - Matrix invTransform = transform = aSourceTransform * transform; - if (!invTransform.Invert()) { - // Singular transform, nothing to be drawn. - return nullptr; - } - - Rect rect(0, 0, Float(aDestinationSize.width), - Float(aDestinationSize.height)); - - // Calculate the rectangle of the source mapped to our surface. - rect = invTransform.TransformBounds(rect); - rect.RoundOut(); - - IntSize size = aSurface->GetSize(); - - Rect uploadRect(0, 0, Float(size.width), Float(size.height)); - if (aSourceRect) { - uploadRect = Rect(aSourceRect->X(), aSourceRect->Y(), aSourceRect->Width(), - aSourceRect->Height()); - } - - // Limit the uploadRect as much as possible without supporting discontiguous - // uploads - // - // clang-format off - // region we will paint from - // uploadRect - // .---------------. .---------------. resulting uploadRect - // | |rect | | - // | .---------. .----. .----. .---------------. - // | | | ----> | | | | ----> | | - // | '---------' '----' '----' '---------------' - // '---------------' '---------------' - // clang-format on - // - // - - int Bpp = BytesPerPixel(aSurface->GetFormat()); - - if (uploadRect.Contains(rect)) { - // Extend mode is irrelevant, the displayed rect is completely contained - // by the source bitmap. - uploadRect = rect; - } else if (aExtendMode == ExtendMode::CLAMP && uploadRect.Intersects(rect)) { - // Calculate the rectangle on the source bitmap that touches our - // surface, and upload that, for ExtendMode::CLAMP we can actually guarantee - // correct behaviour in this case. - uploadRect = uploadRect.Intersect(rect); - - // We now proceed to check if we can limit at least one dimension of the - // upload rect safely without looking at extend mode. - } else if (rect.X() >= 0 && rect.XMost() < size.width) { - uploadRect.MoveToX(rect.X()); - uploadRect.SetWidth(rect.Width()); - } else if (rect.Y() >= 0 && rect.YMost() < size.height) { - uploadRect.MoveToY(rect.Y()); - uploadRect.SetHeight(rect.Height()); - } - - if (uploadRect.IsEmpty()) { - // Nothing to be drawn. - return nullptr; - } - - if (uploadRect.Width() <= aRT->GetMaximumBitmapSize() && - uploadRect.Height() <= aRT->GetMaximumBitmapSize()) { - { - // Scope to auto-Unmap() |mapping|. - DataSourceSurface::ScopedMap mapping(aSurface, DataSourceSurface::READ); - if (MOZ2D_WARN_IF(!mapping.IsMapped())) { - return nullptr; - } - - // A partial upload will suffice. - aRT->CreateBitmap( - D2D1::SizeU(uint32_t(uploadRect.Width()), - uint32_t(uploadRect.Height())), - mapping.GetData() + int(uploadRect.X()) * Bpp + - int(uploadRect.Y()) * mapping.GetStride(), - mapping.GetStride(), - D2D1::BitmapProperties(D2DPixelFormat(aSurface->GetFormat())), - getter_AddRefs(bitmap)); - } - - aSourceTransform.PreTranslate(uploadRect.X(), uploadRect.Y()); - - return bitmap.forget(); - } else { - if (Bpp != 4) { - // This shouldn't actually happen in practice! - MOZ_ASSERT(false); - return nullptr; - } - - { - // Scope to auto-Unmap() |mapping|. - DataSourceSurface::ScopedMap mapping(aSurface, DataSourceSurface::READ); - if (MOZ2D_WARN_IF(!mapping.IsMapped())) { - return nullptr; - } - ImageHalfScaler scaler(mapping.GetData(), mapping.GetStride(), size); - - // Calculate the maximum width/height of the image post transform. - Point topRight = transform.TransformPoint(Point(Float(size.width), 0)); - Point topLeft = transform.TransformPoint(Point(0, 0)); - Point bottomRight = transform.TransformPoint( - Point(Float(size.width), Float(size.height))); - Point bottomLeft = transform.TransformPoint(Point(0, Float(size.height))); - - IntSize scaleSize; - - scaleSize.width = int32_t(std::max(Distance(topRight, topLeft), - Distance(bottomRight, bottomLeft))); - scaleSize.height = int32_t(std::max(Distance(topRight, bottomRight), - Distance(topLeft, bottomLeft))); - - if (unsigned(scaleSize.width) > aRT->GetMaximumBitmapSize()) { - // Ok, in this case we'd really want a downscale of a part of the - // bitmap, perhaps we can do this later but for simplicity let's do - // something different here and assume it's good enough, this should be - // rare! - scaleSize.width = 4095; - } - if (unsigned(scaleSize.height) > aRT->GetMaximumBitmapSize()) { - scaleSize.height = 4095; - } - - scaler.ScaleForSize(scaleSize); - - IntSize newSize = scaler.GetSize(); - - if (newSize.IsEmpty()) { - return nullptr; - } - - aRT->CreateBitmap( - D2D1::SizeU(newSize.width, newSize.height), scaler.GetScaledData(), - scaler.GetStride(), - D2D1::BitmapProperties(D2DPixelFormat(aSurface->GetFormat())), - getter_AddRefs(bitmap)); - - aSourceTransform.PreScale(Float(size.width) / newSize.width, - Float(size.height) / newSize.height); - } - return bitmap.forget(); - } -} - -static inline void AddRectToSink(ID2D1GeometrySink* aSink, - const D2D1_RECT_F& aRect) { - aSink->BeginFigure(D2D1::Point2F(aRect.left, aRect.top), - D2D1_FIGURE_BEGIN_FILLED); - aSink->AddLine(D2D1::Point2F(aRect.right, aRect.top)); - aSink->AddLine(D2D1::Point2F(aRect.right, aRect.bottom)); - aSink->AddLine(D2D1::Point2F(aRect.left, aRect.bottom)); - aSink->EndFigure(D2D1_FIGURE_END_CLOSED); -} - -class DCCommandSink : public ID2D1CommandSink { - public: - explicit DCCommandSink(ID2D1DeviceContext* aCtx) : mCtx(aCtx) {} - - HRESULT STDMETHODCALLTYPE QueryInterface(const IID& aIID, void** aPtr) { - if (!aPtr) { - return E_POINTER; - } - - if (aIID == IID_IUnknown) { - *aPtr = static_cast<IUnknown*>(this); - return S_OK; - } else if (aIID == IID_ID2D1CommandSink) { - *aPtr = static_cast<ID2D1CommandSink*>(this); - return S_OK; - } - - return E_NOINTERFACE; - } - - ULONG STDMETHODCALLTYPE AddRef() { return 1; } - - ULONG STDMETHODCALLTYPE Release() { return 1; } - - STDMETHODIMP BeginDraw() { - // We don't want to do anything here! - return S_OK; - } - STDMETHODIMP EndDraw() { - // We don't want to do anything here! - return S_OK; - } - - STDMETHODIMP SetAntialiasMode(D2D1_ANTIALIAS_MODE antialiasMode) { - mCtx->SetAntialiasMode(antialiasMode); - return S_OK; - } - - STDMETHODIMP SetTags(D2D1_TAG tag1, D2D1_TAG tag2) { - mCtx->SetTags(tag1, tag2); - return S_OK; - } - - STDMETHODIMP SetTextAntialiasMode( - D2D1_TEXT_ANTIALIAS_MODE textAntialiasMode) { - mCtx->SetTextAntialiasMode(textAntialiasMode); - return S_OK; - } - - STDMETHODIMP SetTextRenderingParams( - _In_opt_ IDWriteRenderingParams* textRenderingParams) { - mCtx->SetTextRenderingParams(textRenderingParams); - return S_OK; - } - - STDMETHODIMP SetTransform(_In_ CONST D2D1_MATRIX_3X2_F* transform) { - mCtx->SetTransform(transform); - return S_OK; - } - - STDMETHODIMP SetPrimitiveBlend(D2D1_PRIMITIVE_BLEND primitiveBlend) { - mCtx->SetPrimitiveBlend(primitiveBlend); - return S_OK; - } - - STDMETHODIMP SetUnitMode(D2D1_UNIT_MODE unitMode) { - mCtx->SetUnitMode(unitMode); - return S_OK; - } - - STDMETHODIMP Clear(_In_opt_ CONST D2D1_COLOR_F* color) { - mCtx->Clear(color); - return S_OK; - } - - STDMETHODIMP DrawGlyphRun( - D2D1_POINT_2F baselineOrigin, _In_ CONST DWRITE_GLYPH_RUN* glyphRun, - _In_opt_ CONST DWRITE_GLYPH_RUN_DESCRIPTION* glyphRunDescription, - _In_ ID2D1Brush* foregroundBrush, DWRITE_MEASURING_MODE measuringMode) { - mCtx->DrawGlyphRun(baselineOrigin, glyphRun, glyphRunDescription, - foregroundBrush, measuringMode); - return S_OK; - } - - STDMETHODIMP DrawLine(D2D1_POINT_2F point0, D2D1_POINT_2F point1, - _In_ ID2D1Brush* brush, FLOAT strokeWidth, - _In_opt_ ID2D1StrokeStyle* strokeStyle) { - mCtx->DrawLine(point0, point1, brush, strokeWidth, strokeStyle); - return S_OK; - } - - STDMETHODIMP DrawGeometry(_In_ ID2D1Geometry* geometry, - _In_ ID2D1Brush* brush, FLOAT strokeWidth, - _In_opt_ ID2D1StrokeStyle* strokeStyle) { - mCtx->DrawGeometry(geometry, brush, strokeWidth, strokeStyle); - return S_OK; - } - - STDMETHODIMP DrawRectangle(_In_ CONST D2D1_RECT_F* rect, - _In_ ID2D1Brush* brush, FLOAT strokeWidth, - _In_opt_ ID2D1StrokeStyle* strokeStyle) { - mCtx->DrawRectangle(rect, brush, strokeWidth, strokeStyle); - return S_OK; - } - - STDMETHODIMP DrawBitmap( - _In_ ID2D1Bitmap* bitmap, - _In_opt_ CONST D2D1_RECT_F* destinationRectangle, FLOAT opacity, - D2D1_INTERPOLATION_MODE interpolationMode, - _In_opt_ CONST D2D1_RECT_F* sourceRectangle, - _In_opt_ CONST D2D1_MATRIX_4X4_F* perspectiveTransform) { - mCtx->DrawBitmap(bitmap, destinationRectangle, opacity, interpolationMode, - sourceRectangle, perspectiveTransform); - return S_OK; - } - - STDMETHODIMP DrawImage(_In_ ID2D1Image* image, - _In_opt_ CONST D2D1_POINT_2F* targetOffset, - _In_opt_ CONST D2D1_RECT_F* imageRectangle, - D2D1_INTERPOLATION_MODE interpolationMode, - D2D1_COMPOSITE_MODE compositeMode) { - mCtx->DrawImage(image, targetOffset, imageRectangle, interpolationMode, - compositeMode); - return S_OK; - } - - STDMETHODIMP DrawGdiMetafile(_In_ ID2D1GdiMetafile* gdiMetafile, - _In_opt_ CONST D2D1_POINT_2F* targetOffset) { - mCtx->DrawGdiMetafile(gdiMetafile, targetOffset); - return S_OK; - } - - STDMETHODIMP FillMesh(_In_ ID2D1Mesh* mesh, _In_ ID2D1Brush* brush) { - mCtx->FillMesh(mesh, brush); - return S_OK; - } - - STDMETHODIMP FillOpacityMask(_In_ ID2D1Bitmap* opacityMask, - _In_ ID2D1Brush* brush, - _In_opt_ CONST D2D1_RECT_F* destinationRectangle, - _In_opt_ CONST D2D1_RECT_F* sourceRectangle) { - mCtx->FillOpacityMask(opacityMask, brush, destinationRectangle, - sourceRectangle); - return S_OK; - } - - STDMETHODIMP FillGeometry(_In_ ID2D1Geometry* geometry, - _In_ ID2D1Brush* brush, - _In_opt_ ID2D1Brush* opacityBrush) { - mCtx->FillGeometry(geometry, brush, opacityBrush); - return S_OK; - } - - STDMETHODIMP FillRectangle(_In_ CONST D2D1_RECT_F* rect, - _In_ ID2D1Brush* brush) { - mCtx->FillRectangle(rect, brush); - return S_OK; - } - - STDMETHODIMP PushAxisAlignedClip(_In_ CONST D2D1_RECT_F* clipRect, - D2D1_ANTIALIAS_MODE antialiasMode) { - mCtx->PushAxisAlignedClip(clipRect, antialiasMode); - return S_OK; - } - - STDMETHODIMP PushLayer(_In_ CONST D2D1_LAYER_PARAMETERS1* layerParameters1, - _In_opt_ ID2D1Layer* layer) { - mCtx->PushLayer(layerParameters1, layer); - return S_OK; - } - - STDMETHODIMP PopAxisAlignedClip() { - mCtx->PopAxisAlignedClip(); - return S_OK; - } - - STDMETHODIMP PopLayer() { - mCtx->PopLayer(); - return S_OK; - } - - ID2D1DeviceContext* mCtx; -}; - -class MOZ_STACK_CLASS AutoRestoreFP final { - public: - AutoRestoreFP() { - // save the current floating point control word - _controlfp_s(&savedFPSetting, 0, 0); - UINT unused; - // set the floating point control word to its default value - _controlfp_s(&unused, _CW_DEFAULT, MCW_PC); - } - ~AutoRestoreFP() { - UINT unused; - // restore the saved floating point control word - _controlfp_s(&unused, savedFPSetting, MCW_PC); - } - - private: - UINT savedFPSetting; -}; - -// Note that overrides of ID2D1SimplifiedGeometrySink methods in this class may -// get called from D2D with nonstandard floating point settings (see comments in -// bug 1134549) - use AutoRestoreFP to reset the floating point control word to -// what we expect -class StreamingGeometrySink : public ID2D1SimplifiedGeometrySink { - public: - explicit StreamingGeometrySink(PathSink* aSink) : mSink(aSink) {} - - HRESULT STDMETHODCALLTYPE QueryInterface(const IID& aIID, void** aPtr) { - if (!aPtr) { - return E_POINTER; - } - - if (aIID == IID_IUnknown) { - *aPtr = static_cast<IUnknown*>(this); - return S_OK; - } else if (aIID == IID_ID2D1SimplifiedGeometrySink) { - *aPtr = static_cast<ID2D1SimplifiedGeometrySink*>(this); - return S_OK; - } - - return E_NOINTERFACE; - } - - ULONG STDMETHODCALLTYPE AddRef() { return 1; } - - ULONG STDMETHODCALLTYPE Release() { return 1; } - - // We ignore SetFillMode, this depends on the destination sink. - STDMETHOD_(void, SetFillMode)(D2D1_FILL_MODE aMode) { return; } - STDMETHOD_(void, BeginFigure) - (D2D1_POINT_2F aPoint, D2D1_FIGURE_BEGIN aBegin) { - AutoRestoreFP resetFloatingPoint; - mSink->MoveTo(ToPoint(aPoint)); - } - STDMETHOD_(void, AddLines)(const D2D1_POINT_2F* aLines, UINT aCount) { - AutoRestoreFP resetFloatingPoint; - for (UINT i = 0; i < aCount; i++) { - mSink->LineTo(ToPoint(aLines[i])); - } - } - STDMETHOD_(void, AddBeziers) - (const D2D1_BEZIER_SEGMENT* aSegments, UINT aCount) { - AutoRestoreFP resetFloatingPoint; - for (UINT i = 0; i < aCount; i++) { - mSink->BezierTo(ToPoint(aSegments[i].point1), - ToPoint(aSegments[i].point2), - ToPoint(aSegments[i].point3)); - } - } - STDMETHOD(Close)() { /* Should never be called! */ return S_OK; } - STDMETHOD_(void, SetSegmentFlags) - (D2D1_PATH_SEGMENT aFlags) { /* Should never be called! */ } - - STDMETHOD_(void, EndFigure)(D2D1_FIGURE_END aEnd) { - AutoRestoreFP resetFloatingPoint; - if (aEnd == D2D1_FIGURE_END_CLOSED) { - return mSink->Close(); - } - } - - private: - PathSink* mSink; -}; - -} // namespace gfx -} // namespace mozilla - -#endif /* MOZILLA_GFX_HELPERSD2D_H_ */ diff --git a/gfx/2d/HelpersWin.h b/gfx/2d/HelpersWin.h @@ -0,0 +1,42 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_GFX_HELPERSWIN_H_ +#define MOZILLA_GFX_HELPERSWIN_H_ + +#include <dxgiformat.h> +#include "2D.h" + +namespace mozilla { +namespace gfx { + +static inline DXGI_FORMAT DXGIFormat(SurfaceFormat aFormat) { + switch (aFormat) { + case SurfaceFormat::B8G8R8A8: + return DXGI_FORMAT_B8G8R8A8_UNORM; + case SurfaceFormat::B8G8R8X8: + return DXGI_FORMAT_B8G8R8A8_UNORM; + case SurfaceFormat::A8: + return DXGI_FORMAT_A8_UNORM; + default: + return DXGI_FORMAT_UNKNOWN; + } +} + +static inline SurfaceFormat ToPixelFormat(const DXGI_FORMAT& aFormat) { + switch (aFormat) { + case DXGI_FORMAT_A8_UNORM: + case DXGI_FORMAT_R8_UNORM: + return SurfaceFormat::A8; + default: + return SurfaceFormat::B8G8R8A8; + } +} + +} // namespace gfx +} // namespace mozilla + +#endif /* MOZILLA_GFX_HELPERSWIN_H_ */ diff --git a/gfx/2d/Logging.h b/gfx/2d/Logging.h @@ -91,15 +91,12 @@ enum class LogReason : int { D3D11FinalizeFrame, D3D10SyncLock, D3D11SyncLock, - D2D1NoWriteMap, JobStatusError, FilterInputError, FilterInputData, // 10 FilterInputRect, FilterInputSet, FilterInputFormat, - FilterNodeD2D1Target, - FilterNodeD2D1Backend, SourceSurfaceIncompatible, GlyphAllocFailedCairo, GlyphAllocFailedCG, @@ -632,12 +629,6 @@ class Log final { case SurfaceType::DATA: mMessage << "SurfaceType::DATA"; break; - case SurfaceType::D2D1_BITMAP: - mMessage << "SurfaceType::D2D1_BITMAP"; - break; - case SurfaceType::D2D1_DRAWTARGET: - mMessage << "SurfaceType::D2D1_DRAWTARGET"; - break; case SurfaceType::CAIRO: mMessage << "SurfaceType::CAIRO"; break; @@ -653,9 +644,6 @@ class Log final { case SurfaceType::SKIA: mMessage << "SurfaceType::SKIA"; break; - case SurfaceType::D2D1_1_IMAGE: - mMessage << "SurfaceType::D2D1_1_IMAGE"; - break; case SurfaceType::RECORDING: mMessage << "SurfaceType::RECORDING"; break; diff --git a/gfx/2d/PathD2D.cpp b/gfx/2d/PathD2D.cpp @@ -1,428 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "PathD2D.h" -#include "HelpersD2D.h" -#include <math.h> -#include "DrawTargetD2D1.h" -#include "Logging.h" -#include "PathHelpers.h" - -namespace mozilla { -namespace gfx { - -already_AddRefed<PathBuilder> PathBuilderD2D::Create(FillRule aFillRule) { - RefPtr<ID2D1PathGeometry> path; - HRESULT hr = - DrawTargetD2D1::factory()->CreatePathGeometry(getter_AddRefs(path)); - - if (FAILED(hr)) { - gfxWarning() << "Failed to create Direct2D Path Geometry. Code: " - << hexa(hr); - return nullptr; - } - - RefPtr<ID2D1GeometrySink> sink; - hr = path->Open(getter_AddRefs(sink)); - if (FAILED(hr)) { - gfxWarning() << "Failed to access Direct2D Path Geometry. Code: " - << hexa(hr); - return nullptr; - } - - if (aFillRule == FillRule::FILL_WINDING) { - sink->SetFillMode(D2D1_FILL_MODE_WINDING); - } - - return MakeAndAddRef<PathBuilderD2D>(sink, path, aFillRule, - BackendType::DIRECT2D1_1); -} - -// This class exists as a wrapper for ID2D1SimplifiedGeometry sink, it allows -// a geometry to be duplicated into a geometry sink, while removing the final -// figure end and thus allowing a figure that was implicitly closed to be -// continued. -class OpeningGeometrySink : public ID2D1SimplifiedGeometrySink { - public: - explicit OpeningGeometrySink(ID2D1SimplifiedGeometrySink* aSink) - : mSink(aSink), mNeedsFigureEnded(false) {} - - HRESULT STDMETHODCALLTYPE QueryInterface(const IID& aIID, void** aPtr) { - if (!aPtr) { - return E_POINTER; - } - - if (aIID == IID_IUnknown) { - *aPtr = static_cast<IUnknown*>(this); - return S_OK; - } else if (aIID == IID_ID2D1SimplifiedGeometrySink) { - *aPtr = static_cast<ID2D1SimplifiedGeometrySink*>(this); - return S_OK; - } - - return E_NOINTERFACE; - } - - ULONG STDMETHODCALLTYPE AddRef() { return 1; } - - ULONG STDMETHODCALLTYPE Release() { return 1; } - - // We ignore SetFillMode, the copier will decide. - STDMETHOD_(void, SetFillMode)(D2D1_FILL_MODE aMode) { - EnsureFigureEnded(); - return; - } - STDMETHOD_(void, BeginFigure) - (D2D1_POINT_2F aPoint, D2D1_FIGURE_BEGIN aBegin) { - EnsureFigureEnded(); - return mSink->BeginFigure(aPoint, aBegin); - } - STDMETHOD_(void, AddLines)(const D2D1_POINT_2F* aLines, UINT aCount) { - EnsureFigureEnded(); - return mSink->AddLines(aLines, aCount); - } - STDMETHOD_(void, AddBeziers) - (const D2D1_BEZIER_SEGMENT* aSegments, UINT aCount) { - EnsureFigureEnded(); - return mSink->AddBeziers(aSegments, aCount); - } - STDMETHOD(Close)() { /* Should never be called! */ return S_OK; } - STDMETHOD_(void, SetSegmentFlags)(D2D1_PATH_SEGMENT aFlags) { - return mSink->SetSegmentFlags(aFlags); - } - - // This function is special - it's the reason this class exists. - // It needs to intercept the very last endfigure. So that a user can - // continue writing to this sink as if they never stopped. - STDMETHOD_(void, EndFigure)(D2D1_FIGURE_END aEnd) { - if (aEnd == D2D1_FIGURE_END_CLOSED) { - return mSink->EndFigure(aEnd); - } else { - mNeedsFigureEnded = true; - } - } - - private: - void EnsureFigureEnded() { - if (mNeedsFigureEnded) { - mSink->EndFigure(D2D1_FIGURE_END_OPEN); - mNeedsFigureEnded = false; - } - } - - ID2D1SimplifiedGeometrySink* mSink; - bool mNeedsFigureEnded; -}; - -PathBuilderD2D::~PathBuilderD2D() {} - -void PathBuilderD2D::MoveTo(const Point& aPoint) { - if (mFigureActive) { - mSink->EndFigure(D2D1_FIGURE_END_OPEN); - mFigureActive = false; - } - EnsureActive(aPoint); - mCurrentPoint = aPoint; -} - -void PathBuilderD2D::LineTo(const Point& aPoint) { - EnsureActive(aPoint); - mSink->AddLine(D2DPoint(aPoint)); - - mCurrentPoint = aPoint; - mFigureEmpty = false; -} - -void PathBuilderD2D::BezierTo(const Point& aCP1, const Point& aCP2, - const Point& aCP3) { - EnsureActive(aCP1); - mSink->AddBezier( - D2D1::BezierSegment(D2DPoint(aCP1), D2DPoint(aCP2), D2DPoint(aCP3))); - - mCurrentPoint = aCP3; - mFigureEmpty = false; -} - -void PathBuilderD2D::QuadraticBezierTo(const Point& aCP1, const Point& aCP2) { - EnsureActive(aCP1); - mSink->AddQuadraticBezier( - D2D1::QuadraticBezierSegment(D2DPoint(aCP1), D2DPoint(aCP2))); - - mCurrentPoint = aCP2; - mFigureEmpty = false; -} - -void PathBuilderD2D::Close() { - if (mFigureActive) { - mSink->EndFigure(D2D1_FIGURE_END_CLOSED); - - mFigureActive = false; - - EnsureActive(mBeginPoint); - } -} - -void PathBuilderD2D::Arc(const Point& aOrigin, Float aRadius, Float aStartAngle, - Float aEndAngle, bool aAntiClockwise) { - MOZ_ASSERT(aRadius >= 0); - - // We want aEndAngle to come numerically after aStartAngle when taking into - // account the sweep direction so that our calculation of the arcSize below - // (large or small) works. - Float sweepDirection = aAntiClockwise ? -1.0f : 1.0f; - - Float arcSweepLeft = (aEndAngle - aStartAngle) * sweepDirection; - if (arcSweepLeft < 0) { - // This calculation moves aStartAngle by a multiple of 2*Pi so that it is - // the closest it can be to aEndAngle and still be numerically before - // aEndAngle when taking into account sweepDirection. - arcSweepLeft = Float(2.0f * M_PI) + fmodf(arcSweepLeft, Float(2.0f * M_PI)); - aStartAngle = aEndAngle - arcSweepLeft * sweepDirection; - } - - // XXX - Workaround for now, D2D does not appear to do the desired thing when - // the angle sweeps a complete circle. - bool fullCircle = false; - if (aEndAngle - aStartAngle >= 1.9999 * M_PI) { - fullCircle = true; - aEndAngle = Float(aStartAngle + M_PI * 1.9999); - } else if (aStartAngle - aEndAngle >= 1.9999 * M_PI) { - fullCircle = true; - aStartAngle = Float(aEndAngle + M_PI * 1.9999); - } - - Point startPoint; - startPoint.x = aOrigin.x + aRadius * cos(aStartAngle); - startPoint.y = aOrigin.y + aRadius * sin(aStartAngle); - - if (!mFigureActive) { - EnsureActive(startPoint); - } else { - mSink->AddLine(D2DPoint(startPoint)); - } - - Point endPoint; - endPoint.x = aOrigin.x + aRadius * cosf(aEndAngle); - endPoint.y = aOrigin.y + aRadius * sinf(aEndAngle); - - D2D1_ARC_SIZE arcSize = D2D1_ARC_SIZE_SMALL; - D2D1_SWEEP_DIRECTION direction = aAntiClockwise - ? D2D1_SWEEP_DIRECTION_COUNTER_CLOCKWISE - : D2D1_SWEEP_DIRECTION_CLOCKWISE; - - // if startPoint and endPoint of our circle are too close there are D2D issues - // with drawing the circle as a single arc - const Float kEpsilon = 1e-5f; - if (!fullCircle || (std::abs(startPoint.x - endPoint.x) + - std::abs(startPoint.y - endPoint.y) > - kEpsilon)) { - if (aAntiClockwise) { - if (aStartAngle - aEndAngle > M_PI) { - arcSize = D2D1_ARC_SIZE_LARGE; - } - } else { - if (aEndAngle - aStartAngle > M_PI) { - arcSize = D2D1_ARC_SIZE_LARGE; - } - } - - mSink->AddArc(D2D1::ArcSegment(D2DPoint(endPoint), - D2D1::SizeF(aRadius, aRadius), 0.0f, - direction, arcSize)); - } else { - // our first workaround attempt didn't work, so instead draw the circle as - // two half-circles - Float midAngle = aEndAngle > aStartAngle ? Float(aStartAngle + M_PI) - : Float(aEndAngle + M_PI); - Point midPoint; - midPoint.x = aOrigin.x + aRadius * cosf(midAngle); - midPoint.y = aOrigin.y + aRadius * sinf(midAngle); - - mSink->AddArc(D2D1::ArcSegment(D2DPoint(midPoint), - D2D1::SizeF(aRadius, aRadius), 0.0f, - direction, arcSize)); - - // if the adjusted endPoint computed above is used here and endPoint != - // startPoint then this half of the circle won't render... - mSink->AddArc(D2D1::ArcSegment(D2DPoint(startPoint), - D2D1::SizeF(aRadius, aRadius), 0.0f, - direction, arcSize)); - } - - mCurrentPoint = endPoint; - mFigureEmpty = false; -} - -void PathBuilderD2D::EnsureActive(const Point& aPoint) { - if (!mFigureActive) { - mSink->BeginFigure(D2DPoint(aPoint), D2D1_FIGURE_BEGIN_FILLED); - mBeginPoint = aPoint; - mFigureActive = true; - } -} - -already_AddRefed<Path> PathBuilderD2D::Finish() { - if (mFigureActive) { - mSink->EndFigure(D2D1_FIGURE_END_OPEN); - } - - HRESULT hr = mSink->Close(); - if (FAILED(hr)) { - gfxCriticalNote << "Failed to close PathSink. Code: " << hexa(hr); - return nullptr; - } - - return MakeAndAddRef<PathD2D>(mGeometry, mFigureActive, mFigureEmpty, - mCurrentPoint, mFillRule, mBackendType); -} - -already_AddRefed<PathBuilder> PathD2D::CopyToBuilder(FillRule aFillRule) const { - return TransformedCopyToBuilder(Matrix(), aFillRule); -} - -already_AddRefed<PathBuilder> PathD2D::TransformedCopyToBuilder( - const Matrix& aTransform, FillRule aFillRule) const { - RefPtr<ID2D1PathGeometry> path; - HRESULT hr = - DrawTargetD2D1::factory()->CreatePathGeometry(getter_AddRefs(path)); - - if (FAILED(hr)) { - gfxWarning() << "Failed to create PathGeometry. Code: " << hexa(hr); - return nullptr; - } - - RefPtr<ID2D1GeometrySink> sink; - hr = path->Open(getter_AddRefs(sink)); - if (FAILED(hr)) { - gfxWarning() << "Failed to open Geometry for writing. Code: " << hexa(hr); - return nullptr; - } - - if (aFillRule == FillRule::FILL_WINDING) { - sink->SetFillMode(D2D1_FILL_MODE_WINDING); - } - - if (mEndedActive) { - OpeningGeometrySink wrapSink(sink); - hr = mGeometry->Simplify( - D2D1_GEOMETRY_SIMPLIFICATION_OPTION_CUBICS_AND_LINES, - D2DMatrix(aTransform), &wrapSink); - } else { - hr = mGeometry->Simplify( - D2D1_GEOMETRY_SIMPLIFICATION_OPTION_CUBICS_AND_LINES, - D2DMatrix(aTransform), sink); - } - if (FAILED(hr)) { - gfxWarning() << "Failed to simplify PathGeometry to tranformed copy. Code: " - << hexa(hr) << " Active: " << mEndedActive; - return nullptr; - } - - RefPtr<PathBuilderD2D> pathBuilder = - new PathBuilderD2D(sink, path, aFillRule, mBackendType); - - pathBuilder->mCurrentPoint = aTransform.TransformPoint(mEndPoint); - - if (mEndedActive) { - pathBuilder->mFigureActive = true; - } - - return pathBuilder.forget(); -} - -void PathD2D::StreamToSink(PathSink* aSink) const { - HRESULT hr; - - StreamingGeometrySink sink(aSink); - - hr = mGeometry->Simplify(D2D1_GEOMETRY_SIMPLIFICATION_OPTION_CUBICS_AND_LINES, - D2D1::IdentityMatrix(), &sink); - - if (FAILED(hr)) { - gfxWarning() << "Failed to stream D2D path to sink. Code: " << hexa(hr); - return; - } -} - -bool PathD2D::ContainsPoint(const Point& aPoint, - const Matrix& aTransform) const { - if (!aTransform.Determinant()) { - // If the transform is not invertible, then don't consider point inside. - return false; - } - - BOOL result; - - HRESULT hr = mGeometry->FillContainsPoint( - D2DPoint(aPoint), D2DMatrix(aTransform), 0.001f, &result); - - if (FAILED(hr)) { - // Log - return false; - } - - return !!result; -} - -bool PathD2D::StrokeContainsPoint(const StrokeOptions& aStrokeOptions, - const Point& aPoint, - const Matrix& aTransform) const { - if (!aTransform.Determinant()) { - // If the transform is not invertible, then don't consider point inside. - return false; - } - - BOOL result; - - RefPtr<ID2D1StrokeStyle> strokeStyle = - CreateStrokeStyleForOptions(aStrokeOptions); - HRESULT hr = mGeometry->StrokeContainsPoint( - D2DPoint(aPoint), aStrokeOptions.mLineWidth, strokeStyle, - D2DMatrix(aTransform), &result); - - if (FAILED(hr)) { - // Log - return false; - } - - return !!result; -} - -Rect PathD2D::GetBounds(const Matrix& aTransform) const { - D2D1_RECT_F d2dBounds; - - HRESULT hr = mGeometry->GetBounds(D2DMatrix(aTransform), &d2dBounds); - - Rect bounds = ToRect(d2dBounds); - if (FAILED(hr) || !bounds.IsFinite()) { - gfxWarning() << "Failed to get stroked bounds for path. Code: " << hexa(hr); - return Rect(); - } - - return bounds; -} - -Rect PathD2D::GetStrokedBounds(const StrokeOptions& aStrokeOptions, - const Matrix& aTransform) const { - D2D1_RECT_F d2dBounds; - - RefPtr<ID2D1StrokeStyle> strokeStyle = - CreateStrokeStyleForOptions(aStrokeOptions); - HRESULT hr = - mGeometry->GetWidenedBounds(aStrokeOptions.mLineWidth, strokeStyle, - D2DMatrix(aTransform), &d2dBounds); - - Rect bounds = ToRect(d2dBounds); - if (FAILED(hr) || !bounds.IsFinite()) { - gfxWarning() << "Failed to get stroked bounds for path. Code: " << hexa(hr); - return Rect(); - } - - return bounds; -} - -} // namespace gfx -} // namespace mozilla diff --git a/gfx/2d/PathD2D.h b/gfx/2d/PathD2D.h @@ -1,119 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef MOZILLA_GFX_PATHD2D_H_ -#define MOZILLA_GFX_PATHD2D_H_ - -#include <d2d1.h> - -#include "2D.h" - -namespace mozilla { -namespace gfx { - -class PathD2D; - -class PathBuilderD2D : public PathBuilder { - public: - MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(PathBuilderD2D, override) - PathBuilderD2D(ID2D1GeometrySink* aSink, ID2D1PathGeometry* aGeom, - FillRule aFillRule, BackendType aBackendType) - : mSink(aSink), - mGeometry(aGeom), - mFigureActive(false), - mFillRule(aFillRule), - mBackendType(aBackendType) {} - virtual ~PathBuilderD2D(); - - virtual void MoveTo(const Point& aPoint); - virtual void LineTo(const Point& aPoint); - virtual void BezierTo(const Point& aCP1, const Point& aCP2, - const Point& aCP3); - virtual void QuadraticBezierTo(const Point& aCP1, const Point& aCP2); - virtual void Close(); - virtual void Arc(const Point& aOrigin, Float aRadius, Float aStartAngle, - Float aEndAngle, bool aAntiClockwise = false); - - virtual already_AddRefed<Path> Finish(); - - virtual BackendType GetBackendType() const { return mBackendType; } - - ID2D1GeometrySink* GetSink() { return mSink; } - - bool IsFigureActive() const { return mFigureActive; } - - virtual bool IsActive() const { return IsFigureActive(); } - - static already_AddRefed<PathBuilder> Create(FillRule aFillRule); - - private: - friend class PathD2D; - - void EnsureActive(const Point& aPoint); - - RefPtr<ID2D1GeometrySink> mSink; - RefPtr<ID2D1PathGeometry> mGeometry; - - bool mFigureActive; - bool mFigureEmpty = true; - FillRule mFillRule; - BackendType mBackendType; -}; - -class PathD2D : public Path { - public: - MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(PathD2D, override) - PathD2D(ID2D1PathGeometry* aGeometry, bool aEndedActive, bool aIsEmpty, - const Point& aEndPoint, FillRule aFillRule, BackendType aBackendType) - : mGeometry(aGeometry), - mEndedActive(aEndedActive), - mIsEmpty(aIsEmpty), - mEndPoint(aEndPoint), - mFillRule(aFillRule), - mBackendType(aBackendType) {} - - virtual BackendType GetBackendType() const { return mBackendType; } - - virtual already_AddRefed<PathBuilder> CopyToBuilder(FillRule aFillRule) const; - virtual already_AddRefed<PathBuilder> TransformedCopyToBuilder( - const Matrix& aTransform, FillRule aFillRule) const; - - virtual bool ContainsPoint(const Point& aPoint, - const Matrix& aTransform) const; - - virtual bool StrokeContainsPoint(const StrokeOptions& aStrokeOptions, - const Point& aPoint, - const Matrix& aTransform) const; - - virtual Rect GetBounds(const Matrix& aTransform = Matrix()) const; - - virtual Rect GetStrokedBounds(const StrokeOptions& aStrokeOptions, - const Matrix& aTransform = Matrix()) const; - - virtual void StreamToSink(PathSink* aSink) const; - - virtual FillRule GetFillRule() const { return mFillRule; } - - bool IsEmpty() const override { return mIsEmpty; } - - ID2D1Geometry* GetGeometry() { return mGeometry; } - - private: - friend class DrawTargetD2D; - friend class DrawTargetD2D1; - - mutable RefPtr<ID2D1PathGeometry> mGeometry; - bool mEndedActive; - bool mIsEmpty; - Point mEndPoint; - FillRule mFillRule; - BackendType mBackendType; -}; - -} // namespace gfx -} // namespace mozilla - -#endif /* MOZILLA_GFX_PATHD2D_H_ */ diff --git a/gfx/2d/RadialGradientEffectD2D1.cpp b/gfx/2d/RadialGradientEffectD2D1.cpp @@ -1,405 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "RadialGradientEffectD2D1.h" - -#include "Logging.h" - -#include "ShadersD2D1.h" -#include "HelpersD2D.h" - -#include <vector> - -#define TEXTW(x) L##x -#define XML(X) \ - TEXTW(#X) // This macro creates a single string from multiple lines of text. - -static const PCWSTR kXmlDescription = - XML( - <?xml version='1.0'?> - <Effect> - <!-- System Properties --> - <Property name='DisplayName' type='string' value='RadialGradientEffect'/> - <Property name='Author' type='string' value='Mozilla'/> - <Property name='Category' type='string' value='Pattern effects'/> - <Property name='Description' type='string' value='This effect is used to render radial gradients in a manner compliant with the 2D Canvas specification.'/> - <Inputs> - <Input name='Geometry'/> - </Inputs> - <Property name='StopCollection' type='iunknown'> - <Property name='DisplayName' type='string' value='Gradient stop collection'/> - </Property> - <Property name='Center1' type='vector2'> - <Property name='DisplayName' type='string' value='Inner circle center'/> - </Property> - <Property name='Center2' type='vector2'> - <Property name='DisplayName' type='string' value='Outer circle center'/> - </Property> - <Property name='Radius1' type='float'> - <Property name='DisplayName' type='string' value='Inner circle radius'/> - </Property> - <Property name='Radius2' type='float'> - <Property name='DisplayName' type='string' value='Outer circle radius'/> - </Property> - <Property name='Transform' type='matrix3x2'> - <Property name='DisplayName' type='string' value='Transform applied to the pattern'/> - </Property> - - </Effect> - ); - -// {FB947CDA-718E-40CC-AE7B-D255830D7D14} -static const GUID GUID_SampleRadialGradientPS = { - 0xfb947cda, - 0x718e, - 0x40cc, - {0xae, 0x7b, 0xd2, 0x55, 0x83, 0xd, 0x7d, 0x14}}; -// {2C468128-6546-453C-8E25-F2DF0DE10A0F} -static const GUID GUID_SampleRadialGradientA0PS = { - 0x2c468128, 0x6546, 0x453c, {0x8e, 0x25, 0xf2, 0xdf, 0xd, 0xe1, 0xa, 0xf}}; - -namespace mozilla { -namespace gfx { - -RadialGradientEffectD2D1::RadialGradientEffectD2D1() - : mRefCount(0), - mCenter1(D2D1::Vector2F(0, 0)), - mCenter2(D2D1::Vector2F(0, 0)), - mRadius1(0), - mRadius2(0), - mTransform(D2D1::IdentityMatrix()) - -{} - -IFACEMETHODIMP -RadialGradientEffectD2D1::Initialize(ID2D1EffectContext* pContextInternal, - ID2D1TransformGraph* pTransformGraph) { - HRESULT hr; - - hr = pContextInternal->LoadPixelShader(GUID_SampleRadialGradientPS, - SampleRadialGradientPS, - sizeof(SampleRadialGradientPS)); - - if (FAILED(hr)) { - return hr; - } - - hr = pContextInternal->LoadPixelShader(GUID_SampleRadialGradientA0PS, - SampleRadialGradientA0PS, - sizeof(SampleRadialGradientA0PS)); - - if (FAILED(hr)) { - return hr; - } - - hr = pTransformGraph->SetSingleTransformNode(this); - - if (FAILED(hr)) { - return hr; - } - - mEffectContext = pContextInternal; - - return S_OK; -} - -IFACEMETHODIMP -RadialGradientEffectD2D1::PrepareForRender(D2D1_CHANGE_TYPE changeType) { - if (changeType == D2D1_CHANGE_TYPE_NONE) { - return S_OK; - } - - // We'll need to inverse transform our pixel, precompute inverse here. - Matrix mat = ToMatrix(mTransform); - if (!mat.Invert()) { - // Singular - return S_OK; - } - - if (!mStopCollection) { - return S_OK; - } - - D2D1_POINT_2F dc = - D2D1::Point2F(mCenter2.x - mCenter1.x, mCenter2.y - mCenter1.y); - float dr = mRadius2 - mRadius1; - float A = dc.x * dc.x + dc.y * dc.y - dr * dr; - - HRESULT hr; - - if (A == 0) { - hr = mDrawInfo->SetPixelShader(GUID_SampleRadialGradientA0PS); - } else { - hr = mDrawInfo->SetPixelShader(GUID_SampleRadialGradientPS); - } - - if (FAILED(hr)) { - return hr; - } - - RefPtr<ID2D1ResourceTexture> tex = CreateGradientTexture(); - hr = mDrawInfo->SetResourceTexture(1, tex); - - if (FAILED(hr)) { - return hr; - } - - struct PSConstantBuffer { - float diff[3]; - float padding; - float center1[2]; - float A; - float radius1; - float sq_radius1; - float repeat_correct; - float allow_odd; - float padding2[1]; - float transform[8]; - }; - - PSConstantBuffer buffer = { - {dc.x, dc.y, dr}, - 0.0f, - {mCenter1.x, mCenter1.y}, - A, - mRadius1, - mRadius1 * mRadius1, - mStopCollection->GetExtendMode() != D2D1_EXTEND_MODE_CLAMP ? 1.0f : 0.0f, - mStopCollection->GetExtendMode() == D2D1_EXTEND_MODE_MIRROR ? 1.0f : 0.0f, - {0.0f}, - {mat._11, mat._21, mat._31, 0.0f, mat._12, mat._22, mat._32, 0.0f}}; - - hr = mDrawInfo->SetPixelShaderConstantBuffer((BYTE*)&buffer, sizeof(buffer)); - - if (FAILED(hr)) { - return hr; - } - - return S_OK; -} - -IFACEMETHODIMP -RadialGradientEffectD2D1::SetGraph(ID2D1TransformGraph* pGraph) { - return pGraph->SetSingleTransformNode(this); -} - -IFACEMETHODIMP_(ULONG) -RadialGradientEffectD2D1::AddRef() { return ++mRefCount; } - -IFACEMETHODIMP_(ULONG) -RadialGradientEffectD2D1::Release() { - if (!--mRefCount) { - delete this; - return 0; - } - return mRefCount; -} - -IFACEMETHODIMP -RadialGradientEffectD2D1::QueryInterface(const IID& aIID, void** aPtr) { - if (!aPtr) { - return E_POINTER; - } - - if (aIID == IID_IUnknown) { - *aPtr = static_cast<IUnknown*>(static_cast<ID2D1EffectImpl*>(this)); - } else if (aIID == IID_ID2D1EffectImpl) { - *aPtr = static_cast<ID2D1EffectImpl*>(this); - } else if (aIID == IID_ID2D1DrawTransform) { - *aPtr = static_cast<ID2D1DrawTransform*>(this); - } else if (aIID == IID_ID2D1Transform) { - *aPtr = static_cast<ID2D1Transform*>(this); - } else if (aIID == IID_ID2D1TransformNode) { - *aPtr = static_cast<ID2D1TransformNode*>(this); - } else { - return E_NOINTERFACE; - } - - static_cast<IUnknown*>(*aPtr)->AddRef(); - return S_OK; -} - -IFACEMETHODIMP -RadialGradientEffectD2D1::MapInputRectsToOutputRect( - const D2D1_RECT_L* pInputRects, const D2D1_RECT_L* pInputOpaqueSubRects, - UINT32 inputRectCount, D2D1_RECT_L* pOutputRect, - D2D1_RECT_L* pOutputOpaqueSubRect) { - if (inputRectCount != 1) { - return E_INVALIDARG; - } - - *pOutputRect = *pInputRects; - *pOutputOpaqueSubRect = *pInputOpaqueSubRects; - return S_OK; -} - -IFACEMETHODIMP -RadialGradientEffectD2D1::MapOutputRectToInputRects( - const D2D1_RECT_L* pOutputRect, D2D1_RECT_L* pInputRects, - UINT32 inputRectCount) const { - if (inputRectCount != 1) { - return E_INVALIDARG; - } - - *pInputRects = *pOutputRect; - return S_OK; -} - -IFACEMETHODIMP -RadialGradientEffectD2D1::MapInvalidRect( - UINT32 inputIndex, D2D1_RECT_L invalidInputRect, - D2D1_RECT_L* pInvalidOutputRect) const { - MOZ_ASSERT(inputIndex == 0); - - *pInvalidOutputRect = invalidInputRect; - return S_OK; -} - -IFACEMETHODIMP -RadialGradientEffectD2D1::SetDrawInfo(ID2D1DrawInfo* pDrawInfo) { - mDrawInfo = pDrawInfo; - return S_OK; -} - -HRESULT -RadialGradientEffectD2D1::Register(ID2D1Factory1* aFactory) { - D2D1_PROPERTY_BINDING bindings[] = { - D2D1_VALUE_TYPE_BINDING(L"StopCollection", - &RadialGradientEffectD2D1::SetStopCollection, - &RadialGradientEffectD2D1::GetStopCollection), - D2D1_VALUE_TYPE_BINDING(L"Center1", &RadialGradientEffectD2D1::SetCenter1, - &RadialGradientEffectD2D1::GetCenter1), - D2D1_VALUE_TYPE_BINDING(L"Center2", &RadialGradientEffectD2D1::SetCenter2, - &RadialGradientEffectD2D1::GetCenter2), - D2D1_VALUE_TYPE_BINDING(L"Radius1", &RadialGradientEffectD2D1::SetRadius1, - &RadialGradientEffectD2D1::GetRadius1), - D2D1_VALUE_TYPE_BINDING(L"Radius2", &RadialGradientEffectD2D1::SetRadius2, - &RadialGradientEffectD2D1::GetRadius2), - D2D1_VALUE_TYPE_BINDING(L"Transform", - &RadialGradientEffectD2D1::SetTransform, - &RadialGradientEffectD2D1::GetTransform)}; - HRESULT hr = aFactory->RegisterEffectFromString( - CLSID_RadialGradientEffect, kXmlDescription, bindings, - ARRAYSIZE(bindings), CreateEffect); - - if (FAILED(hr)) { - gfxWarning() << "Failed to register radial gradient effect."; - } - return hr; -} - -void RadialGradientEffectD2D1::Unregister(ID2D1Factory1* aFactory) { - aFactory->UnregisterEffect(CLSID_RadialGradientEffect); -} - -HRESULT __stdcall RadialGradientEffectD2D1::CreateEffect( - IUnknown** aEffectImpl) { - *aEffectImpl = static_cast<ID2D1EffectImpl*>(new RadialGradientEffectD2D1()); - (*aEffectImpl)->AddRef(); - - return S_OK; -} - -HRESULT -RadialGradientEffectD2D1::SetStopCollection(IUnknown* aStopCollection) { - if (SUCCEEDED(aStopCollection->QueryInterface( - (ID2D1GradientStopCollection**)getter_AddRefs(mStopCollection)))) { - return S_OK; - } - - return E_INVALIDARG; -} - -already_AddRefed<ID2D1ResourceTexture> -RadialGradientEffectD2D1::CreateGradientTexture() { - std::vector<D2D1_GRADIENT_STOP> rawStops; - rawStops.resize(mStopCollection->GetGradientStopCount()); - mStopCollection->GetGradientStops(&rawStops.front(), rawStops.size()); - - std::vector<unsigned char> textureData; - textureData.resize(4096 * 4); - unsigned char* texData = &textureData.front(); - - float prevColorPos = 0; - float nextColorPos = 1.0f; - D2D1_COLOR_F prevColor = rawStops[0].color; - D2D1_COLOR_F nextColor = prevColor; - - if (rawStops.size() >= 2) { - nextColor = rawStops[1].color; - nextColorPos = rawStops[1].position; - } - - uint32_t stopPosition = 2; - - // Not the most optimized way but this will do for now. - for (int i = 0; i < 4096; i++) { - // The 4095 seems a little counter intuitive, but we want the gradient - // color at offset 0 at the first pixel, and at offset 1.0f at the last - // pixel. - float pos = float(i) / 4095; - - while (pos > nextColorPos) { - prevColor = nextColor; - prevColorPos = nextColorPos; - if (rawStops.size() > stopPosition) { - nextColor = rawStops[stopPosition].color; - nextColorPos = rawStops[stopPosition++].position; - } else { - nextColorPos = 1.0f; - } - } - - float interp; - - if (nextColorPos != prevColorPos) { - interp = (pos - prevColorPos) / (nextColorPos - prevColorPos); - } else { - interp = 0; - } - - DeviceColor newColor(prevColor.r + (nextColor.r - prevColor.r) * interp, - prevColor.g + (nextColor.g - prevColor.g) * interp, - prevColor.b + (nextColor.b - prevColor.b) * interp, - prevColor.a + (nextColor.a - prevColor.a) * interp); - - // Note D2D expects RGBA here!! - texData[i * 4] = (unsigned char)(255.0f * newColor.r); - texData[i * 4 + 1] = (unsigned char)(255.0f * newColor.g); - texData[i * 4 + 2] = (unsigned char)(255.0f * newColor.b); - texData[i * 4 + 3] = (unsigned char)(255.0f * newColor.a); - } - - RefPtr<ID2D1ResourceTexture> tex; - - UINT32 width = 4096; - UINT32 stride = 4096 * 4; - D2D1_RESOURCE_TEXTURE_PROPERTIES props; - // Older shader models do not support 1D textures. So just use a width x 1 - // texture. - props.dimensions = 2; - UINT32 dims[] = {width, 1}; - props.extents = dims; - props.channelDepth = D2D1_CHANNEL_DEPTH_4; - props.bufferPrecision = D2D1_BUFFER_PRECISION_8BPC_UNORM; - props.filter = D2D1_FILTER_MIN_MAG_MIP_LINEAR; - D2D1_EXTEND_MODE extendMode[] = {mStopCollection->GetExtendMode(), - mStopCollection->GetExtendMode()}; - props.extendModes = extendMode; - - HRESULT hr = mEffectContext->CreateResourceTexture( - nullptr, &props, &textureData.front(), &stride, 4096 * 4, - getter_AddRefs(tex)); - - if (FAILED(hr)) { - gfxWarning() << "Failed to create resource texture: " << hexa(hr); - } - - return tex.forget(); -} - -} // namespace gfx -} // namespace mozilla diff --git a/gfx/2d/RadialGradientEffectD2D1.h b/gfx/2d/RadialGradientEffectD2D1.h @@ -1,102 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef MOZILLA_GFX_RADIALGRADIENTEFFECTD2D1_H_ -#define MOZILLA_GFX_RADIALGRADIENTEFFECTD2D1_H_ - -#include <d2d1_1.h> -#include <d2d1effectauthor.h> -#include <d2d1effecthelpers.h> - -#include "2D.h" - -// {97143DC6-CBC4-4DD4-A8BA-13342B0BA46D} -DEFINE_GUID(CLSID_RadialGradientEffect, 0x97143dc6, 0xcbc4, 0x4dd4, 0xa8, 0xba, - 0x13, 0x34, 0x2b, 0xb, 0xa4, 0x6d); - -// Macro to keep our class nice and clean. -#define SIMPLE_PROP(type, name) \ - public: \ - HRESULT Set##name(type a##name) { \ - m##name = a##name; \ - return S_OK; \ - } \ - type Get##name() const { return m##name; } \ - \ - private: \ - type m##name; - -namespace mozilla { -namespace gfx { - -enum { - RADIAL_PROP_STOP_COLLECTION = 0, - RADIAL_PROP_CENTER_1, - RADIAL_PROP_CENTER_2, - RADIAL_PROP_RADIUS_1, - RADIAL_PROP_RADIUS_2, - RADIAL_PROP_TRANSFORM -}; - -class RadialGradientEffectD2D1 final : public ID2D1EffectImpl, - public ID2D1DrawTransform { - public: - // ID2D1EffectImpl - IFACEMETHODIMP Initialize(ID2D1EffectContext* pContextInternal, - ID2D1TransformGraph* pTransformGraph); - IFACEMETHODIMP PrepareForRender(D2D1_CHANGE_TYPE changeType); - IFACEMETHODIMP SetGraph(ID2D1TransformGraph* pGraph); - - // IUnknown - IFACEMETHODIMP_(ULONG) AddRef(); - IFACEMETHODIMP_(ULONG) Release(); - IFACEMETHODIMP QueryInterface(REFIID riid, void** ppOutput); - - // ID2D1Transform - IFACEMETHODIMP MapInputRectsToOutputRect( - const D2D1_RECT_L* pInputRects, const D2D1_RECT_L* pInputOpaqueSubRects, - UINT32 inputRectCount, D2D1_RECT_L* pOutputRect, - D2D1_RECT_L* pOutputOpaqueSubRect); - IFACEMETHODIMP MapOutputRectToInputRects(const D2D1_RECT_L* pOutputRect, - D2D1_RECT_L* pInputRects, - UINT32 inputRectCount) const; - IFACEMETHODIMP MapInvalidRect(UINT32 inputIndex, D2D1_RECT_L invalidInputRect, - D2D1_RECT_L* pInvalidOutputRect) const; - - // ID2D1TransformNode - IFACEMETHODIMP_(UINT32) GetInputCount() const { return 1; } - - // ID2D1DrawTransform - IFACEMETHODIMP SetDrawInfo(ID2D1DrawInfo* pDrawInfo); - - static HRESULT Register(ID2D1Factory1* aFactory); - static void Unregister(ID2D1Factory1* aFactory); - static HRESULT __stdcall CreateEffect(IUnknown** aEffectImpl); - - HRESULT SetStopCollection(IUnknown* aStopCollection); - IUnknown* GetStopCollection() const { return mStopCollection; } - - private: - already_AddRefed<ID2D1ResourceTexture> CreateGradientTexture(); - - RadialGradientEffectD2D1(); - - uint32_t mRefCount; - RefPtr<ID2D1GradientStopCollection> mStopCollection; - RefPtr<ID2D1EffectContext> mEffectContext; - RefPtr<ID2D1DrawInfo> mDrawInfo; - SIMPLE_PROP(D2D1_VECTOR_2F, Center1); - SIMPLE_PROP(D2D1_VECTOR_2F, Center2); - SIMPLE_PROP(FLOAT, Radius1); - SIMPLE_PROP(FLOAT, Radius2); - SIMPLE_PROP(D2D_MATRIX_3X2_F, Transform); -}; - -} // namespace gfx -} // namespace mozilla -#undef SIMPLE_PROP - -#endif diff --git a/gfx/2d/RecordedEventImpl.h b/gfx/2d/RecordedEventImpl.h @@ -1884,8 +1884,6 @@ static std::string NameFromBackend(BackendType aType) { switch (aType) { case BackendType::NONE: return "None"; - case BackendType::DIRECT2D: - return "Direct2D"; default: return "Unknown"; } diff --git a/gfx/2d/ScaledFontDWrite.cpp b/gfx/2d/ScaledFontDWrite.cpp @@ -7,12 +7,10 @@ #include "ScaledFontDWrite.h" #include "gfxDWriteCommon.h" #include "UnscaledFontDWrite.h" -#include "PathD2D.h" #include "gfxFont.h" #include "Logging.h" #include "mozilla/FontPropertyTypes.h" #include "mozilla/webrender/WebRenderTypes.h" -#include "HelpersD2D.h" #include "StackArray.h" #include "dwrite_3.h" @@ -95,23 +93,6 @@ ScaledFontDWrite::ScaledFontDWrite(IDWriteFontFace* aFontFace, } } -already_AddRefed<Path> ScaledFontDWrite::GetPathForGlyphs( - const GlyphBuffer& aBuffer, const DrawTarget* aTarget) { - RefPtr<PathBuilder> pathBuilder = aTarget->CreatePathBuilder(); - - if (pathBuilder->GetBackendType() != BackendType::DIRECT2D && - pathBuilder->GetBackendType() != BackendType::DIRECT2D1_1) { - return ScaledFontBase::GetPathForGlyphs(aBuffer, aTarget); - } - - PathBuilderD2D* pathBuilderD2D = - static_cast<PathBuilderD2D*>(pathBuilder.get()); - - CopyGlyphsToSink(aBuffer, pathBuilderD2D->GetSink()); - - return pathBuilder->Finish(); -} - SkTypeface* ScaledFontDWrite::CreateSkTypeface() { RefPtr<IDWriteFactory> factory = Factory::GetDWriteFactory(); if (!factory) { @@ -155,51 +136,6 @@ bool ScaledFontDWrite::MayUseBitmaps() { return ForceGDIMode() || UseEmbeddedBitmaps(); } -void ScaledFontDWrite::CopyGlyphsToBuilder(const GlyphBuffer& aBuffer, - PathBuilder* aBuilder, - const Matrix* aTransformHint) { - BackendType backendType = aBuilder->GetBackendType(); - if (backendType != BackendType::DIRECT2D && - backendType != BackendType::DIRECT2D1_1) { - ScaledFontBase::CopyGlyphsToBuilder(aBuffer, aBuilder, aTransformHint); - return; - } - - PathBuilderD2D* pathBuilderD2D = static_cast<PathBuilderD2D*>(aBuilder); - - if (pathBuilderD2D->IsFigureActive()) { - gfxCriticalNote - << "Attempting to copy glyphs to PathBuilderD2D with active figure."; - } - - CopyGlyphsToSink(aBuffer, pathBuilderD2D->GetSink()); -} - -void ScaledFontDWrite::CopyGlyphsToSink(const GlyphBuffer& aBuffer, - ID2D1SimplifiedGeometrySink* aSink) { - std::vector<UINT16> indices; - std::vector<FLOAT> advances; - std::vector<DWRITE_GLYPH_OFFSET> offsets; - indices.resize(aBuffer.mNumGlyphs); - advances.resize(aBuffer.mNumGlyphs); - offsets.resize(aBuffer.mNumGlyphs); - - memset(&advances.front(), 0, sizeof(FLOAT) * aBuffer.mNumGlyphs); - for (unsigned int i = 0; i < aBuffer.mNumGlyphs; i++) { - indices[i] = aBuffer.mGlyphs[i].mIndex; - offsets[i].advanceOffset = aBuffer.mGlyphs[i].mPosition.x; - offsets[i].ascenderOffset = -aBuffer.mGlyphs[i].mPosition.y; - } - - HRESULT hr = mFontFace->GetGlyphRunOutline( - mSize, &indices.front(), &advances.front(), &offsets.front(), - aBuffer.mNumGlyphs, FALSE, FALSE, aSink); - if (FAILED(hr)) { - gfxCriticalNote << "Failed to copy glyphs to geometry sink. Code: " - << hexa(hr); - } -} - bool UnscaledFontDWrite::GetFontFileData(FontFileDataOutput aDataCallback, void* aBaton) { UINT32 fileCount = 0; diff --git a/gfx/2d/ScaledFontDWrite.h b/gfx/2d/ScaledFontDWrite.h @@ -11,7 +11,6 @@ #include "DWriteSettings.h" #include "ScaledFontBase.h" -struct ID2D1GeometrySink; struct gfxFontStyle; namespace mozilla { @@ -30,14 +29,6 @@ class ScaledFontDWrite final : public ScaledFontBase { FontType GetType() const override { return FontType::DWRITE; } - already_AddRefed<Path> GetPathForGlyphs(const GlyphBuffer& aBuffer, - const DrawTarget* aTarget) override; - void CopyGlyphsToBuilder(const GlyphBuffer& aBuffer, PathBuilder* aBuilder, - const Matrix* aTransformHint) override; - - void CopyGlyphsToSink(const GlyphBuffer& aBuffer, - ID2D1SimplifiedGeometrySink* aSink); - bool CanSerialize() override { return true; } bool MayUseBitmaps() override; diff --git a/gfx/2d/ShadersD2D.fx b/gfx/2d/ShadersD2D.fx @@ -1,824 +0,0 @@ -// We store vertex coordinates and the quad shape in a constant buffer, this is -// easy to update and allows us to use a single call to set the x, y, w, h of -// the quad. -// The QuadDesc and TexCoords both work as follows: -// The x component is the quad left point, the y component is the top point -// the z component is the width, and the w component is the height. The quad -// are specified in viewport coordinates, i.e. { -1.0f, 1.0f, 2.0f, -2.0f } -// would cover the entire viewport (which runs from <-1.0f, 1.0f> left to right -// and <-1.0f, 1.0f> -bottom- to top. The TexCoords desc is specified in texture -// space <0, 1.0f> left to right and top to bottom. The input vertices of the -// shader stage always form a rectangle from {0, 0} - {1, 1} -cbuffer cb0 -{ - float4 QuadDesc; - float4 TexCoords; - float4 MaskTexCoords; - float4 TextColor; -} - -cbuffer cb1 -{ - float4 BlurOffsetsH[3]; - float4 BlurOffsetsV[3]; - float4 BlurWeights[3]; - float4 ShadowColor; -} - -cbuffer cb2 -{ - float3x3 DeviceSpaceToUserSpace; - float2 dimensions; - // Precalculate as much as we can! - float3 diff; - float2 center1; - float A; - float radius1; - float sq_radius1; -} - -cbuffer cb3 -{ - float3x3 DeviceSpaceToUserSpace_cb3; - float2 dimensions_cb3; - float2 center; - float angle; - float start_offset; - float end_offset; -} - -struct VS_OUTPUT -{ - float4 Position : SV_Position; - float2 TexCoord : TEXCOORD0; - float2 MaskTexCoord : TEXCOORD1; -}; - -struct VS_RADIAL_OUTPUT -{ - float4 Position : SV_Position; - float2 MaskTexCoord : TEXCOORD0; - float2 PixelCoord : TEXCOORD1; -}; - -struct VS_CONIC_OUTPUT -{ - float4 Position : SV_Position; - float2 MaskTexCoord : TEXCOORD0; - float2 PixelCoord : TEXCOORD1; -}; - -struct PS_TEXT_OUTPUT -{ - float4 color; - float4 alpha; -}; - -Texture2D tex; -Texture2D bcktex; -Texture2D mask; -uint blendop; - -sampler sSampler = sampler_state { - Filter = MIN_MAG_MIP_LINEAR; - Texture = tex; - AddressU = Clamp; - AddressV = Clamp; -}; - -sampler sBckSampler = sampler_state { - Filter = MIN_MAG_MIP_LINEAR; - Texture = bcktex; - AddressU = Clamp; - AddressV = Clamp; -}; - -sampler sWrapSampler = sampler_state { - Filter = MIN_MAG_MIP_LINEAR; - Texture = tex; - AddressU = Wrap; - AddressV = Wrap; -}; - -sampler sMirrorSampler = sampler_state { - Filter = MIN_MAG_MIP_LINEAR; - Texture = tex; - AddressU = Mirror; - AddressV = Mirror; -}; - -sampler sMaskSampler = sampler_state { - Filter = MIN_MAG_MIP_LINEAR; - Texture = mask; - AddressU = Clamp; - AddressV = Clamp; -}; - -sampler sShadowSampler = sampler_state { - Filter = MIN_MAG_MIP_LINEAR; - Texture = tex; - AddressU = Border; - AddressV = Border; - BorderColor = float4(0, 0, 0, 0); -}; - -RasterizerState TextureRast -{ - ScissorEnable = True; - CullMode = None; -}; - -BlendState ShadowBlendH -{ - BlendEnable[0] = False; - RenderTargetWriteMask[0] = 0xF; -}; - -BlendState ShadowBlendV -{ - BlendEnable[0] = True; - SrcBlend = One; - DestBlend = Inv_Src_Alpha; - BlendOp = Add; - SrcBlendAlpha = One; - DestBlendAlpha = Inv_Src_Alpha; - BlendOpAlpha = Add; - RenderTargetWriteMask[0] = 0xF; -}; - -BlendState bTextBlend -{ - AlphaToCoverageEnable = FALSE; - BlendEnable[0] = TRUE; - SrcBlend = Src1_Color; - DestBlend = Inv_Src1_Color; - BlendOp = Add; - SrcBlendAlpha = Src1_Alpha; - DestBlendAlpha = Inv_Src1_Alpha; - BlendOpAlpha = Add; - RenderTargetWriteMask[0] = 0x0F; // All -}; - -VS_OUTPUT SampleTextureVS(float3 pos : POSITION) -{ - VS_OUTPUT Output; - Output.Position.w = 1.0f; - Output.Position.x = pos.x * QuadDesc.z + QuadDesc.x; - Output.Position.y = pos.y * QuadDesc.w + QuadDesc.y; - Output.Position.z = 0; - Output.TexCoord.x = pos.x * TexCoords.z + TexCoords.x; - Output.TexCoord.y = pos.y * TexCoords.w + TexCoords.y; - Output.MaskTexCoord.x = pos.x * MaskTexCoords.z + MaskTexCoords.x; - Output.MaskTexCoord.y = pos.y * MaskTexCoords.w + MaskTexCoords.y; - return Output; -} - -VS_RADIAL_OUTPUT SampleRadialVS(float3 pos : POSITION) -{ - VS_RADIAL_OUTPUT Output; - Output.Position.w = 1.0f; - Output.Position.x = pos.x * QuadDesc.z + QuadDesc.x; - Output.Position.y = pos.y * QuadDesc.w + QuadDesc.y; - Output.Position.z = 0; - Output.MaskTexCoord.x = pos.x * MaskTexCoords.z + MaskTexCoords.x; - Output.MaskTexCoord.y = pos.y * MaskTexCoords.w + MaskTexCoords.y; - - // For the radial gradient pixel shader we need to pass in the pixel's - // coordinates in user space for the color to be correctly determined. - - Output.PixelCoord.x = ((Output.Position.x + 1.0f) / 2.0f) * dimensions.x; - Output.PixelCoord.y = ((1.0f - Output.Position.y) / 2.0f) * dimensions.y; - Output.PixelCoord.xy = mul(float3(Output.PixelCoord.x, Output.PixelCoord.y, 1.0f), DeviceSpaceToUserSpace).xy; - return Output; -} - -VS_CONIC_OUTPUT SampleConicVS(float3 pos : POSITION) -{ - VS_CONIC_OUTPUT Output; - Output.Position.w = 1.0f; - Output.Position.x = pos.x * QuadDesc.z + QuadDesc.x; - Output.Position.y = pos.y * QuadDesc.w + QuadDesc.y; - Output.Position.z = 0; - Output.MaskTexCoord.x = pos.x * MaskTexCoords.z + MaskTexCoords.x; - Output.MaskTexCoord.y = pos.y * MaskTexCoords.w + MaskTexCoords.y; - - // For the conic gradient pixel shader we need to pass in the pixel's - // coordinates in user space for the color to be correctly determined. - - Output.PixelCoord.x = ((Output.Position.x + 1.0f) / 2.0f) * dimensions_cb3.x; - Output.PixelCoord.y = ((1.0f - Output.Position.y) / 2.0f) * dimensions_cb3.y; - Output.PixelCoord.xy = mul(float3(Output.PixelCoord.x, Output.PixelCoord.y, 1.0f), DeviceSpaceToUserSpace_cb3).xy; - return Output; -} - -float Screen(float a, float b) -{ - return 1 - ((1 - a)*(1 - b)); -} - -static float RedLuminance = 0.3f; -static float GreenLuminance = 0.59f; -static float BlueLuminance = 0.11f; - -float Lum(float3 C) -{ - return RedLuminance * C.r + GreenLuminance * C.g + BlueLuminance * C.b; -} - -float3 ClipColor(float3 C) -{ - float L = Lum(C); - float n = min(min(C.r, C.g), C.b); - float x = max(max(C.r, C.g), C.b); - - if(n < 0) - C = L + (((C - L) * L) / (L - n)); - - if(x > 1) - C = L + ((C - L) * (1 - L) / (x - L)); - - return C; -} - -float3 SetLum(float3 C, float l) -{ - float d = l - Lum(C); - C = C + d; - return ClipColor(C); -} - -float Sat(float3 C) -{ - return max(C.r, max(C.g, C.b)) - min(C.r, min(C.g, C.b)); -} - -void SetSatComponents(inout float minComp, inout float midComp, inout float maxComp, in float satVal) -{ - midComp -= minComp; - maxComp -= minComp; - minComp = 0.0; - if (maxComp > 0.0) - { - midComp *= satVal/maxComp; - maxComp = satVal; - } -} - -float3 SetSat(float3 color, in float satVal) -{ - if (color.x <= color.y) { - if (color.y <= color.z) { - // x <= y <= z - SetSatComponents(color.x, color.y, color.z, satVal); - } - else { - if (color.x <= color.z) { - // x <= z <= y - SetSatComponents(color.x, color.z, color.y, satVal); - } - else { - // z <= x <= y - SetSatComponents(color.z, color.x, color.y, satVal); - } - } - } - else { - if (color.x <= color.z) { - // y <= x <= z - SetSatComponents(color.y, color.x, color.z, satVal); - } - else { - if (color.y <= color.z) { - // y <= z <= x - SetSatComponents(color.y, color.z, color.x, satVal); - } - else { - // z <= y <= x - SetSatComponents(color.z, color.y, color.x, satVal); - } - } - } - - return color; -} - -float4 SampleBlendTextureSeparablePS_1( VS_OUTPUT In) : SV_Target -{ - float4 output = tex.Sample(sSampler, In.TexCoord); - float4 background = bcktex.Sample(sBckSampler, In.TexCoord); - if((output.a == 0) || (background.a == 0)) - return output; - - output.rgb /= output.a; - background.rgb /= background.a; - - float4 retval = output; - - if(blendop == 1) { // multiply - retval.rgb = output.rgb * background.rgb; - } else if(blendop == 2) { - retval.rgb = output.rgb + background.rgb - output.rgb * background.rgb; - } else if(blendop == 3) { - if(background.r <= 0.5) - retval.r = 2*background.r * output.r; - else - retval.r = Screen(output.r, 2 * background.r - 1); - if(background.g <= 0.5) - retval.g = 2 * background.g * output.g; - else - retval.g = Screen(output.g, 2 * background.g - 1); - if(background.b <= 0.5) - retval.b = 2 * background.b * output.b; - else - retval.b = Screen(output.b, 2 * background.b - 1); - } else if(blendop == 4) { - retval.rgb = min(output.rgb, background.rgb); - } else if(blendop == 5) { - retval.rgb = max(output.rgb, background.rgb); - } else { - if(background.r == 0) - retval.r = 0; - else - if(output.r == 1) - retval.r = 1; - else - retval.r = min(1, background.r / (1 - output.r)); - if(background.g == 0) - retval.g = 0; - else - if(output.g == 1) - retval.g = 1; - else - retval.g = min(1, background.g / (1 - output.g)); - if(background.b == 0) - retval.b = 0; - else - if(output.b == 1) - retval.b = 1; - else - retval.b = min(1, background.b / (1 - output.b)); - } - - output.rgb = ((1 - background.a) * output.rgb + background.a * retval.rgb) * output.a; - return output; -} - -float4 SampleBlendTextureSeparablePS_2( VS_OUTPUT In) : SV_Target -{ - float4 output = tex.Sample(sSampler, In.TexCoord); - float4 background = bcktex.Sample(sBckSampler, In.TexCoord); - if((output.a == 0) || (background.a == 0)) - return output; - - output.rgb /= output.a; - background.rgb /= background.a; - - float4 retval = output; - - if(blendop == 7) { - if(background.r == 1) - retval.r = 1; - else - if(output.r == 0) - retval.r = 0; - else - retval.r = 1 - min(1, (1 - background.r) / output.r); - if(background.g == 1) - retval.g = 1; - else - if(output.g == 0) - retval.g = 0; - else - retval.g = 1 - min(1, (1 - background.g) / output.g); - if(background.b == 1) - retval.b = 1; - else - if(output.b == 0) - retval.b = 0; - else - retval.b = 1 - min(1, (1 - background.b) / output.b); - } else if(blendop == 8) { - if(output.r <= 0.5) - retval.r = 2 * output.r * background.r; - else - retval.r = Screen(background.r, 2 * output.r -1); - if(output.g <= 0.5) - retval.g = 2 * output.g * background.g; - else - retval.g = Screen(background.g, 2 * output.g -1); - if(output.b <= 0.5) - retval.b = 2 * output.b * background.b; - else - retval.b = Screen(background.b, 2 * output.b -1); - } else if(blendop == 9){ - float D; - if(background.r <= 0.25) - D = ((16 * background.r - 12) * background.r + 4) * background.r; - else - D = sqrt(background.r); - if(output.r <= 0.5) - retval.r = background.r - (1 - 2 * output.r) * background.r * (1 - background.r); - else - retval.r = background.r + (2 * output.r - 1) * (D - background.r); - - if(background.g <= 0.25) - D = ((16 * background.g - 12) * background.g + 4) * background.g; - else - D = sqrt(background.g); - if(output.g <= 0.5) - retval.g = background.g - (1 - 2 * output.g) * background.g * (1 - background.g); - else - retval.g = background.g + (2 * output.g - 1) * (D - background.g); - - if(background.b <= 0.25) - D = ((16 * background.b - 12) * background.b + 4) * background.b; - else - D = sqrt(background.b); - - if(output.b <= 0.5) - retval.b = background.b - (1 - 2 * output.b) * background.b * (1 - background.b); - else - retval.b = background.b + (2 * output.b - 1) * (D - background.b); - } else if(blendop == 10) { - retval.rgb = abs(output.rgb - background.rgb); - } else { - retval.rgb = output.rgb + background.rgb - 2 * output.rgb * background.rgb; - } - - output.rgb = ((1 - background.a) * output.rgb + background.a * retval.rgb) * output.a; - return output; -} - -float4 SampleBlendTextureNonSeparablePS( VS_OUTPUT In) : SV_Target -{ - float4 output = tex.Sample(sSampler, In.TexCoord); - float4 background = bcktex.Sample(sBckSampler, In.TexCoord); - if((output.a == 0) || (background.a == 0)) - return output; - - output.rgb /= output.a; - background.rgb /= background.a; - - float4 retval = output; - - if(blendop == 12) { - retval.rgb = SetLum(SetSat(output.rgb, Sat(background.rgb)), Lum(background.rgb)); - } else if(blendop == 13) { - retval.rgb = SetLum(SetSat(background.rgb, Sat(output.rgb)), Lum(background.rgb)); - } else if(blendop == 14) { - retval.rgb = SetLum(output.rgb, Lum(background.rgb)); - } else { - retval.rgb = SetLum(background.rgb, Lum(output.rgb)); - } - - output.rgb = ((1 - background.a) * output.rgb + background.a * retval.rgb) * output.a; - return output; -} - - -float4 SampleTexturePS( VS_OUTPUT In) : SV_Target -{ - return tex.Sample(sSampler, In.TexCoord); -} - -float4 SampleMaskTexturePS( VS_OUTPUT In) : SV_Target -{ - return tex.Sample(sSampler, In.TexCoord) * mask.Sample(sMaskSampler, In.MaskTexCoord).a; -} - -float4 SampleRadialGradientPS(VS_RADIAL_OUTPUT In, uniform sampler aSampler) : SV_Target -{ - // Radial gradient painting is defined as the set of circles whose centers - // are described by C(t) = (C2 - C1) * t + C1; with radii - // R(t) = (R2 - R1) * t + R1; for R(t) > 0. This shader solves the - // quadratic equation that arises when calculating t for pixel (x, y). - // - // A more extensive derrivation can be found in the pixman radial gradient - // code. - - float2 p = In.PixelCoord; - float3 dp = float3(p - center1, radius1); - - // dpx * dcx + dpy * dcy + r * dr - float B = dot(dp, diff); - - float C = pow(dp.x, 2) + pow(dp.y, 2) - sq_radius1; - - float det = pow(B, 2) - A * C; - - if (det < 0) { - return float4(0, 0, 0, 0); - } - - float sqrt_det = sqrt(abs(det)); - - float2 t = (B + float2(sqrt_det, -sqrt_det)) / A; - - float2 isValid = step(float2(-radius1, -radius1), t * diff.z); - - if (max(isValid.x, isValid.y) <= 0) { - return float4(0, 0, 0, 0); - } - - float upper_t = lerp(t.y, t.x, isValid.x); - - float4 output = tex.Sample(aSampler, float2(upper_t, 0.5)); - // Premultiply - output.rgb *= output.a; - // Multiply the output color by the input mask for the operation. - output *= mask.Sample(sMaskSampler, In.MaskTexCoord).a; - return output; -}; - -float4 SampleRadialGradientA0PS( VS_RADIAL_OUTPUT In, uniform sampler aSampler ) : SV_Target -{ - // This simpler shader is used for the degenerate case where A is 0, - // i.e. we're actually solving a linear equation. - - float2 p = In.PixelCoord; - float3 dp = float3(p - center1, radius1); - - // dpx * dcx + dpy * dcy + r * dr - float B = dot(dp, diff); - - float C = pow(dp.x, 2) + pow(dp.y, 2) - pow(radius1, 2); - - float t = 0.5 * C / B; - - if (-radius1 >= t * diff.z) { - return float4(0, 0, 0, 0); - } - - float4 output = tex.Sample(aSampler, float2(t, 0.5)); - // Premultiply - output.rgb *= output.a; - // Multiply the output color by the input mask for the operation. - output *= mask.Sample(sMaskSampler, In.MaskTexCoord).a; - return output; -}; - -float4 SampleConicGradientPS(VS_CONIC_OUTPUT In, uniform sampler aSampler) : SV_Target -{ - float2 current_dir = In.PixelCoord - center; - float current_angle = atan2(current_dir.y, current_dir.x) + (3.141592 / 2.0 - angle); - float offset = fmod(current_angle / (2.0 * 3.141592), 1.0) - start_offset; - offset = offset / (end_offset - start_offset); - - float upper_t = lerp(0, 1, offset); - - float4 output = tex.Sample(aSampler, float2(upper_t, 0.5)); - // Premultiply - output.rgb *= output.a; - // Multiply the output color by the input mask for the operation. - output *= mask.Sample(sMaskSampler, In.MaskTexCoord).a; - return output; -}; - -float4 SampleShadowHPS( VS_OUTPUT In) : SV_Target -{ - float outputStrength = 0; - - outputStrength += BlurWeights[0].x * tex.Sample(sShadowSampler, float2(In.TexCoord.x + BlurOffsetsH[0].x, In.TexCoord.y)).a; - outputStrength += BlurWeights[0].y * tex.Sample(sShadowSampler, float2(In.TexCoord.x + BlurOffsetsH[0].y, In.TexCoord.y)).a; - outputStrength += BlurWeights[0].z * tex.Sample(sShadowSampler, float2(In.TexCoord.x + BlurOffsetsH[0].z, In.TexCoord.y)).a; - outputStrength += BlurWeights[0].w * tex.Sample(sShadowSampler, float2(In.TexCoord.x + BlurOffsetsH[0].w, In.TexCoord.y)).a; - outputStrength += BlurWeights[1].x * tex.Sample(sShadowSampler, float2(In.TexCoord.x + BlurOffsetsH[1].x, In.TexCoord.y)).a; - outputStrength += BlurWeights[1].y * tex.Sample(sShadowSampler, float2(In.TexCoord.x + BlurOffsetsH[1].y, In.TexCoord.y)).a; - outputStrength += BlurWeights[1].z * tex.Sample(sShadowSampler, float2(In.TexCoord.x + BlurOffsetsH[1].z, In.TexCoord.y)).a; - outputStrength += BlurWeights[1].w * tex.Sample(sShadowSampler, float2(In.TexCoord.x + BlurOffsetsH[1].w, In.TexCoord.y)).a; - outputStrength += BlurWeights[2].x * tex.Sample(sShadowSampler, float2(In.TexCoord.x + BlurOffsetsH[2].x, In.TexCoord.y)).a; - - return ShadowColor * outputStrength; -}; - -float4 SampleShadowVPS( VS_OUTPUT In) : SV_Target -{ - float4 outputColor = float4(0, 0, 0, 0); - - outputColor += BlurWeights[0].x * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[0].x)); - outputColor += BlurWeights[0].y * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[0].y)); - outputColor += BlurWeights[0].z * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[0].z)); - outputColor += BlurWeights[0].w * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[0].w)); - outputColor += BlurWeights[1].x * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[1].x)); - outputColor += BlurWeights[1].y * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[1].y)); - outputColor += BlurWeights[1].z * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[1].z)); - outputColor += BlurWeights[1].w * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[1].w)); - outputColor += BlurWeights[2].x * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[2].x)); - - return outputColor; -}; - -float4 SampleMaskShadowVPS( VS_OUTPUT In) : SV_Target -{ - float4 outputColor = float4(0, 0, 0, 0); - - outputColor += BlurWeights[0].x * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[0].x)); - outputColor += BlurWeights[0].y * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[0].y)); - outputColor += BlurWeights[0].z * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[0].z)); - outputColor += BlurWeights[0].w * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[0].w)); - outputColor += BlurWeights[1].x * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[1].x)); - outputColor += BlurWeights[1].y * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[1].y)); - outputColor += BlurWeights[1].z * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[1].z)); - outputColor += BlurWeights[1].w * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[1].w)); - outputColor += BlurWeights[2].x * tex.Sample(sShadowSampler, float2(In.TexCoord.x, In.TexCoord.y + BlurOffsetsV[2].x)); - - return outputColor * mask.Sample(sMaskSampler, In.MaskTexCoord).a; -}; - -PS_TEXT_OUTPUT SampleTextTexturePS( VS_OUTPUT In) : SV_Target -{ - PS_TEXT_OUTPUT output; - output.color = float4(TextColor.r, TextColor.g, TextColor.b, 1.0); - output.alpha.rgba = tex.Sample(sSampler, In.TexCoord).bgrg * TextColor.a; - return output; -}; - -PS_TEXT_OUTPUT SampleTextTexturePSMasked( VS_OUTPUT In) : SV_Target -{ - PS_TEXT_OUTPUT output; - - float maskValue = mask.Sample(sMaskSampler, In.MaskTexCoord).a; - - output.color = float4(TextColor.r, TextColor.g, TextColor.b, 1.0); - output.alpha.rgba = tex.Sample(sSampler, In.TexCoord).bgrg * TextColor.a * maskValue; - - return output; -}; - -technique10 SampleTexture -{ - pass P0 - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleTextureVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleTexturePS())); - } -} - -technique10 SampleTextureForSeparableBlending_1 -{ - pass P0 - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleTextureVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleBlendTextureSeparablePS_1())); - } -} - -technique10 SampleTextureForSeparableBlending_2 -{ - pass P0 - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleTextureVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleBlendTextureSeparablePS_2())); - } -} - -technique10 SampleTextureForNonSeparableBlending -{ - pass P0 - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleTextureVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleBlendTextureNonSeparablePS())); - } -} - -technique10 SampleRadialGradient -{ - pass APos - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleRadialVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleRadialGradientPS( sSampler ))); - } - pass A0 - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleRadialVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleRadialGradientA0PS( sSampler ))); - } - pass APosWrap - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleRadialVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleRadialGradientPS( sWrapSampler ))); - } - pass A0Wrap - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleRadialVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleRadialGradientA0PS( sWrapSampler ))); - } - pass APosMirror - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleRadialVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleRadialGradientPS( sMirrorSampler ))); - } - pass A0Mirror - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleRadialVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleRadialGradientA0PS( sMirrorSampler ))); - } -} - -technique10 SampleConicGradient -{ - pass APos - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleConicVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleConicGradientPS( sSampler ))); - } - pass APosWrap - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleConicVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleConicGradientPS( sWrapSampler ))); - } - pass APosMirror - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleConicVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleConicGradientPS( sMirrorSampler ))); - } -} - -technique10 SampleMaskedTexture -{ - pass P0 - { - SetRasterizerState(TextureRast); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleTextureVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleMaskTexturePS())); - } -} - -technique10 SampleTextureWithShadow -{ - // Horizontal pass - pass P0 - { - SetRasterizerState(TextureRast); - SetBlendState(ShadowBlendH, float4(1.0f, 1.0f, 1.0f, 1.0f), 0xffffffff); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleTextureVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleShadowHPS())); - } - // Vertical pass - pass P1 - { - SetRasterizerState(TextureRast); - SetBlendState(ShadowBlendV, float4(1.0f, 1.0f, 1.0f, 1.0f), 0xffffffff); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleTextureVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleShadowVPS())); - } - // Vertical pass - used when using a mask - pass P2 - { - SetRasterizerState(TextureRast); - SetBlendState(ShadowBlendV, float4(1.0f, 1.0f, 1.0f, 1.0f), 0xffffffff); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleTextureVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleMaskShadowVPS())); - } -} - -technique10 SampleTextTexture -{ - pass Unmasked - { - SetRasterizerState(TextureRast); - SetBlendState(bTextBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleTextureVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleTextTexturePS())); - } - pass Masked - { - SetRasterizerState(TextureRast); - SetBlendState(bTextBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); - SetVertexShader(CompileShader(vs_4_0_level_9_3, SampleTextureVS())); - SetGeometryShader(NULL); - SetPixelShader(CompileShader(ps_4_0_level_9_3, SampleTextTexturePSMasked())); - } -} - diff --git a/gfx/2d/ShadersD2D.h b/gfx/2d/ShadersD2D.h @@ -1,10855 +0,0 @@ -#if 0 -// -// FX Version: fx_4_0 -// Child effect (requires effect pool): false -// -// 5 local buffer(s) -// -cbuffer $Globals -{ - uint blendop; // Offset: 0, size: 4 -} - -cbuffer cb0 -{ - float4 QuadDesc; // Offset: 0, size: 16 - float4 TexCoords; // Offset: 16, size: 16 - float4 MaskTexCoords; // Offset: 32, size: 16 - float4 TextColor; // Offset: 48, size: 16 -} - -cbuffer cb1 -{ - float4 BlurOffsetsH[3]; // Offset: 0, size: 48 - float4 BlurOffsetsV[3]; // Offset: 48, size: 48 - float4 BlurWeights[3]; // Offset: 96, size: 48 - float4 ShadowColor; // Offset: 144, size: 16 -} - -cbuffer cb2 -{ - float3x3 DeviceSpaceToUserSpace; // Offset: 0, size: 44 - float2 dimensions; // Offset: 48, size: 8 - float3 diff; // Offset: 64, size: 12 - float2 center1; // Offset: 80, size: 8 - float A; // Offset: 88, size: 4 - float radius1; // Offset: 92, size: 4 - float sq_radius1; // Offset: 96, size: 4 -} - -cbuffer cb3 -{ - float3x3 DeviceSpaceToUserSpace_cb3;// Offset: 0, size: 44 - float2 dimensions_cb3; // Offset: 48, size: 8 - float2 center; // Offset: 56, size: 8 - float angle; // Offset: 64, size: 4 - float start_offset; // Offset: 68, size: 4 - float end_offset; // Offset: 72, size: 4 -} - -// -// 13 local object(s) -// -Texture2D tex; -Texture2D bcktex; -Texture2D mask; -SamplerState sSampler -{ - Filter = uint(MIN_MAG_MIP_LINEAR /* 21 */); - Texture = tex; - AddressU = uint(CLAMP /* 3 */); - AddressV = uint(CLAMP /* 3 */); -}; -SamplerState sBckSampler -{ - Filter = uint(MIN_MAG_MIP_LINEAR /* 21 */); - Texture = bcktex; - AddressU = uint(CLAMP /* 3 */); - AddressV = uint(CLAMP /* 3 */); -}; -SamplerState sWrapSampler -{ - Filter = uint(MIN_MAG_MIP_LINEAR /* 21 */); - Texture = tex; - AddressU = uint(WRAP /* 1 */); - AddressV = uint(WRAP /* 1 */); -}; -SamplerState sMirrorSampler -{ - Filter = uint(MIN_MAG_MIP_LINEAR /* 21 */); - Texture = tex; - AddressU = uint(MIRROR /* 2 */); - AddressV = uint(MIRROR /* 2 */); -}; -SamplerState sMaskSampler -{ - Filter = uint(MIN_MAG_MIP_LINEAR /* 21 */); - Texture = mask; - AddressU = uint(CLAMP /* 3 */); - AddressV = uint(CLAMP /* 3 */); -}; -SamplerState sShadowSampler -{ - Filter = uint(MIN_MAG_MIP_LINEAR /* 21 */); - Texture = tex; - AddressU = uint(BORDER /* 4 */); - AddressV = uint(BORDER /* 4 */); - BorderColor = float4(0, 0, 0, 0); -}; -RasterizerState TextureRast -{ - ScissorEnable = bool(TRUE /* 1 */); - CullMode = uint(NONE /* 1 */); -}; -BlendState ShadowBlendH -{ - BlendEnable[0] = bool(FALSE /* 0 */); - RenderTargetWriteMask[0] = byte(0x0f); -}; -BlendState ShadowBlendV -{ - BlendEnable[0] = bool(TRUE /* 1 */); - SrcBlend[0] = uint(ONE /* 2 */); - DestBlend[0] = uint(INV_SRC_ALPHA /* 6 */); - BlendOp[0] = uint(ADD /* 1 */); - SrcBlendAlpha[0] = uint(ONE /* 2 */); - DestBlendAlpha[0] = uint(INV_SRC_ALPHA /* 6 */); - BlendOpAlpha[0] = uint(ADD /* 1 */); - RenderTargetWriteMask[0] = byte(0x0f); -}; -BlendState bTextBlend -{ - AlphaToCoverageEnable = bool(FALSE /* 0 */); - BlendEnable[0] = bool(TRUE /* 1 */); - SrcBlend[0] = uint(SRC1_COLOR /* 16 */); - DestBlend[0] = uint(INV_SRC1_COLOR /* 17 */); - BlendOp[0] = uint(ADD /* 1 */); - SrcBlendAlpha[0] = uint(SRC1_ALPHA /* 18 */); - DestBlendAlpha[0] = uint(INV_SRC1_ALPHA /* 19 */); - BlendOpAlpha[0] = uint(ADD /* 1 */); - RenderTargetWriteMask[0] = byte(0x0f); -}; - -// -// 9 technique(s) -// -technique10 SampleTexture -{ - pass P0 - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c4, 0, 1, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx - mad r0.xy, v0, c1.zwzw, c1 - add oPos.xy, r0, c0 - mov oPos.zw, c4.xyxy - - // approximately 5 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.zw, l(0,0,0,1.000000) - mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy - ret - // Approximately 5 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sSampler sampler NA NA 0 1 - // tex texture float4 2d 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0 - dcl_2d s0 - texld r0, t0, s0 - mov oC0, r0 - - // approximately 2 instruction slots used (1 texture, 1 arithmetic) - ps_4_0 - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - sample o0.xyzw, v1.xyxx, t0.xyzw, s0 - ret - // Approximately 2 instruction slots used - - }; - } - -} - -technique10 SampleTextureForSeparableBlending_1 -{ - pass P0 - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c4, 0, 1, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx - mad r0.xy, v0, c1.zwzw, c1 - add oPos.xy, r0, c0 - mov oPos.zw, c4.xyxy - - // approximately 5 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.zw, l(0,0,0,1.000000) - mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy - ret - // Approximately 5 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer $Globals - // { - // - // uint blendop; // Offset: 0 Size: 4 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sSampler sampler NA NA 0 1 - // sBckSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // bcktex texture float4 2d 1 1 - // $Globals cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 0 1 (UINT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c1, -1, -2, -3, -4 - def c2, 1, 0, 0.5, -2 - def c3, -5, 0, 0, 0 - dcl t0 - dcl_2d s0 - dcl_2d s1 - mov r0.w, c0.x - add r0.x, r0.w, c3.x - mul r0.x, r0.x, r0.x - texld r1, t0, s1 - texld r2, t0, s0 - rcp r0.y, r2.w - mad r3.xyz, r2, r0.y, -c2.x - mul r3.xyz, r3, r3 - mad r4.xyz, r2, -r0.y, c2.x - rcp r3.w, r4.x - rcp r4.w, r1.w - mul r5.xyz, r1, r4.w - mad r1.xyz, r1, -r4.w, c2.z - mul r3.w, r3.w, r5.x - min r4.w, r3.w, c2.x - cmp r4.w, -r3.x, c2.x, r4.w - mul r6.xyz, r5, r5 - cmp r7.x, -r6.x, c2.y, r4.w - rcp r4.w, r4.y - mul r4.w, r4.w, r5.y - min r5.w, r4.w, c2.x - cmp r4.w, -r3.y, c2.x, r5.w - cmp r7.y, -r6.y, c2.y, r4.w - rcp r4.w, r4.z - mul r4.w, r4.w, r5.z - min r5.w, r4.w, c2.x - cmp r4.w, -r3.z, c2.x, r5.w - cmp r7.z, -r6.z, c2.y, r4.w - mul r3.xyz, r0.y, r2 - mad r6.xyz, r2, r0.y, r5 - mad r6.xyz, r3, -r5, r6 - max r8.xyz, r3, r5 - cmp r0.xyz, -r0.x, r8, r7 - add r7, r0.w, c1 - mul r7, r7, r7 - min r8.xyz, r5, r3 - cmp r0.xyz, -r7.w, r8, r0 - mad r8.xyz, r5, -c2.w, -c2.x - add r8.xyz, -r8, c2.x - mad r4.xyz, r4, -r8, c2.x - add r8.xyz, r5, r5 - mul r5.xyz, r5, r3 - mul r8.xyz, r3, r8 - cmp r1.xyz, r1, r8, r4 - cmp r0.xyz, -r7.z, r1, r0 - cmp r0.xyz, -r7.y, r6, r0 - cmp r0.xyz, -r7.x, r5, r0 - lrp r4.xyz, r1.w, r0, r3 - mul r4.w, r1.w, r1.w - cmp r4.w, -r4.w, c2.x, c2.y - mul r0.xyz, r2.w, r4 - mul r0.w, r2.w, r2.w - cmp r0.w, -r0.w, c2.x, c2.y - add r0.w, r4.w, r0.w - cmp r2.xyz, -r0.w, r0, r2 - mov oC0, r2 - - // approximately 56 instruction slots used (2 texture, 54 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[1], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_temps 7 - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - sample r1.xyzw, v1.xyxx, t1.xyzw, s1 - eq r2.x, r0.w, l(0.000000) - eq r2.y, r1.w, l(0.000000) - or r2.x, r2.y, r2.x - if_nz r2.x - mov o0.xyzw, r0.xyzw - ret - endif - div r0.xyz, r0.xyzx, r0.wwww - div r1.xyz, r1.xyzx, r1.wwww - ieq r2.x, cb0[0].x, l(1) - if_nz r2.x - mul r2.xyz, r0.xyzx, r1.xyzx - else - ieq r2.w, cb0[0].x, l(2) - if_nz r2.w - add r3.xyz, r0.xyzx, r1.xyzx - mad r2.xyz, -r0.xyzx, r1.xyzx, r3.xyzx - else - ieq r2.w, cb0[0].x, l(3) - if_nz r2.w - ge r3.xyz, l(0.500000, 0.500000, 0.500000, 0.000000), r1.xyzx - add r4.xyz, r1.xyzx, r1.xyzx - mul r4.xyz, r0.xyzx, r4.xyzx - mad r5.xyz, r1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) - add r6.xyz, -r0.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - add r5.xyz, -r5.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - mad r5.xyz, -r6.xyzx, r5.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - movc r2.xyz, r3.xyzx, r4.xyzx, r5.xyzx - else - ieq r2.w, cb0[0].x, l(4) - if_nz r2.w - min r2.xyz, r0.xyzx, r1.xyzx - else - ieq r2.w, cb0[0].x, l(5) - if_nz r2.w - max r2.xyz, r0.xyzx, r1.xyzx - else - eq r3.xyz, r1.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) - eq r4.xyz, r0.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - add r5.xyz, -r0.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - div r1.xyz, r1.xyzx, r5.xyzx - min r1.xyz, r1.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - movc r1.xyz, r4.xyzx, l(1.000000,1.000000,1.000000,0), r1.xyzx - movc r2.xyz, r3.xyzx, l(0,0,0,0), r1.xyzx - endif - endif - endif - endif - endif - add r1.x, -r1.w, l(1.000000) - mul r1.yzw, r1.wwww, r2.xxyz - mad r0.xyz, r1.xxxx, r0.xyzx, r1.yzwy - mul o0.xyz, r0.wwww, r0.xyzx - mov o0.w, r0.w - ret - // Approximately 57 instruction slots used - - }; - } - -} - -technique10 SampleTextureForSeparableBlending_2 -{ - pass P0 - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c4, 0, 1, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx - mad r0.xy, v0, c1.zwzw, c1 - add oPos.xy, r0, c0 - mov oPos.zw, c4.xyxy - - // approximately 5 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.zw, l(0,0,0,1.000000) - mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy - ret - // Approximately 5 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer $Globals - // { - // - // uint blendop; // Offset: 0 Size: 4 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sSampler sampler NA NA 0 1 - // sBckSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // bcktex texture float4 2d 1 1 - // $Globals cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 0 1 (UINT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c1, -7, -8, -9, -10 - def c2, 1, 0, -1, 0.25 - def c3, 0.5, 2, -1, 4 - def c4, 16, -12, 2, 1 - dcl t0 - dcl_2d s0 - dcl_2d s1 - mov r0.w, c0.x - add r0, r0.w, c1 - mul r0, r0, r0 - texld r1, t0, s0 - texld r2, t0, s1 - rcp r3.w, r2.w - mad r3.xy, r2.yzzw, -r3.w, c2.w - mul r4.xyz, r2, r3.w - mad r5.xyz, r4, c4.x, c4.y - mad r5.xyz, r5, r4, c3.w - mul r5.xyz, r4, r5 - rsq r4.w, r4.y - rcp r4.w, r4.w - cmp r4.w, r3.x, r5.y, r4.w - mad r4.w, r2.y, -r3.w, r4.w - rcp r3.x, r1.w - mul r6.xyz, r1, r3.x - mad r7.xyz, r6, c3.y, c3.z - mad r4.w, r7.y, r4.w, r4.y - mad r8.xyz, r1, -r3.x, c3.x - mad r9, r2.xyzx, -r3.w, c2.xxxw - mad r10.xyz, r6, -c4.z, c4.w - mul r10.xyz, r4, r10 - mad r10.xyz, r10, -r9, r4 - cmp r11.y, r8.y, r10.y, r4.w - rsq r4.w, r4.z - rcp r4.w, r4.w - cmp r4.w, r3.y, r5.z, r4.w - mad r4.w, r2.z, -r3.w, r4.w - mad r4.w, r7.z, r4.w, r4.z - cmp r11.z, r8.z, r10.z, r4.w - rsq r4.w, r4.x - rcp r4.w, r4.w - cmp r4.w, r9.w, r5.x, r4.w - mad r4.w, r2.x, -r3.w, r4.w - mad r2.xyz, r2, r3.w, c2.z - mul r2.xyz, r2, r2 - mad r4.w, r7.x, r4.w, r4.x - add r3.yzw, -r7.xxyz, c2.x - mad r3.yzw, r9.xxyz, -r3, c2.x - cmp r11.x, r8.x, r10.x, r4.w - mad r5.xyz, r1, r3.x, -r4 - mad r7.xyz, r1, r3.x, r4 - abs r5.xyz, r5 - mul r10.xyz, r4, r6 - mad r7.xyz, r10, -c3.y, r7 - cmp r5.xyz, -r0.w, r5, r7 - cmp r5.xyz, -r0.z, r11, r5 - add r7.xyz, r6, r6 - mul r4.xyz, r4, r7 - cmp r3.xyz, r8, r4, r3.yzww - cmp r0.yzw, -r0.y, r3.xxyz, r5.xxyz - rcp r6.w, r6.x - mad r6.w, r9.x, -r6.w, c2.x - max r3.x, r6.w, c2.y - mul r3.yzw, r6.xxyz, r6.xxyz - cmp r6.w, -r3.y, c2.y, r3.x - cmp r4.x, -r2.x, c2.x, r6.w - rcp r4.w, r6.y - mad r4.w, r9.y, -r4.w, c2.x - max r6.w, r4.w, c2.y - cmp r4.w, -r3.z, c2.y, r6.w - cmp r4.y, -r2.y, c2.x, r4.w - rcp r4.w, r6.z - mad r4.w, r9.z, -r4.w, c2.x - max r6.w, r4.w, c2.y - cmp r4.w, -r3.w, c2.y, r6.w - cmp r4.z, -r2.z, c2.x, r4.w - cmp r0.xyz, -r0.x, r4, r0.yzww - lrp r3.xyz, r2.w, r0, r6 - mul r3.w, r2.w, r2.w - cmp r3.w, -r3.w, c2.x, c2.y - mul r0.xyz, r1.w, r3 - mul r0.w, r1.w, r1.w - cmp r0.w, -r0.w, c2.x, c2.y - add r0.w, r3.w, r0.w - cmp r1.xyz, -r0.w, r0, r1 - mov oC0, r1 - - // approximately 78 instruction slots used (2 texture, 76 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[1], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_temps 7 - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - sample r1.xyzw, v1.xyxx, t1.xyzw, s1 - eq r2.x, r0.w, l(0.000000) - eq r2.y, r1.w, l(0.000000) - or r2.x, r2.y, r2.x - if_nz r2.x - mov o0.xyzw, r0.xyzw - ret - endif - div r0.xyz, r0.xyzx, r0.wwww - div r1.xyz, r1.xyzx, r1.wwww - ieq r2.x, cb0[0].x, l(7) - if_nz r2.x - eq r2.xyz, r1.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - eq r3.xyz, r0.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) - add r4.xyz, -r1.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - div r4.xyz, r4.xyzx, r0.xyzx - min r4.xyz, r4.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - add r4.xyz, -r4.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - movc r3.xyz, r3.xyzx, l(0,0,0,0), r4.xyzx - movc r2.xyz, r2.xyzx, l(1.000000,1.000000,1.000000,0), r3.xyzx - else - ieq r2.w, cb0[0].x, l(8) - if_nz r2.w - ge r3.xyz, l(0.500000, 0.500000, 0.500000, 0.000000), r0.xyzx - add r4.xyz, r0.xyzx, r0.xyzx - mul r4.xyz, r1.xyzx, r4.xyzx - mad r5.xyz, r0.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) - add r6.xyz, -r1.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - add r5.xyz, -r5.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - mad r5.xyz, -r6.xyzx, r5.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - movc r2.xyz, r3.xyzx, r4.xyzx, r5.xyzx - else - ieq r2.w, cb0[0].x, l(9) - if_nz r2.w - ge r3.xyz, l(0.250000, 0.250000, 0.250000, 0.000000), r1.xyzx - mad r4.xyz, r1.xyzx, l(16.000000, 16.000000, 16.000000, 0.000000), l(-12.000000, -12.000000, -12.000000, 0.000000) - mad r4.xyz, r4.xyzx, r1.xyzx, l(4.000000, 4.000000, 4.000000, 0.000000) - mul r4.xyz, r1.xyzx, r4.xyzx - sqrt r5.xyz, r1.xyzx - movc r3.xyz, r3.xyzx, r4.xyzx, r5.xyzx - ge r4.xyz, l(0.500000, 0.500000, 0.500000, 0.000000), r0.xyzx - mad r5.xyz, -r0.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(1.000000, 1.000000, 1.000000, 0.000000) - mul r5.xyz, r1.xyzx, r5.xyzx - add r6.xyz, -r1.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000) - mad r5.xyz, -r5.xyzx, r6.xyzx, r1.xyzx - mad r6.xyz, r0.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) - add r3.xyz, -r1.xyzx, r3.xyzx - mad r3.xyz, r6.xyzx, r3.xyzx, r1.xyzx - movc r2.xyz, r4.xyzx, r5.xyzx, r3.xyzx - else - ieq r2.w, cb0[0].x, l(10) - add r3.xyz, r0.xyzx, -r1.xyzx - add r4.xyz, r0.xyzx, r1.xyzx - mul r1.xyz, r0.xyzx, r1.xyzx - mad r1.xyz, -r1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), r4.xyzx - movc r2.xyz, r2.wwww, |r3.xyzx|, r1.xyzx - endif - endif - endif - add r1.x, -r1.w, l(1.000000) - mul r1.yzw, r1.wwww, r2.xxyz - mad r0.xyz, r1.xxxx, r0.xyzx, r1.yzwy - mul o0.xyz, r0.wwww, r0.xyzx - mov o0.w, r0.w - ret - // Approximately 66 instruction slots used - - }; - } - -} - -technique10 SampleTextureForNonSeparableBlending -{ - pass P0 - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c4, 0, 1, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx - mad r0.xy, v0, c1.zwzw, c1 - add oPos.xy, r0, c0 - mov oPos.zw, c4.xyxy - - // approximately 5 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.zw, l(0,0,0,1.000000) - mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy - ret - // Approximately 5 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer $Globals - // { - // - // uint blendop; // Offset: 0 Size: 4 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sSampler sampler NA NA 0 1 - // sBckSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // bcktex texture float4 2d 1 1 - // $Globals cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 0 1 (UINT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c1, -12, -13, -14, 0 - def c2, 1, 0, 0, 0 - def c3, 0.300000012, 0.589999974, 0.109999999, 0 - dcl t0 - dcl_2d s0 - dcl_2d s1 - mov r0.y, c2.y - mov r1.y, c2.y - mov r2.z, c2.y - texld r3, t0, s1 - texld r4, t0, s0 - rcp r0.w, r4.w - mul r5.xyz, r0.w, r4 - mad r6.xy, r4.yxzw, r0.w, -r5.zyzw - cmp r7.xy, r6.x, r5.yzzw, r5.zyzw - max r1.w, r5.x, r7.x - min r2.w, r7.y, r5.x - add r7.w, r1.w, -r2.w - rcp r1.w, r3.w - mul r8.xyz, r1.w, r3 - mad r9.xy, r3.x, r1.w, -r8.zyzw - rcp r2.w, r9.y - mul r2.w, r2.w, r7.w - mad r10, r3.zyyz, r1.w, -r8.xxzy - mul r7.y, r2.w, r10.w - mov r9.zw, r10 - cmp r1.xz, -r9.y, r9.yyww, r7.wyyw - rcp r2.w, r9.x - mul r2.w, r2.w, r7.w - mul r7.x, r2.w, r9.z - cmp r2.xy, -r9.x, r9.xzzw, r7.wxzw - cmp r1.xyz, r9.w, r1, r2 - rcp r5.w, r9.w - mul r5.w, r5.w, r7.w - mul r7.z, r5.w, r9.y - cmp r0.xz, -r10.w, r9.yyww, r7.zyww - cmp r0.xyz, r10.x, r0, r1 - mov r1.x, c2.y - mov r2.x, c2.y - mov r11.z, c2.y - rcp r2.w, r9.z - mul r2.w, r2.w, r7.w - mul r7.x, r2.w, r9.x - cmp r11.xy, -r10.z, r9.xzzw, r7.xwzw - rcp r2.w, r10.y - mul r2.w, r2.w, r7.w - mul r7.y, r2.w, r10.x - cmp r2.yz, -r10.y, r10.xyxw, r7.xwyw - cmp r2.xyz, r10.x, r2, r11 - rcp r2.w, r10.x - mul r2.w, r2.w, r7.w - mul r7.z, r2.w, r10.y - cmp r1.yz, -r10.x, r10.xyxw, r7.xzww - cmp r1.xyz, r9.w, r1, r2 - cmp r0.xyz, r10.y, r1, r0 - cmp r1.xy, r9.z, r8.yzzw, r8.zyzw - dp3 r5.w, r0, c3 - dp3 r1.z, r8, c3 - add r5.w, -r5.w, r1.z - add r0.xyz, r0, r5.w - add r5.w, -r0.y, r0.x - cmp r2.xy, r5.w, r0.yxzw, r0 - min r5.w, r0.z, r2.x - max r7.x, r2.y, r0.z - dp3 r2.x, r0, c3 - add r2.y, -r5.w, r2.x - rcp r2.y, r2.y - add r7.yzw, r0.xxyz, -r2.x - mul r7.yzw, r2.x, r7 - mad r2.yzw, r7, r2.y, r2.x - cmp r0.xyz, r5.w, r0, r2.yzww - add r2.yzw, -r2.x, r0.xxyz - add r5.w, -r2.x, c2.x - mul r2.yzw, r2, r5.w - add r5.w, -r2.x, r7.x - add r7.x, -r7.x, c2.x - rcp r5.w, r5.w - mad r2.xyz, r2.yzww, r5.w, r2.x - cmp r0.xyz, r7.x, r0, r2 - dp3 r5.w, r5, c3 - add r2.x, r1.z, -r5.w - add r5.w, -r1.z, r5.w - mad r2.yzw, r3.xxyz, r1.w, r5.w - mad r3.xyz, r4, r0.w, r2.x - mad r7, r4.zyzx, r0.w, -r5.xxyz - add r0.w, -r3.y, r3.x - cmp r8.yz, r0.w, r3.xyxw, r3.xxyw - min r0.w, r3.z, r8.y - max r1.w, r8.z, r3.z - dp3 r5.w, r3, c3 - add r2.x, -r0.w, r5.w - rcp r2.x, r2.x - add r8.yzw, r3.xxyz, -r5.w - mul r8.yzw, r5.w, r8 - mad r8.yzw, r8, r2.x, r5.w - cmp r3.xyz, r0.w, r3, r8.yzww - add r8.yzw, -r5.w, r3.xxyz - add r0.w, -r5.w, c2.x - mul r8.yzw, r0.w, r8 - add r0.w, r1.w, -r5.w - add r1.w, -r1.w, c2.x - rcp r0.w, r0.w - mad r8.yzw, r8, r0.w, r5.w - cmp r3.xyz, r1.w, r3, r8.yzww - add r0.w, -r2.z, r2.y - cmp r8.yz, r0.w, r2.xzyw, r2 - min r0.w, r2.w, r8.y - max r1.w, r8.z, r2.w - dp3 r5.w, r2.yzww, c3 - add r2.x, -r0.w, r5.w - rcp r2.x, r2.x - add r8.yzw, r2, -r5.w - mul r8.yzw, r5.w, r8 - mad r8.yzw, r8, r2.x, r5.w - cmp r2.xyz, r0.w, r2.yzww, r8.yzww - add r8.yzw, -r5.w, r2.xxyz - add r0.w, -r5.w, c2.x - mul r8.yzw, r0.w, r8 - add r0.w, r1.w, -r5.w - add r1.w, -r1.w, c2.x - rcp r0.w, r0.w - mad r8.yzw, r8, r0.w, r5.w - cmp r2.xyz, r1.w, r2, r8.yzww - mov r0.w, c0.x - add r8.yzw, r0.w, c1.xxyz - mul r8.yzw, r8, r8 - cmp r2.xyz, -r8.w, r3, r2 - cmp r0.xyz, -r8.z, r0, r2 - mov r2.y, c2.y - mov r3.y, c2.y - mov r9.z, c2.y - max r0.w, r8.x, r1.x - min r2.w, r1.y, r8.x - add r10.w, r0.w, -r2.w - rcp r0.w, r7.w - mul r0.w, r0.w, r10.w - mul r10.x, r0.w, r6.x - mov r6.zw, r7.xywz - cmp r9.xy, -r7.w, r6.zxzw, r10.wxzw - rcp r0.w, r6.y - mul r0.w, r0.w, r10.w - mul r10.y, r0.w, r7.z - cmp r3.xz, -r6.y, r6.yyww, r10.wyyw - cmp r1.xyw, r7.z, r3.xyzz, r9.xyzz - rcp r0.w, r7.z - mul r0.w, r0.w, r10.w - mul r10.z, r0.w, r6.y - cmp r2.xz, -r7.z, r6.yyww, r10.zyww - cmp r1.xyw, r7.x, r2.xyzz, r1 - mov r2.x, c2.y - mov r3.z, c2.y - rcp r0.w, r6.x - mul r0.w, r0.w, r10.w - mul r10.x, r0.w, r7.w - cmp r3.xy, -r6.x, r6.zxzw, r10.xwzw - rcp r0.w, r7.y - mul r0.w, r0.w, r10.w - mul r10.y, r0.w, r7.x - cmp r2.yz, -r7.y, r7.xyxw, r10.xwyw - cmp r2.xyz, r7.x, r2, r3 - mov r3.x, c2.y - rcp r0.w, r7.x - mul r0.w, r0.w, r10.w - mul r10.z, r0.w, r7.y - cmp r3.yz, -r7.x, r7.xyxw, r10.xzww - cmp r2.xyz, r7.z, r3, r2 - cmp r1.xyw, r7.y, r2.xyzz, r1 - dp3 r0.w, r1.xyww, c3 - add r0.w, -r0.w, r1.z - add r1.xyz, r0.w, r1.xyww - add r0.w, -r1.y, r1.x - cmp r2.xy, r0.w, r1.yxzw, r1 - min r0.w, r1.z, r2.x - max r5.w, r2.y, r1.z - dp3 r1.w, r1, c3 - add r2.xyz, -r1.w, r1 - mul r2.xyz, r1.w, r2 - add r2.w, -r0.w, r1.w - rcp r2.w, r2.w - mad r2.xyz, r2, r2.w, r1.w - cmp r1.xyz, r0.w, r1, r2 - add r2.xyz, -r1.w, r1 - add r0.w, -r1.w, c2.x - mul r2.xyz, r0.w, r2 - add r0.w, -r1.w, r5.w - add r2.w, -r5.w, c2.x - rcp r0.w, r0.w - mad r2.xyz, r2, r0.w, r1.w - cmp r1.xyz, r2.w, r1, r2 - cmp r0.xyz, -r8.y, r1, r0 - lrp r1.xyz, r3.w, r0, r5 - mul r1.w, r3.w, r3.w - cmp r1.w, -r1.w, c2.x, c2.y - mul r0.xyz, r4.w, r1 - mul r0.w, r4.w, r4.w - cmp r0.w, -r0.w, c2.x, c2.y - add r0.w, r1.w, r0.w - cmp r4.xyz, -r0.w, r0, r4 - mov oC0, r4 - - // approximately 193 instruction slots used (2 texture, 191 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[1], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_temps 9 - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - sample r1.xyzw, v1.xyxx, t1.xyzw, s1 - eq r2.x, r0.w, l(0.000000) - eq r2.y, r1.w, l(0.000000) - or r2.x, r2.y, r2.x - if_nz r2.x - mov o0.xyzw, r0.xyzw - ret - endif - div r0.xyz, r0.xyzx, r0.wwww - div r1.xyz, r1.xyzx, r1.wwww - ieq r2.x, cb0[0].x, l(12) - if_nz r2.x - max r2.x, r1.z, r1.y - max r2.x, r1.x, r2.x - min r2.y, r1.z, r1.y - min r2.y, r1.x, r2.y - add r2.w, -r2.y, r2.x - ge r3.x, r0.y, r0.x - if_nz r3.x - add r3.xyzw, -r0.xxzz, r0.yzxy - lt r4.xyz, l(0.000000, 0.000000, 0.000000, 0.000000), r3.yxwy - div r5.xyz, r2.wwww, r3.yxwy - mul r2.xyz, r3.xyzx, r5.xyzx - movc r5.yz, r4.xxxx, r2.xxwx, r3.xxyx - ge r4.xw, r0.zzzz, r0.yyyx - movc r6.yz, r4.yyyy, r2.wwyw, r3.xxyx - movc r3.xy, r4.zzzz, r2.zwzz, r3.zwzz - mov r6.x, l(0) - mov r3.z, l(0) - movc r3.xyz, r4.wwww, r6.xyzx, r3.xyzx - mov r5.x, l(0) - movc r3.xyz, r4.xxxx, r5.xyzx, r3.xyzx - else - add r4.xyzw, -r0.yyzz, r0.xzyx - lt r5.xyz, l(0.000000, 0.000000, 0.000000, 0.000000), r4.yxwy - div r6.xyz, r2.wwww, r4.yxwy - mul r2.xyz, r4.xyzx, r6.xyzx - movc r6.xz, r5.xxxx, r2.xxwx, r4.xxyx - ge r5.xw, r0.zzzz, r0.xxxy - movc r7.xz, r5.yyyy, r2.wwyw, r4.xxyx - movc r2.xy, r5.zzzz, r2.wzww, r4.wzww - mov r7.y, l(0) - mov r2.z, l(0) - movc r2.xyz, r5.wwww, r7.xyzx, r2.xyzx - mov r6.y, l(0) - movc r3.xyz, r5.xxxx, r6.xyzx, r2.xyzx - endif - dp3 r2.x, r1.xyzx, l(0.300000, 0.590000, 0.110000, 0.000000) - dp3 r2.y, r3.xyzx, l(0.300000, 0.590000, 0.110000, 0.000000) - add r2.x, -r2.y, r2.x - add r2.xyz, r2.xxxx, r3.xyzx - dp3 r2.w, r2.xyzx, l(0.300000, 0.590000, 0.110000, 0.000000) - min r3.x, r2.y, r2.x - min r3.x, r2.z, r3.x - max r3.y, r2.y, r2.x - max r3.y, r2.z, r3.y - lt r3.z, r3.x, l(0.000000) - add r4.xyz, -r2.wwww, r2.xyzx - mul r4.xyz, r2.wwww, r4.xyzx - add r3.x, r2.w, -r3.x - div r4.xyz, r4.xyzx, r3.xxxx - add r4.xyz, r2.wwww, r4.xyzx - movc r2.xyz, r3.zzzz, r4.xyzx, r2.xyzx - lt r3.x, l(1.000000), r3.y - add r4.xyz, -r2.wwww, r2.xyzx - add r3.z, -r2.w, l(1.000000) - mul r4.xyz, r3.zzzz, r4.xyzx - add r3.y, -r2.w, r3.y - div r3.yzw, r4.xxyz, r3.yyyy - add r3.yzw, r2.wwww, r3.yyzw - movc r2.xyz, r3.xxxx, r3.yzwy, r2.xyzx - else - ieq r2.w, cb0[0].x, l(13) - if_nz r2.w - max r2.w, r0.z, r0.y - max r2.w, r0.x, r2.w - min r3.x, r0.z, r0.y - min r3.x, r0.x, r3.x - add r3.w, r2.w, -r3.x - ge r2.w, r1.y, r1.x - if_nz r2.w - add r4.xyzw, -r1.xxzz, r1.yzxy - lt r5.xyz, l(0.000000, 0.000000, 0.000000, 0.000000), r4.yxwy - div r6.xyz, r3.wwww, r4.yxwy - mul r3.xyz, r4.xyzx, r6.xyzx - movc r6.yz, r5.xxxx, r3.xxwx, r4.xxyx - ge r5.xw, r1.zzzz, r1.yyyx - movc r7.yz, r5.yyyy, r3.wwyw, r4.xxyx - movc r4.xy, r5.zzzz, r3.zwzz, r4.zwzz - mov r7.x, l(0) - mov r4.z, l(0) - movc r4.xyz, r5.wwww, r7.xyzx, r4.xyzx - mov r6.x, l(0) - movc r4.xyz, r5.xxxx, r6.xyzx, r4.xyzx - else - add r5.xyzw, -r1.yyzz, r1.xzyx - lt r6.xyz, l(0.000000, 0.000000, 0.000000, 0.000000), r5.yxwy - div r7.xyz, r3.wwww, r5.yxwy - mul r3.xyz, r5.xyzx, r7.xyzx - movc r7.xz, r6.xxxx, r3.xxwx, r5.xxyx - ge r6.xw, r1.zzzz, r1.xxxy - movc r8.xz, r6.yyyy, r3.wwyw, r5.xxyx - movc r3.xy, r6.zzzz, r3.wzww, r5.wzww - mov r8.y, l(0) - mov r3.z, l(0) - movc r3.xyz, r6.wwww, r8.xyzx, r3.xyzx - mov r7.y, l(0) - movc r4.xyz, r6.xxxx, r7.xyzx, r3.xyzx - endif - dp3 r2.w, r1.xyzx, l(0.300000, 0.590000, 0.110000, 0.000000) - dp3 r3.x, r4.xyzx, l(0.300000, 0.590000, 0.110000, 0.000000) - add r2.w, r2.w, -r3.x - add r3.xyz, r2.wwww, r4.xyzx - dp3 r2.w, r3.xyzx, l(0.300000, 0.590000, 0.110000, 0.000000) - min r3.w, r3.y, r3.x - min r3.w, r3.z, r3.w - max r4.x, r3.y, r3.x - max r4.x, r3.z, r4.x - lt r4.y, r3.w, l(0.000000) - add r5.xyz, -r2.wwww, r3.xyzx - mul r5.xyz, r2.wwww, r5.xyzx - add r3.w, r2.w, -r3.w - div r5.xyz, r5.xyzx, r3.wwww - add r5.xyz, r2.wwww, r5.xyzx - movc r3.xyz, r4.yyyy, r5.xyzx, r3.xyzx - lt r3.w, l(1.000000), r4.x - add r4.yzw, -r2.wwww, r3.xxyz - add r5.x, -r2.w, l(1.000000) - mul r4.yzw, r4.yyzw, r5.xxxx - add r4.x, -r2.w, r4.x - div r4.xyz, r4.yzwy, r4.xxxx - add r4.xyz, r2.wwww, r4.xyzx - movc r2.xyz, r3.wwww, r4.xyzx, r3.xyzx - else - ieq r2.w, cb0[0].x, l(14) - if_nz r2.w - dp3 r2.w, r1.xyzx, l(0.300000, 0.590000, 0.110000, 0.000000) - dp3 r3.x, r0.xyzx, l(0.300000, 0.590000, 0.110000, 0.000000) - add r2.w, r2.w, -r3.x - add r3.xyz, r0.xyzx, r2.wwww - dp3 r2.w, r3.xyzx, l(0.300000, 0.590000, 0.110000, 0.000000) - min r3.w, r3.y, r3.x - min r3.w, r3.z, r3.w - max r4.x, r3.y, r3.x - max r4.x, r3.z, r4.x - lt r4.y, r3.w, l(0.000000) - add r5.xyz, -r2.wwww, r3.xyzx - mul r5.xyz, r2.wwww, r5.xyzx - add r3.w, r2.w, -r3.w - div r5.xyz, r5.xyzx, r3.wwww - add r5.xyz, r2.wwww, r5.xyzx - movc r3.xyz, r4.yyyy, r5.xyzx, r3.xyzx - lt r3.w, l(1.000000), r4.x - add r4.yzw, -r2.wwww, r3.xxyz - add r5.x, -r2.w, l(1.000000) - mul r4.yzw, r4.yyzw, r5.xxxx - add r4.x, -r2.w, r4.x - div r4.xyz, r4.yzwy, r4.xxxx - add r4.xyz, r2.wwww, r4.xyzx - movc r2.xyz, r3.wwww, r4.xyzx, r3.xyzx - else - dp3 r2.w, r0.xyzx, l(0.300000, 0.590000, 0.110000, 0.000000) - dp3 r3.x, r1.xyzx, l(0.300000, 0.590000, 0.110000, 0.000000) - add r2.w, r2.w, -r3.x - add r1.xyz, r1.xyzx, r2.wwww - dp3 r2.w, r1.xyzx, l(0.300000, 0.590000, 0.110000, 0.000000) - min r3.x, r1.y, r1.x - min r3.x, r1.z, r3.x - max r3.y, r1.y, r1.x - max r3.y, r1.z, r3.y - lt r3.z, r3.x, l(0.000000) - add r4.xyz, r1.xyzx, -r2.wwww - mul r4.xyz, r2.wwww, r4.xyzx - add r3.x, r2.w, -r3.x - div r4.xyz, r4.xyzx, r3.xxxx - add r4.xyz, r2.wwww, r4.xyzx - movc r1.xyz, r3.zzzz, r4.xyzx, r1.xyzx - lt r3.x, l(1.000000), r3.y - add r4.xyz, -r2.wwww, r1.xyzx - add r3.z, -r2.w, l(1.000000) - mul r4.xyz, r3.zzzz, r4.xyzx - add r3.y, -r2.w, r3.y - div r3.yzw, r4.xxyz, r3.yyyy - add r3.yzw, r2.wwww, r3.yyzw - movc r2.xyz, r3.xxxx, r3.yzwy, r1.xyzx - endif - endif - endif - add r1.x, -r1.w, l(1.000000) - mul r1.yzw, r1.wwww, r2.xxyz - mad r0.xyz, r1.xxxx, r0.xyzx, r1.yzwy - mul o0.xyz, r0.wwww, r0.xyzx - mov o0.w, r0.w - ret - // Approximately 195 instruction slots used - - }; - } - -} - -technique10 SampleRadialGradient -{ - pass APos - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 [unused] - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // cbuffer cb2 - // { - // - // float3x3 DeviceSpaceToUserSpace; // Offset: 0 Size: 44 - // float2 dimensions; // Offset: 48 Size: 8 - // float3 diff; // Offset: 64 Size: 12 [unused] - // float2 center1; // Offset: 80 Size: 8 [unused] - // float A; // Offset: 88 Size: 4 [unused] - // float radius1; // Offset: 92 Size: 4 [unused] - // float sq_radius1; // Offset: 96 Size: 4 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // cb2 cbuffer NA NA 1 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 1 ( FLT, FLT, FLT, FLT) - // c2 cb0 2 1 ( FLT, FLT, FLT, FLT) - // c3 cb1 0 2 ( FLT, FLT, FLT, FLT) - // c5 cb1 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c6, 1, 0.5, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad r0.xy, v0, c1.zwzw, c1 - add r0.z, r0.x, c6.x - mul r0.z, r0.z, c5.x - mul r1.x, r0.z, c6.y - add r0.z, -r0.y, c6.x - add oPos.xy, r0, c0 - mul r0.x, r0.z, c5.y - mul r1.y, r0.x, c6.y - mov r1.z, c6.x - dp3 oT0.w, r1, c3 - dp3 oT0.z, r1, c4 - mov oPos.zw, c6.xyzx - - // approximately 13 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_constantbuffer cb1[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mov o0.zw, l(0,0,0,1.000000) - mad r0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.xy, r0.xyxx - add r0.x, r0.x, l(1.000000) - add r0.y, -r0.y, l(1.000000) - mul r0.xy, r0.xyxx, cb1[3].xyxx - mul r1.xy, r0.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000) - mov r1.z, l(1.000000) - dp3 o1.z, r1.xyzx, cb1[0].xyzx - dp3 o1.w, r1.xyzx, cb1[1].xyzx - mad o1.xy, v0.xyxx, cb0[2].zwzz, cb0[2].xyxx - ret - // Approximately 12 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb2 - // { - // - // float3x3 DeviceSpaceToUserSpace; // Offset: 0 Size: 44 [unused] - // float2 dimensions; // Offset: 48 Size: 8 [unused] - // float3 diff; // Offset: 64 Size: 12 - // float2 center1; // Offset: 80 Size: 8 - // float A; // Offset: 88 Size: 4 - // float radius1; // Offset: 92 Size: 4 - // float sq_radius1; // Offset: 96 Size: 4 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sSampler sampler NA NA 0 1 - // sMaskSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // mask texture float4 2d 1 1 - // cb2 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 4 3 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c3, 0.5, 0, 0, 0 - def c4, 1, -1, 0, -0 - dcl t0 - dcl_2d s0 - dcl_2d s1 - add r0.xy, t0.wzzw, -c1 - dp2add r0.w, r0, r0, -c2.x - mul r0.w, r0.w, c1.z - mov r0.z, c1.w - dp3 r0.x, r0, c0 - mad r0.y, r0.x, r0.x, -r0.w - abs r0.z, r0.y - rsq r0.z, r0.z - rcp r1.x, r0.z - mov r1.yz, -r1.x - add r0.xzw, r0.x, r1.xyyz - rcp r1.x, c1.z - mul r0.xzw, r0, r1.x - mov r1.w, c1.w - mad r1.xyz, r0.xzww, c0.z, r1.w - cmp r2.x, r1.x, r0.x, r0.w - cmp r0.xzw, r1.xyyz, c4.xyxy, c4.zyzw - mov r2.y, c3.x - texld r1, t0, s1 - texld r2, r2, s0 - mul r2.xyz, r2.w, r2 - mul r1, r1.w, r2 - add r0.w, r0.w, r0.x - cmp r0.x, r0.w, r0.x, r0.z - cmp r1, -r0.x, c4.z, r1 - cmp r0, r0.y, r1, c4.z - mov oC0, r0 - - // approximately 28 instruction slots used (2 texture, 26 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[7], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 3 - add r0.xy, v1.zwzz, -cb0[5].xyxx - mov r0.z, cb0[5].w - dp3 r0.z, r0.xyzx, cb0[4].xyzx - dp2 r0.x, r0.xyxx, r0.xyxx - add r0.x, r0.x, -cb0[6].x - mul r0.x, r0.x, cb0[5].z - mad r0.x, r0.z, r0.z, -r0.x - lt r0.y, r0.x, l(0.000000) - sqrt r1.x, |r0.x| - mov r1.y, -r1.x - add r0.xz, r0.zzzz, r1.xxyx - div r0.xz, r0.xxzx, cb0[5].zzzz - mul r1.xy, r0.xzxx, cb0[4].zzzz - ge r1.xy, r1.xyxx, -cb0[5].wwww - and r1.xy, r1.xyxx, l(0x3f800000, 0x3f800000, 0, 0) - add r0.x, -r0.z, r0.x - mad r2.x, r1.x, r0.x, r0.z - mov r2.y, l(0.500000) - sample r2.xyzw, r2.xyxx, t0.xyzw, s0 - if_nz r0.y - mov o0.xyzw, l(0,0,0,0) - ret - endif - max r0.x, r1.y, r1.x - ge r0.x, l(0.000000), r0.x - if_nz r0.x - mov o0.xyzw, l(0,0,0,0) - ret - endif - mul r2.xyz, r2.wwww, r2.xyzx - sample r0.xyzw, v1.xyxx, t1.xyzw, s1 - mul o0.xyzw, r0.wwww, r2.xyzw - ret - // Approximately 33 instruction slots used - - }; - } - - pass A0 - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 [unused] - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // cbuffer cb2 - // { - // - // float3x3 DeviceSpaceToUserSpace; // Offset: 0 Size: 44 - // float2 dimensions; // Offset: 48 Size: 8 - // float3 diff; // Offset: 64 Size: 12 [unused] - // float2 center1; // Offset: 80 Size: 8 [unused] - // float A; // Offset: 88 Size: 4 [unused] - // float radius1; // Offset: 92 Size: 4 [unused] - // float sq_radius1; // Offset: 96 Size: 4 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // cb2 cbuffer NA NA 1 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 1 ( FLT, FLT, FLT, FLT) - // c2 cb0 2 1 ( FLT, FLT, FLT, FLT) - // c3 cb1 0 2 ( FLT, FLT, FLT, FLT) - // c5 cb1 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c6, 1, 0.5, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad r0.xy, v0, c1.zwzw, c1 - add r0.z, r0.x, c6.x - mul r0.z, r0.z, c5.x - mul r1.x, r0.z, c6.y - add r0.z, -r0.y, c6.x - add oPos.xy, r0, c0 - mul r0.x, r0.z, c5.y - mul r1.y, r0.x, c6.y - mov r1.z, c6.x - dp3 oT0.w, r1, c3 - dp3 oT0.z, r1, c4 - mov oPos.zw, c6.xyzx - - // approximately 13 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_constantbuffer cb1[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mov o0.zw, l(0,0,0,1.000000) - mad r0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.xy, r0.xyxx - add r0.x, r0.x, l(1.000000) - add r0.y, -r0.y, l(1.000000) - mul r0.xy, r0.xyxx, cb1[3].xyxx - mul r1.xy, r0.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000) - mov r1.z, l(1.000000) - dp3 o1.z, r1.xyzx, cb1[0].xyzx - dp3 o1.w, r1.xyzx, cb1[1].xyzx - mad o1.xy, v0.xyxx, cb0[2].zwzz, cb0[2].xyxx - ret - // Approximately 12 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb2 - // { - // - // float3x3 DeviceSpaceToUserSpace; // Offset: 0 Size: 44 [unused] - // float2 dimensions; // Offset: 48 Size: 8 [unused] - // float3 diff; // Offset: 64 Size: 12 - // float2 center1; // Offset: 80 Size: 8 - // float A; // Offset: 88 Size: 4 [unused] - // float radius1; // Offset: 92 Size: 4 - // float sq_radius1; // Offset: 96 Size: 4 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sSampler sampler NA NA 0 1 - // sMaskSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // mask texture float4 2d 1 1 - // cb2 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 4 2 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c2, 0.5, 0, 0, 0 - dcl t0 - dcl_2d s0 - dcl_2d s1 - mul r0.w, c1.w, c1.w - add r0.xy, t0.wzzw, -c1 - dp2add r0.w, r0, r0, -r0.w - mul r0.w, r0.w, c2.x - mov r0.z, c1.w - dp3 r0.x, r0, c0 - rcp r0.x, r0.x - mul r0.x, r0.x, r0.w - mov r0.y, c2.x - texld r1, t0, s1 - texld r2, r0, s0 - mov r0.w, c1.w - mad r0.x, r0.x, -c0.z, -r0.w - mul r2.xyz, r2.w, r2 - mul r1, r1.w, r2 - cmp r0, r0.x, c2.y, r1 - mov oC0, r0 - - // approximately 18 instruction slots used (2 texture, 16 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[6], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 2 - add r0.xy, v1.zwzz, -cb0[5].xyxx - mov r0.z, cb0[5].w - dp3 r0.z, r0.xyzx, cb0[4].xyzx - dp2 r0.x, r0.xyxx, r0.xyxx - mad r0.x, -cb0[5].w, cb0[5].w, r0.x - mul r0.x, r0.x, l(0.500000) - div r0.x, r0.x, r0.z - mul r0.z, r0.x, cb0[4].z - ge r0.z, -cb0[5].w, r0.z - mov r0.y, l(0.500000) - sample r1.xyzw, r0.xyxx, t0.xyzw, s0 - if_nz r0.z - mov o0.xyzw, l(0,0,0,0) - ret - endif - mul r1.xyz, r1.wwww, r1.xyzx - sample r0.xyzw, v1.xyxx, t1.xyzw, s1 - mul o0.xyzw, r0.wwww, r1.xyzw - ret - // Approximately 19 instruction slots used - - }; - } - - pass APosWrap - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 [unused] - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // cbuffer cb2 - // { - // - // float3x3 DeviceSpaceToUserSpace; // Offset: 0 Size: 44 - // float2 dimensions; // Offset: 48 Size: 8 - // float3 diff; // Offset: 64 Size: 12 [unused] - // float2 center1; // Offset: 80 Size: 8 [unused] - // float A; // Offset: 88 Size: 4 [unused] - // float radius1; // Offset: 92 Size: 4 [unused] - // float sq_radius1; // Offset: 96 Size: 4 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // cb2 cbuffer NA NA 1 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 1 ( FLT, FLT, FLT, FLT) - // c2 cb0 2 1 ( FLT, FLT, FLT, FLT) - // c3 cb1 0 2 ( FLT, FLT, FLT, FLT) - // c5 cb1 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c6, 1, 0.5, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad r0.xy, v0, c1.zwzw, c1 - add r0.z, r0.x, c6.x - mul r0.z, r0.z, c5.x - mul r1.x, r0.z, c6.y - add r0.z, -r0.y, c6.x - add oPos.xy, r0, c0 - mul r0.x, r0.z, c5.y - mul r1.y, r0.x, c6.y - mov r1.z, c6.x - dp3 oT0.w, r1, c3 - dp3 oT0.z, r1, c4 - mov oPos.zw, c6.xyzx - - // approximately 13 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_constantbuffer cb1[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mov o0.zw, l(0,0,0,1.000000) - mad r0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.xy, r0.xyxx - add r0.x, r0.x, l(1.000000) - add r0.y, -r0.y, l(1.000000) - mul r0.xy, r0.xyxx, cb1[3].xyxx - mul r1.xy, r0.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000) - mov r1.z, l(1.000000) - dp3 o1.z, r1.xyzx, cb1[0].xyzx - dp3 o1.w, r1.xyzx, cb1[1].xyzx - mad o1.xy, v0.xyxx, cb0[2].zwzz, cb0[2].xyxx - ret - // Approximately 12 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb2 - // { - // - // float3x3 DeviceSpaceToUserSpace; // Offset: 0 Size: 44 [unused] - // float2 dimensions; // Offset: 48 Size: 8 [unused] - // float3 diff; // Offset: 64 Size: 12 - // float2 center1; // Offset: 80 Size: 8 - // float A; // Offset: 88 Size: 4 - // float radius1; // Offset: 92 Size: 4 - // float sq_radius1; // Offset: 96 Size: 4 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sWrapSampler sampler NA NA 0 1 - // sMaskSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // mask texture float4 2d 1 1 - // cb2 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 4 3 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c3, 0.5, 0, 0, 0 - def c4, 1, -1, 0, -0 - dcl t0 - dcl_2d s0 - dcl_2d s1 - add r0.xy, t0.wzzw, -c1 - dp2add r0.w, r0, r0, -c2.x - mul r0.w, r0.w, c1.z - mov r0.z, c1.w - dp3 r0.x, r0, c0 - mad r0.y, r0.x, r0.x, -r0.w - abs r0.z, r0.y - rsq r0.z, r0.z - rcp r1.x, r0.z - mov r1.yz, -r1.x - add r0.xzw, r0.x, r1.xyyz - rcp r1.x, c1.z - mul r0.xzw, r0, r1.x - mov r1.w, c1.w - mad r1.xyz, r0.xzww, c0.z, r1.w - cmp r2.x, r1.x, r0.x, r0.w - cmp r0.xzw, r1.xyyz, c4.xyxy, c4.zyzw - mov r2.y, c3.x - texld r1, t0, s1 - texld r2, r2, s0 - mul r2.xyz, r2.w, r2 - mul r1, r1.w, r2 - add r0.w, r0.w, r0.x - cmp r0.x, r0.w, r0.x, r0.z - cmp r1, -r0.x, c4.z, r1 - cmp r0, r0.y, r1, c4.z - mov oC0, r0 - - // approximately 28 instruction slots used (2 texture, 26 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[7], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 3 - add r0.xy, v1.zwzz, -cb0[5].xyxx - mov r0.z, cb0[5].w - dp3 r0.z, r0.xyzx, cb0[4].xyzx - dp2 r0.x, r0.xyxx, r0.xyxx - add r0.x, r0.x, -cb0[6].x - mul r0.x, r0.x, cb0[5].z - mad r0.x, r0.z, r0.z, -r0.x - lt r0.y, r0.x, l(0.000000) - sqrt r1.x, |r0.x| - mov r1.y, -r1.x - add r0.xz, r0.zzzz, r1.xxyx - div r0.xz, r0.xxzx, cb0[5].zzzz - mul r1.xy, r0.xzxx, cb0[4].zzzz - ge r1.xy, r1.xyxx, -cb0[5].wwww - and r1.xy, r1.xyxx, l(0x3f800000, 0x3f800000, 0, 0) - add r0.x, -r0.z, r0.x - mad r2.x, r1.x, r0.x, r0.z - mov r2.y, l(0.500000) - sample r2.xyzw, r2.xyxx, t0.xyzw, s0 - if_nz r0.y - mov o0.xyzw, l(0,0,0,0) - ret - endif - max r0.x, r1.y, r1.x - ge r0.x, l(0.000000), r0.x - if_nz r0.x - mov o0.xyzw, l(0,0,0,0) - ret - endif - mul r2.xyz, r2.wwww, r2.xyzx - sample r0.xyzw, v1.xyxx, t1.xyzw, s1 - mul o0.xyzw, r0.wwww, r2.xyzw - ret - // Approximately 33 instruction slots used - - }; - } - - pass A0Wrap - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 [unused] - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // cbuffer cb2 - // { - // - // float3x3 DeviceSpaceToUserSpace; // Offset: 0 Size: 44 - // float2 dimensions; // Offset: 48 Size: 8 - // float3 diff; // Offset: 64 Size: 12 [unused] - // float2 center1; // Offset: 80 Size: 8 [unused] - // float A; // Offset: 88 Size: 4 [unused] - // float radius1; // Offset: 92 Size: 4 [unused] - // float sq_radius1; // Offset: 96 Size: 4 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // cb2 cbuffer NA NA 1 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 1 ( FLT, FLT, FLT, FLT) - // c2 cb0 2 1 ( FLT, FLT, FLT, FLT) - // c3 cb1 0 2 ( FLT, FLT, FLT, FLT) - // c5 cb1 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c6, 1, 0.5, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad r0.xy, v0, c1.zwzw, c1 - add r0.z, r0.x, c6.x - mul r0.z, r0.z, c5.x - mul r1.x, r0.z, c6.y - add r0.z, -r0.y, c6.x - add oPos.xy, r0, c0 - mul r0.x, r0.z, c5.y - mul r1.y, r0.x, c6.y - mov r1.z, c6.x - dp3 oT0.w, r1, c3 - dp3 oT0.z, r1, c4 - mov oPos.zw, c6.xyzx - - // approximately 13 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_constantbuffer cb1[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mov o0.zw, l(0,0,0,1.000000) - mad r0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.xy, r0.xyxx - add r0.x, r0.x, l(1.000000) - add r0.y, -r0.y, l(1.000000) - mul r0.xy, r0.xyxx, cb1[3].xyxx - mul r1.xy, r0.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000) - mov r1.z, l(1.000000) - dp3 o1.z, r1.xyzx, cb1[0].xyzx - dp3 o1.w, r1.xyzx, cb1[1].xyzx - mad o1.xy, v0.xyxx, cb0[2].zwzz, cb0[2].xyxx - ret - // Approximately 12 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb2 - // { - // - // float3x3 DeviceSpaceToUserSpace; // Offset: 0 Size: 44 [unused] - // float2 dimensions; // Offset: 48 Size: 8 [unused] - // float3 diff; // Offset: 64 Size: 12 - // float2 center1; // Offset: 80 Size: 8 - // float A; // Offset: 88 Size: 4 [unused] - // float radius1; // Offset: 92 Size: 4 - // float sq_radius1; // Offset: 96 Size: 4 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sWrapSampler sampler NA NA 0 1 - // sMaskSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // mask texture float4 2d 1 1 - // cb2 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 4 2 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c2, 0.5, 0, 0, 0 - dcl t0 - dcl_2d s0 - dcl_2d s1 - mul r0.w, c1.w, c1.w - add r0.xy, t0.wzzw, -c1 - dp2add r0.w, r0, r0, -r0.w - mul r0.w, r0.w, c2.x - mov r0.z, c1.w - dp3 r0.x, r0, c0 - rcp r0.x, r0.x - mul r0.x, r0.x, r0.w - mov r0.y, c2.x - texld r1, t0, s1 - texld r2, r0, s0 - mov r0.w, c1.w - mad r0.x, r0.x, -c0.z, -r0.w - mul r2.xyz, r2.w, r2 - mul r1, r1.w, r2 - cmp r0, r0.x, c2.y, r1 - mov oC0, r0 - - // approximately 18 instruction slots used (2 texture, 16 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[6], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 2 - add r0.xy, v1.zwzz, -cb0[5].xyxx - mov r0.z, cb0[5].w - dp3 r0.z, r0.xyzx, cb0[4].xyzx - dp2 r0.x, r0.xyxx, r0.xyxx - mad r0.x, -cb0[5].w, cb0[5].w, r0.x - mul r0.x, r0.x, l(0.500000) - div r0.x, r0.x, r0.z - mul r0.z, r0.x, cb0[4].z - ge r0.z, -cb0[5].w, r0.z - mov r0.y, l(0.500000) - sample r1.xyzw, r0.xyxx, t0.xyzw, s0 - if_nz r0.z - mov o0.xyzw, l(0,0,0,0) - ret - endif - mul r1.xyz, r1.wwww, r1.xyzx - sample r0.xyzw, v1.xyxx, t1.xyzw, s1 - mul o0.xyzw, r0.wwww, r1.xyzw - ret - // Approximately 19 instruction slots used - - }; - } - - pass APosMirror - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 [unused] - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // cbuffer cb2 - // { - // - // float3x3 DeviceSpaceToUserSpace; // Offset: 0 Size: 44 - // float2 dimensions; // Offset: 48 Size: 8 - // float3 diff; // Offset: 64 Size: 12 [unused] - // float2 center1; // Offset: 80 Size: 8 [unused] - // float A; // Offset: 88 Size: 4 [unused] - // float radius1; // Offset: 92 Size: 4 [unused] - // float sq_radius1; // Offset: 96 Size: 4 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // cb2 cbuffer NA NA 1 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 1 ( FLT, FLT, FLT, FLT) - // c2 cb0 2 1 ( FLT, FLT, FLT, FLT) - // c3 cb1 0 2 ( FLT, FLT, FLT, FLT) - // c5 cb1 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c6, 1, 0.5, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad r0.xy, v0, c1.zwzw, c1 - add r0.z, r0.x, c6.x - mul r0.z, r0.z, c5.x - mul r1.x, r0.z, c6.y - add r0.z, -r0.y, c6.x - add oPos.xy, r0, c0 - mul r0.x, r0.z, c5.y - mul r1.y, r0.x, c6.y - mov r1.z, c6.x - dp3 oT0.w, r1, c3 - dp3 oT0.z, r1, c4 - mov oPos.zw, c6.xyzx - - // approximately 13 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_constantbuffer cb1[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mov o0.zw, l(0,0,0,1.000000) - mad r0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.xy, r0.xyxx - add r0.x, r0.x, l(1.000000) - add r0.y, -r0.y, l(1.000000) - mul r0.xy, r0.xyxx, cb1[3].xyxx - mul r1.xy, r0.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000) - mov r1.z, l(1.000000) - dp3 o1.z, r1.xyzx, cb1[0].xyzx - dp3 o1.w, r1.xyzx, cb1[1].xyzx - mad o1.xy, v0.xyxx, cb0[2].zwzz, cb0[2].xyxx - ret - // Approximately 12 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb2 - // { - // - // float3x3 DeviceSpaceToUserSpace; // Offset: 0 Size: 44 [unused] - // float2 dimensions; // Offset: 48 Size: 8 [unused] - // float3 diff; // Offset: 64 Size: 12 - // float2 center1; // Offset: 80 Size: 8 - // float A; // Offset: 88 Size: 4 - // float radius1; // Offset: 92 Size: 4 - // float sq_radius1; // Offset: 96 Size: 4 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sMirrorSampler sampler NA NA 0 1 - // sMaskSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // mask texture float4 2d 1 1 - // cb2 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 4 3 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c3, 0.5, 0, 0, 0 - def c4, 1, -1, 0, -0 - dcl t0 - dcl_2d s0 - dcl_2d s1 - add r0.xy, t0.wzzw, -c1 - dp2add r0.w, r0, r0, -c2.x - mul r0.w, r0.w, c1.z - mov r0.z, c1.w - dp3 r0.x, r0, c0 - mad r0.y, r0.x, r0.x, -r0.w - abs r0.z, r0.y - rsq r0.z, r0.z - rcp r1.x, r0.z - mov r1.yz, -r1.x - add r0.xzw, r0.x, r1.xyyz - rcp r1.x, c1.z - mul r0.xzw, r0, r1.x - mov r1.w, c1.w - mad r1.xyz, r0.xzww, c0.z, r1.w - cmp r2.x, r1.x, r0.x, r0.w - cmp r0.xzw, r1.xyyz, c4.xyxy, c4.zyzw - mov r2.y, c3.x - texld r1, t0, s1 - texld r2, r2, s0 - mul r2.xyz, r2.w, r2 - mul r1, r1.w, r2 - add r0.w, r0.w, r0.x - cmp r0.x, r0.w, r0.x, r0.z - cmp r1, -r0.x, c4.z, r1 - cmp r0, r0.y, r1, c4.z - mov oC0, r0 - - // approximately 28 instruction slots used (2 texture, 26 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[7], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 3 - add r0.xy, v1.zwzz, -cb0[5].xyxx - mov r0.z, cb0[5].w - dp3 r0.z, r0.xyzx, cb0[4].xyzx - dp2 r0.x, r0.xyxx, r0.xyxx - add r0.x, r0.x, -cb0[6].x - mul r0.x, r0.x, cb0[5].z - mad r0.x, r0.z, r0.z, -r0.x - lt r0.y, r0.x, l(0.000000) - sqrt r1.x, |r0.x| - mov r1.y, -r1.x - add r0.xz, r0.zzzz, r1.xxyx - div r0.xz, r0.xxzx, cb0[5].zzzz - mul r1.xy, r0.xzxx, cb0[4].zzzz - ge r1.xy, r1.xyxx, -cb0[5].wwww - and r1.xy, r1.xyxx, l(0x3f800000, 0x3f800000, 0, 0) - add r0.x, -r0.z, r0.x - mad r2.x, r1.x, r0.x, r0.z - mov r2.y, l(0.500000) - sample r2.xyzw, r2.xyxx, t0.xyzw, s0 - if_nz r0.y - mov o0.xyzw, l(0,0,0,0) - ret - endif - max r0.x, r1.y, r1.x - ge r0.x, l(0.000000), r0.x - if_nz r0.x - mov o0.xyzw, l(0,0,0,0) - ret - endif - mul r2.xyz, r2.wwww, r2.xyzx - sample r0.xyzw, v1.xyxx, t1.xyzw, s1 - mul o0.xyzw, r0.wwww, r2.xyzw - ret - // Approximately 33 instruction slots used - - }; - } - - pass A0Mirror - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 [unused] - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // cbuffer cb2 - // { - // - // float3x3 DeviceSpaceToUserSpace; // Offset: 0 Size: 44 - // float2 dimensions; // Offset: 48 Size: 8 - // float3 diff; // Offset: 64 Size: 12 [unused] - // float2 center1; // Offset: 80 Size: 8 [unused] - // float A; // Offset: 88 Size: 4 [unused] - // float radius1; // Offset: 92 Size: 4 [unused] - // float sq_radius1; // Offset: 96 Size: 4 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // cb2 cbuffer NA NA 1 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 1 ( FLT, FLT, FLT, FLT) - // c2 cb0 2 1 ( FLT, FLT, FLT, FLT) - // c3 cb1 0 2 ( FLT, FLT, FLT, FLT) - // c5 cb1 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c6, 1, 0.5, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad r0.xy, v0, c1.zwzw, c1 - add r0.z, r0.x, c6.x - mul r0.z, r0.z, c5.x - mul r1.x, r0.z, c6.y - add r0.z, -r0.y, c6.x - add oPos.xy, r0, c0 - mul r0.x, r0.z, c5.y - mul r1.y, r0.x, c6.y - mov r1.z, c6.x - dp3 oT0.w, r1, c3 - dp3 oT0.z, r1, c4 - mov oPos.zw, c6.xyzx - - // approximately 13 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_constantbuffer cb1[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mov o0.zw, l(0,0,0,1.000000) - mad r0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.xy, r0.xyxx - add r0.x, r0.x, l(1.000000) - add r0.y, -r0.y, l(1.000000) - mul r0.xy, r0.xyxx, cb1[3].xyxx - mul r1.xy, r0.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000) - mov r1.z, l(1.000000) - dp3 o1.z, r1.xyzx, cb1[0].xyzx - dp3 o1.w, r1.xyzx, cb1[1].xyzx - mad o1.xy, v0.xyxx, cb0[2].zwzz, cb0[2].xyxx - ret - // Approximately 12 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb2 - // { - // - // float3x3 DeviceSpaceToUserSpace; // Offset: 0 Size: 44 [unused] - // float2 dimensions; // Offset: 48 Size: 8 [unused] - // float3 diff; // Offset: 64 Size: 12 - // float2 center1; // Offset: 80 Size: 8 - // float A; // Offset: 88 Size: 4 [unused] - // float radius1; // Offset: 92 Size: 4 - // float sq_radius1; // Offset: 96 Size: 4 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sMirrorSampler sampler NA NA 0 1 - // sMaskSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // mask texture float4 2d 1 1 - // cb2 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 4 2 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c2, 0.5, 0, 0, 0 - dcl t0 - dcl_2d s0 - dcl_2d s1 - mul r0.w, c1.w, c1.w - add r0.xy, t0.wzzw, -c1 - dp2add r0.w, r0, r0, -r0.w - mul r0.w, r0.w, c2.x - mov r0.z, c1.w - dp3 r0.x, r0, c0 - rcp r0.x, r0.x - mul r0.x, r0.x, r0.w - mov r0.y, c2.x - texld r1, t0, s1 - texld r2, r0, s0 - mov r0.w, c1.w - mad r0.x, r0.x, -c0.z, -r0.w - mul r2.xyz, r2.w, r2 - mul r1, r1.w, r2 - cmp r0, r0.x, c2.y, r1 - mov oC0, r0 - - // approximately 18 instruction slots used (2 texture, 16 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[6], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 2 - add r0.xy, v1.zwzz, -cb0[5].xyxx - mov r0.z, cb0[5].w - dp3 r0.z, r0.xyzx, cb0[4].xyzx - dp2 r0.x, r0.xyxx, r0.xyxx - mad r0.x, -cb0[5].w, cb0[5].w, r0.x - mul r0.x, r0.x, l(0.500000) - div r0.x, r0.x, r0.z - mul r0.z, r0.x, cb0[4].z - ge r0.z, -cb0[5].w, r0.z - mov r0.y, l(0.500000) - sample r1.xyzw, r0.xyxx, t0.xyzw, s0 - if_nz r0.z - mov o0.xyzw, l(0,0,0,0) - ret - endif - mul r1.xyz, r1.wwww, r1.xyzx - sample r0.xyzw, v1.xyxx, t1.xyzw, s1 - mul o0.xyzw, r0.wwww, r1.xyzw - ret - // Approximately 19 instruction slots used - - }; - } - -} - -technique10 SampleConicGradient -{ - pass APos - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 [unused] - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // cbuffer cb3 - // { - // - // float3x3 DeviceSpaceToUserSpace_cb3;// Offset: 0 Size: 44 - // float2 dimensions_cb3; // Offset: 48 Size: 8 - // float2 center; // Offset: 56 Size: 8 [unused] - // float angle; // Offset: 64 Size: 4 [unused] - // float start_offset; // Offset: 68 Size: 4 [unused] - // float end_offset; // Offset: 72 Size: 4 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // cb3 cbuffer NA NA 1 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 1 ( FLT, FLT, FLT, FLT) - // c2 cb0 2 1 ( FLT, FLT, FLT, FLT) - // c3 cb1 0 2 ( FLT, FLT, FLT, FLT) - // c5 cb1 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c6, 1, 0.5, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad r0.xy, v0, c1.zwzw, c1 - add r0.z, r0.x, c6.x - mul r0.z, r0.z, c5.x - mul r1.x, r0.z, c6.y - add r0.z, -r0.y, c6.x - add oPos.xy, r0, c0 - mul r0.x, r0.z, c5.y - mul r1.y, r0.x, c6.y - mov r1.z, c6.x - dp3 oT0.w, r1, c3 - dp3 oT0.z, r1, c4 - mov oPos.zw, c6.xyzx - - // approximately 13 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_constantbuffer cb1[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mov o0.zw, l(0,0,0,1.000000) - mad r0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.xy, r0.xyxx - add r0.x, r0.x, l(1.000000) - add r0.y, -r0.y, l(1.000000) - mul r0.xy, r0.xyxx, cb1[3].xyxx - mul r1.xy, r0.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000) - mov r1.z, l(1.000000) - dp3 o1.z, r1.xyzx, cb1[0].xyzx - dp3 o1.w, r1.xyzx, cb1[1].xyzx - mad o1.xy, v0.xyxx, cb0[2].zwzz, cb0[2].xyxx - ret - // Approximately 12 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb3 - // { - // - // float3x3 DeviceSpaceToUserSpace_cb3;// Offset: 0 Size: 44 [unused] - // float2 dimensions_cb3; // Offset: 48 Size: 8 [unused] - // float2 center; // Offset: 56 Size: 8 - // float angle; // Offset: 64 Size: 4 - // float start_offset; // Offset: 68 Size: 4 - // float end_offset; // Offset: 72 Size: 4 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sSampler sampler NA NA 0 1 - // sMaskSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // mask texture float4 2d 1 1 - // cb3 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 2 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c2, 0.0208350997, -0.0851330012, 0.180141002, -0.330299497 - def c3, 0.999866009, 0, 1, 3.14159274 - def c4, -2, 1.57079637, 1.57079601, 0.159154981 - def c5, 0.5, 0, 0, 0 - dcl t0 - dcl_2d s0 - dcl_2d s1 - add r0.xy, t0.wzzw, -c0.zwzw - abs r0.zw, r0.xyxy - add r1.xy, -r0.zwzw, r0.wzzw - cmp r0.zw, r1.x, r0, r0.xywz - cmp r1.x, r1.y, c3.y, c3.z - rcp r0.w, r0.w - mul r0.z, r0.w, r0.z - mul r0.w, r0.z, r0.z - mad r1.y, r0.w, c2.x, c2.y - mad r1.y, r0.w, r1.y, c2.z - mad r1.y, r0.w, r1.y, c2.w - mad r0.w, r0.w, r1.y, c3.x - mul r0.z, r0.w, r0.z - mad r0.w, r0.z, c4.x, c4.y - mad r0.z, r0.w, r1.x, r0.z - cmp r0.w, r0.x, -c3.y, -c3.w - add r0.z, r0.w, r0.z - add r0.w, r0.z, r0.z - add r1.x, -r0.x, r0.y - cmp r0.xy, r1.x, r0, r0.yxzw - cmp r0.y, r0.y, c3.z, c3.y - cmp r0.x, r0.x, c3.y, r0.y - mad r0.x, r0.x, -r0.w, r0.z - add r0.x, r0.x, -c1.x - add r0.x, r0.x, c4.z - mul r0.y, r0.x, c4.w - abs r0.y, r0.y - frc r0.y, r0.y - cmp r0.x, r0.x, r0.y, -r0.y - add r0.x, r0.x, -c1.y - add r0.y, -c1.y, c1.z - rcp r0.y, r0.y - mul r0.x, r0.y, r0.x - mov r0.y, c5.x - texld r1, t0, s1 - texld r0, r0, s0 - mul r0.xyz, r0.w, r0 - mul r0, r1.w, r0 - mov oC0, r0 - - // approximately 39 instruction slots used (2 texture, 37 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[5], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 2 - add r0.xy, v1.wzww, -cb0[3].wzww - max r0.z, |r0.y|, |r0.x| - div r0.z, l(1.000000, 1.000000, 1.000000, 1.000000), r0.z - min r0.w, |r0.y|, |r0.x| - mul r0.z, r0.z, r0.w - mul r0.w, r0.z, r0.z - mad r1.x, r0.w, l(0.020835), l(-0.085133) - mad r1.x, r0.w, r1.x, l(0.180141) - mad r1.x, r0.w, r1.x, l(-0.330299) - mad r0.w, r0.w, r1.x, l(0.999866) - mul r1.x, r0.w, r0.z - mad r1.x, r1.x, l(-2.000000), l(1.570796) - lt r1.y, |r0.y|, |r0.x| - and r1.x, r1.y, r1.x - mad r0.z, r0.z, r0.w, r1.x - lt r0.w, r0.y, -r0.y - and r0.w, r0.w, l(0xc0490fdb) - add r0.z, r0.w, r0.z - min r0.w, r0.y, r0.x - max r0.x, r0.y, r0.x - ge r0.x, r0.x, -r0.x - lt r0.y, r0.w, -r0.w - and r0.x, r0.x, r0.y - movc r0.x, r0.x, -r0.z, r0.z - add r0.x, r0.x, -cb0[4].x - add r0.x, r0.x, l(1.570796) - mul r0.x, r0.x, l(0.159155) - ge r0.y, r0.x, -r0.x - frc r0.x, |r0.x| - movc r0.x, r0.y, r0.x, -r0.x - add r0.x, r0.x, -cb0[4].y - add r0.y, -cb0[4].y, cb0[4].z - div r0.x, r0.x, r0.y - mov r0.y, l(0.500000) - sample r0.xyzw, r0.xyxx, t0.xyzw, s0 - mul r0.xyz, r0.wwww, r0.xyzx - sample r1.xyzw, v1.xyxx, t1.xyzw, s1 - mul o0.xyzw, r0.xyzw, r1.wwww - ret - // Approximately 39 instruction slots used - - }; - } - - pass APosWrap - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 [unused] - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // cbuffer cb3 - // { - // - // float3x3 DeviceSpaceToUserSpace_cb3;// Offset: 0 Size: 44 - // float2 dimensions_cb3; // Offset: 48 Size: 8 - // float2 center; // Offset: 56 Size: 8 [unused] - // float angle; // Offset: 64 Size: 4 [unused] - // float start_offset; // Offset: 68 Size: 4 [unused] - // float end_offset; // Offset: 72 Size: 4 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // cb3 cbuffer NA NA 1 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 1 ( FLT, FLT, FLT, FLT) - // c2 cb0 2 1 ( FLT, FLT, FLT, FLT) - // c3 cb1 0 2 ( FLT, FLT, FLT, FLT) - // c5 cb1 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c6, 1, 0.5, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad r0.xy, v0, c1.zwzw, c1 - add r0.z, r0.x, c6.x - mul r0.z, r0.z, c5.x - mul r1.x, r0.z, c6.y - add r0.z, -r0.y, c6.x - add oPos.xy, r0, c0 - mul r0.x, r0.z, c5.y - mul r1.y, r0.x, c6.y - mov r1.z, c6.x - dp3 oT0.w, r1, c3 - dp3 oT0.z, r1, c4 - mov oPos.zw, c6.xyzx - - // approximately 13 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_constantbuffer cb1[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mov o0.zw, l(0,0,0,1.000000) - mad r0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.xy, r0.xyxx - add r0.x, r0.x, l(1.000000) - add r0.y, -r0.y, l(1.000000) - mul r0.xy, r0.xyxx, cb1[3].xyxx - mul r1.xy, r0.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000) - mov r1.z, l(1.000000) - dp3 o1.z, r1.xyzx, cb1[0].xyzx - dp3 o1.w, r1.xyzx, cb1[1].xyzx - mad o1.xy, v0.xyxx, cb0[2].zwzz, cb0[2].xyxx - ret - // Approximately 12 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb3 - // { - // - // float3x3 DeviceSpaceToUserSpace_cb3;// Offset: 0 Size: 44 [unused] - // float2 dimensions_cb3; // Offset: 48 Size: 8 [unused] - // float2 center; // Offset: 56 Size: 8 - // float angle; // Offset: 64 Size: 4 - // float start_offset; // Offset: 68 Size: 4 - // float end_offset; // Offset: 72 Size: 4 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sWrapSampler sampler NA NA 0 1 - // sMaskSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // mask texture float4 2d 1 1 - // cb3 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 2 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c2, 0.0208350997, -0.0851330012, 0.180141002, -0.330299497 - def c3, 0.999866009, 0, 1, 3.14159274 - def c4, -2, 1.57079637, 1.57079601, 0.159154981 - def c5, 0.5, 0, 0, 0 - dcl t0 - dcl_2d s0 - dcl_2d s1 - add r0.xy, t0.wzzw, -c0.zwzw - abs r0.zw, r0.xyxy - add r1.xy, -r0.zwzw, r0.wzzw - cmp r0.zw, r1.x, r0, r0.xywz - cmp r1.x, r1.y, c3.y, c3.z - rcp r0.w, r0.w - mul r0.z, r0.w, r0.z - mul r0.w, r0.z, r0.z - mad r1.y, r0.w, c2.x, c2.y - mad r1.y, r0.w, r1.y, c2.z - mad r1.y, r0.w, r1.y, c2.w - mad r0.w, r0.w, r1.y, c3.x - mul r0.z, r0.w, r0.z - mad r0.w, r0.z, c4.x, c4.y - mad r0.z, r0.w, r1.x, r0.z - cmp r0.w, r0.x, -c3.y, -c3.w - add r0.z, r0.w, r0.z - add r0.w, r0.z, r0.z - add r1.x, -r0.x, r0.y - cmp r0.xy, r1.x, r0, r0.yxzw - cmp r0.y, r0.y, c3.z, c3.y - cmp r0.x, r0.x, c3.y, r0.y - mad r0.x, r0.x, -r0.w, r0.z - add r0.x, r0.x, -c1.x - add r0.x, r0.x, c4.z - mul r0.y, r0.x, c4.w - abs r0.y, r0.y - frc r0.y, r0.y - cmp r0.x, r0.x, r0.y, -r0.y - add r0.x, r0.x, -c1.y - add r0.y, -c1.y, c1.z - rcp r0.y, r0.y - mul r0.x, r0.y, r0.x - mov r0.y, c5.x - texld r1, t0, s1 - texld r0, r0, s0 - mul r0.xyz, r0.w, r0 - mul r0, r1.w, r0 - mov oC0, r0 - - // approximately 39 instruction slots used (2 texture, 37 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[5], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 2 - add r0.xy, v1.wzww, -cb0[3].wzww - max r0.z, |r0.y|, |r0.x| - div r0.z, l(1.000000, 1.000000, 1.000000, 1.000000), r0.z - min r0.w, |r0.y|, |r0.x| - mul r0.z, r0.z, r0.w - mul r0.w, r0.z, r0.z - mad r1.x, r0.w, l(0.020835), l(-0.085133) - mad r1.x, r0.w, r1.x, l(0.180141) - mad r1.x, r0.w, r1.x, l(-0.330299) - mad r0.w, r0.w, r1.x, l(0.999866) - mul r1.x, r0.w, r0.z - mad r1.x, r1.x, l(-2.000000), l(1.570796) - lt r1.y, |r0.y|, |r0.x| - and r1.x, r1.y, r1.x - mad r0.z, r0.z, r0.w, r1.x - lt r0.w, r0.y, -r0.y - and r0.w, r0.w, l(0xc0490fdb) - add r0.z, r0.w, r0.z - min r0.w, r0.y, r0.x - max r0.x, r0.y, r0.x - ge r0.x, r0.x, -r0.x - lt r0.y, r0.w, -r0.w - and r0.x, r0.x, r0.y - movc r0.x, r0.x, -r0.z, r0.z - add r0.x, r0.x, -cb0[4].x - add r0.x, r0.x, l(1.570796) - mul r0.x, r0.x, l(0.159155) - ge r0.y, r0.x, -r0.x - frc r0.x, |r0.x| - movc r0.x, r0.y, r0.x, -r0.x - add r0.x, r0.x, -cb0[4].y - add r0.y, -cb0[4].y, cb0[4].z - div r0.x, r0.x, r0.y - mov r0.y, l(0.500000) - sample r0.xyzw, r0.xyxx, t0.xyzw, s0 - mul r0.xyz, r0.wwww, r0.xyzx - sample r1.xyzw, v1.xyxx, t1.xyzw, s1 - mul o0.xyzw, r0.xyzw, r1.wwww - ret - // Approximately 39 instruction slots used - - }; - } - - pass APosMirror - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 [unused] - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // cbuffer cb3 - // { - // - // float3x3 DeviceSpaceToUserSpace_cb3;// Offset: 0 Size: 44 - // float2 dimensions_cb3; // Offset: 48 Size: 8 - // float2 center; // Offset: 56 Size: 8 [unused] - // float angle; // Offset: 64 Size: 4 [unused] - // float start_offset; // Offset: 68 Size: 4 [unused] - // float end_offset; // Offset: 72 Size: 4 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // cb3 cbuffer NA NA 1 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 1 ( FLT, FLT, FLT, FLT) - // c2 cb0 2 1 ( FLT, FLT, FLT, FLT) - // c3 cb1 0 2 ( FLT, FLT, FLT, FLT) - // c5 cb1 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c6, 1, 0.5, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad r0.xy, v0, c1.zwzw, c1 - add r0.z, r0.x, c6.x - mul r0.z, r0.z, c5.x - mul r1.x, r0.z, c6.y - add r0.z, -r0.y, c6.x - add oPos.xy, r0, c0 - mul r0.x, r0.z, c5.y - mul r1.y, r0.x, c6.y - mov r1.z, c6.x - dp3 oT0.w, r1, c3 - dp3 oT0.z, r1, c4 - mov oPos.zw, c6.xyzx - - // approximately 13 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_constantbuffer cb1[4], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - dcl_temps 2 - mov o0.zw, l(0,0,0,1.000000) - mad r0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.xy, r0.xyxx - add r0.x, r0.x, l(1.000000) - add r0.y, -r0.y, l(1.000000) - mul r0.xy, r0.xyxx, cb1[3].xyxx - mul r1.xy, r0.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000) - mov r1.z, l(1.000000) - dp3 o1.z, r1.xyzx, cb1[0].xyzx - dp3 o1.w, r1.xyzx, cb1[1].xyzx - mad o1.xy, v0.xyxx, cb0[2].zwzz, cb0[2].xyxx - ret - // Approximately 12 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb3 - // { - // - // float3x3 DeviceSpaceToUserSpace_cb3;// Offset: 0 Size: 44 [unused] - // float2 dimensions_cb3; // Offset: 48 Size: 8 [unused] - // float2 center; // Offset: 56 Size: 8 - // float angle; // Offset: 64 Size: 4 - // float start_offset; // Offset: 68 Size: 4 - // float end_offset; // Offset: 72 Size: 4 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sMirrorSampler sampler NA NA 0 1 - // sMaskSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // mask texture float4 2d 1 1 - // cb3 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 2 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c2, 0.0208350997, -0.0851330012, 0.180141002, -0.330299497 - def c3, 0.999866009, 0, 1, 3.14159274 - def c4, -2, 1.57079637, 1.57079601, 0.159154981 - def c5, 0.5, 0, 0, 0 - dcl t0 - dcl_2d s0 - dcl_2d s1 - add r0.xy, t0.wzzw, -c0.zwzw - abs r0.zw, r0.xyxy - add r1.xy, -r0.zwzw, r0.wzzw - cmp r0.zw, r1.x, r0, r0.xywz - cmp r1.x, r1.y, c3.y, c3.z - rcp r0.w, r0.w - mul r0.z, r0.w, r0.z - mul r0.w, r0.z, r0.z - mad r1.y, r0.w, c2.x, c2.y - mad r1.y, r0.w, r1.y, c2.z - mad r1.y, r0.w, r1.y, c2.w - mad r0.w, r0.w, r1.y, c3.x - mul r0.z, r0.w, r0.z - mad r0.w, r0.z, c4.x, c4.y - mad r0.z, r0.w, r1.x, r0.z - cmp r0.w, r0.x, -c3.y, -c3.w - add r0.z, r0.w, r0.z - add r0.w, r0.z, r0.z - add r1.x, -r0.x, r0.y - cmp r0.xy, r1.x, r0, r0.yxzw - cmp r0.y, r0.y, c3.z, c3.y - cmp r0.x, r0.x, c3.y, r0.y - mad r0.x, r0.x, -r0.w, r0.z - add r0.x, r0.x, -c1.x - add r0.x, r0.x, c4.z - mul r0.y, r0.x, c4.w - abs r0.y, r0.y - frc r0.y, r0.y - cmp r0.x, r0.x, r0.y, -r0.y - add r0.x, r0.x, -c1.y - add r0.y, -c1.y, c1.z - rcp r0.y, r0.y - mul r0.x, r0.y, r0.x - mov r0.y, c5.x - texld r1, t0, s1 - texld r0, r0, s0 - mul r0.xyz, r0.w, r0 - mul r0, r1.w, r0 - mov oC0, r0 - - // approximately 39 instruction slots used (2 texture, 37 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[5], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 2 - add r0.xy, v1.wzww, -cb0[3].wzww - max r0.z, |r0.y|, |r0.x| - div r0.z, l(1.000000, 1.000000, 1.000000, 1.000000), r0.z - min r0.w, |r0.y|, |r0.x| - mul r0.z, r0.z, r0.w - mul r0.w, r0.z, r0.z - mad r1.x, r0.w, l(0.020835), l(-0.085133) - mad r1.x, r0.w, r1.x, l(0.180141) - mad r1.x, r0.w, r1.x, l(-0.330299) - mad r0.w, r0.w, r1.x, l(0.999866) - mul r1.x, r0.w, r0.z - mad r1.x, r1.x, l(-2.000000), l(1.570796) - lt r1.y, |r0.y|, |r0.x| - and r1.x, r1.y, r1.x - mad r0.z, r0.z, r0.w, r1.x - lt r0.w, r0.y, -r0.y - and r0.w, r0.w, l(0xc0490fdb) - add r0.z, r0.w, r0.z - min r0.w, r0.y, r0.x - max r0.x, r0.y, r0.x - ge r0.x, r0.x, -r0.x - lt r0.y, r0.w, -r0.w - and r0.x, r0.x, r0.y - movc r0.x, r0.x, -r0.z, r0.z - add r0.x, r0.x, -cb0[4].x - add r0.x, r0.x, l(1.570796) - mul r0.x, r0.x, l(0.159155) - ge r0.y, r0.x, -r0.x - frc r0.x, |r0.x| - movc r0.x, r0.y, r0.x, -r0.x - add r0.x, r0.x, -cb0[4].y - add r0.y, -cb0[4].y, cb0[4].z - div r0.x, r0.x, r0.y - mov r0.y, l(0.500000) - sample r0.xyzw, r0.xyxx, t0.xyzw, s0 - mul r0.xyz, r0.wwww, r0.xyzx - sample r1.xyzw, v1.xyxx, t1.xyzw, s1 - mul o0.xyzw, r0.xyzw, r1.wwww - ret - // Approximately 39 instruction slots used - - }; - } - -} - -technique10 SampleMaskedTexture -{ - pass P0 - { - RasterizerState = TextureRast; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c4, 0, 1, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx - mad r0.xy, v0, c1.zwzw, c1 - add oPos.xy, r0, c0 - mov oPos.zw, c4.xyxy - - // approximately 5 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.zw, l(0,0,0,1.000000) - mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy - ret - // Approximately 5 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sSampler sampler NA NA 0 1 - // sMaskSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // mask texture float4 2d 1 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0 - dcl_2d s0 - dcl_2d s1 - mov r0.xy, t0.wzzw - texld r1, t0, s0 - texld r0, r0, s1 - mul r0, r0.w, r1 - mov oC0, r0 - - // approximately 5 instruction slots used (2 texture, 3 arithmetic) - ps_4_0 - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 2 - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - sample r1.xyzw, v1.zwzz, t1.xyzw, s1 - mul o0.xyzw, r0.xyzw, r1.wwww - ret - // Approximately 4 instruction slots used - - }; - } - -} - -technique10 SampleTextureWithShadow -{ - pass P0 - { - RasterizerState = TextureRast; - AB_BlendFactor = float4(1, 1, 1, 1); - AB_SampleMask = uint(0xffffffff); - BlendState = ShadowBlendH; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c4, 0, 1, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx - mad r0.xy, v0, c1.zwzw, c1 - add oPos.xy, r0, c0 - mov oPos.zw, c4.xyxy - - // approximately 5 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.zw, l(0,0,0,1.000000) - mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy - ret - // Approximately 5 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb1 - // { - // - // float4 BlurOffsetsH[3]; // Offset: 0 Size: 48 - // float4 BlurOffsetsV[3]; // Offset: 48 Size: 48 [unused] - // float4 BlurWeights[3]; // Offset: 96 Size: 48 - // float4 ShadowColor; // Offset: 144 Size: 16 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sShadowSampler sampler NA NA 0 1 - // tex texture float4 2d 0 1 - // cb1 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 0 3 ( FLT, FLT, FLT, FLT) - // c3 cb0 6 4 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0 - dcl_2d s0 - add r0.x, t0.x, c0.y - mov r0.y, t0.y - add r1.x, t0.x, c0.x - mov r1.y, t0.y - texld r0, r0, s0 - texld r1, r1, s0 - mul r0.x, r0.w, c3.y - mad r0.x, c3.x, r1.w, r0.x - add r1.x, t0.x, c0.z - mov r1.y, t0.y - add r2.x, t0.x, c0.w - mov r2.y, t0.y - texld r1, r1, s0 - texld r2, r2, s0 - mad r0.x, c3.z, r1.w, r0.x - mad r0.x, c3.w, r2.w, r0.x - add r1.x, t0.x, c1.x - mov r1.y, t0.y - add r2.x, t0.x, c1.y - mov r2.y, t0.y - texld r1, r1, s0 - texld r2, r2, s0 - mad r0.x, c4.x, r1.w, r0.x - mad r0.x, c4.y, r2.w, r0.x - add r1.x, t0.x, c1.z - mov r1.y, t0.y - add r2.x, t0.x, c1.w - mov r2.y, t0.y - texld r1, r1, s0 - texld r2, r2, s0 - mad r0.x, c4.z, r1.w, r0.x - mad r0.x, c4.w, r2.w, r0.x - add r1.x, t0.x, c2.x - mov r1.y, t0.y - texld r1, r1, s0 - mad r0.x, c5.x, r1.w, r0.x - mul r0, r0.x, c6 - mov oC0, r0 - - // approximately 38 instruction slots used (9 texture, 29 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[10], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_temps 4 - add r0.xyzw, v1.xxxx, cb0[0].zxwy - mov r1.xz, r0.yywy - mov r1.yw, v1.yyyy - sample r2.xyzw, r1.zwzz, t0.xyzw, s0 - sample r1.xyzw, r1.xyxx, t0.xyzw, s0 - mul r1.x, r2.w, cb0[6].y - mad r1.x, cb0[6].x, r1.w, r1.x - mov r0.yw, v1.yyyy - sample r2.xyzw, r0.xyxx, t0.xyzw, s0 - sample r0.xyzw, r0.zwzz, t0.xyzw, s0 - mad r0.x, cb0[6].z, r2.w, r1.x - mad r0.x, cb0[6].w, r0.w, r0.x - add r1.xyzw, v1.xxxx, cb0[1].zxwy - mov r2.xz, r1.yywy - mov r2.yw, v1.yyyy - sample r3.xyzw, r2.xyxx, t0.xyzw, s0 - sample r2.xyzw, r2.zwzz, t0.xyzw, s0 - mad r0.x, cb0[7].x, r3.w, r0.x - mad r0.x, cb0[7].y, r2.w, r0.x - mov r1.yw, v1.yyyy - sample r2.xyzw, r1.xyxx, t0.xyzw, s0 - sample r1.xyzw, r1.zwzz, t0.xyzw, s0 - mad r0.x, cb0[7].z, r2.w, r0.x - mad r0.x, cb0[7].w, r1.w, r0.x - add r1.x, v1.x, cb0[2].x - mov r1.y, v1.y - sample r1.xyzw, r1.xyxx, t0.xyzw, s0 - mad r0.x, cb0[8].x, r1.w, r0.x - mul o0.xyzw, r0.xxxx, cb0[9].xyzw - ret - // Approximately 30 instruction slots used - - }; - } - - pass P1 - { - RasterizerState = TextureRast; - AB_BlendFactor = float4(1, 1, 1, 1); - AB_SampleMask = uint(0xffffffff); - BlendState = ShadowBlendV; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c4, 0, 1, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx - mad r0.xy, v0, c1.zwzw, c1 - add oPos.xy, r0, c0 - mov oPos.zw, c4.xyxy - - // approximately 5 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.zw, l(0,0,0,1.000000) - mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy - ret - // Approximately 5 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb1 - // { - // - // float4 BlurOffsetsH[3]; // Offset: 0 Size: 48 [unused] - // float4 BlurOffsetsV[3]; // Offset: 48 Size: 48 - // float4 BlurWeights[3]; // Offset: 96 Size: 48 - // float4 ShadowColor; // Offset: 144 Size: 16 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sShadowSampler sampler NA NA 0 1 - // tex texture float4 2d 0 1 - // cb1 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 6 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0 - dcl_2d s0 - add r0.y, t0.y, c0.y - mov r0.x, t0.x - add r1.y, t0.y, c0.x - mov r1.x, t0.x - texld r0, r0, s0 - texld r1, r1, s0 - mul r0, r0, c3.y - mad r0, c3.x, r1, r0 - add r1.y, t0.y, c0.z - mov r1.x, t0.x - add r2.y, t0.y, c0.w - mov r2.x, t0.x - texld r1, r1, s0 - texld r2, r2, s0 - mad r0, c3.z, r1, r0 - mad r0, c3.w, r2, r0 - add r1.y, t0.y, c1.x - mov r1.x, t0.x - add r2.y, t0.y, c1.y - mov r2.x, t0.x - texld r1, r1, s0 - texld r2, r2, s0 - mad r0, c4.x, r1, r0 - mad r0, c4.y, r2, r0 - add r1.y, t0.y, c1.z - mov r1.x, t0.x - add r2.y, t0.y, c1.w - mov r2.x, t0.x - texld r1, r1, s0 - texld r2, r2, s0 - mad r0, c4.z, r1, r0 - mad r0, c4.w, r2, r0 - add r1.y, t0.y, c2.x - mov r1.x, t0.x - texld r1, r1, s0 - mad r0, c5.x, r1, r0 - mov oC0, r0 - - // approximately 37 instruction slots used (9 texture, 28 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[9], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_temps 4 - mov r0.xz, v1.xxxx - add r1.xyzw, v1.yyyy, cb0[3].xzyw - mov r0.yw, r1.xxxz - sample r2.xyzw, r0.zwzz, t0.xyzw, s0 - sample r0.xyzw, r0.xyxx, t0.xyzw, s0 - mul r2.xyzw, r2.xyzw, cb0[6].yyyy - mad r0.xyzw, cb0[6].xxxx, r0.xyzw, r2.xyzw - mov r1.xz, v1.xxxx - sample r2.xyzw, r1.xyxx, t0.xyzw, s0 - sample r1.xyzw, r1.zwzz, t0.xyzw, s0 - mad r0.xyzw, cb0[6].zzzz, r2.xyzw, r0.xyzw - mad r0.xyzw, cb0[6].wwww, r1.xyzw, r0.xyzw - mov r1.xz, v1.xxxx - add r2.xyzw, v1.yyyy, cb0[4].xzyw - mov r1.yw, r2.xxxz - sample r3.xyzw, r1.xyxx, t0.xyzw, s0 - sample r1.xyzw, r1.zwzz, t0.xyzw, s0 - mad r0.xyzw, cb0[7].xxxx, r3.xyzw, r0.xyzw - mad r0.xyzw, cb0[7].yyyy, r1.xyzw, r0.xyzw - mov r2.xz, v1.xxxx - sample r1.xyzw, r2.xyxx, t0.xyzw, s0 - sample r2.xyzw, r2.zwzz, t0.xyzw, s0 - mad r0.xyzw, cb0[7].zzzz, r1.xyzw, r0.xyzw - mad r0.xyzw, cb0[7].wwww, r2.xyzw, r0.xyzw - add r1.y, v1.y, cb0[5].x - mov r1.x, v1.x - sample r1.xyzw, r1.xyxx, t0.xyzw, s0 - mad o0.xyzw, cb0[8].xxxx, r1.xyzw, r0.xyzw - ret - // Approximately 29 instruction slots used - - }; - } - - pass P2 - { - RasterizerState = TextureRast; - AB_BlendFactor = float4(1, 1, 1, 1); - AB_SampleMask = uint(0xffffffff); - BlendState = ShadowBlendV; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c4, 0, 1, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx - mad r0.xy, v0, c1.zwzw, c1 - add oPos.xy, r0, c0 - mov oPos.zw, c4.xyxy - - // approximately 5 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.zw, l(0,0,0,1.000000) - mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy - ret - // Approximately 5 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb1 - // { - // - // float4 BlurOffsetsH[3]; // Offset: 0 Size: 48 [unused] - // float4 BlurOffsetsV[3]; // Offset: 48 Size: 48 - // float4 BlurWeights[3]; // Offset: 96 Size: 48 - // float4 ShadowColor; // Offset: 144 Size: 16 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sMaskSampler sampler NA NA 0 1 - // sShadowSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // mask texture float4 2d 1 1 - // cb1 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 6 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t1 - // s1 s1 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - dcl t0 - dcl_2d s0 - dcl_2d s1 - add r0.y, t0.y, c0.y - mov r0.x, t0.x - add r1.y, t0.y, c0.x - mov r1.x, t0.x - texld r0, r0, s1 - texld r1, r1, s1 - mul r0, r0, c3.y - mad r0, c3.x, r1, r0 - add r1.y, t0.y, c0.z - mov r1.x, t0.x - add r2.y, t0.y, c0.w - mov r2.x, t0.x - texld r1, r1, s1 - texld r2, r2, s1 - mad r0, c3.z, r1, r0 - mad r0, c3.w, r2, r0 - add r1.y, t0.y, c1.x - mov r1.x, t0.x - add r2.y, t0.y, c1.y - mov r2.x, t0.x - texld r1, r1, s1 - texld r2, r2, s1 - mad r0, c4.x, r1, r0 - mad r0, c4.y, r2, r0 - add r1.y, t0.y, c1.z - mov r1.x, t0.x - add r2.y, t0.y, c1.w - mov r2.x, t0.x - texld r1, r1, s1 - texld r2, r2, s1 - mad r0, c4.z, r1, r0 - mad r0, c4.w, r2, r0 - add r1.y, t0.y, c2.x - mov r1.x, t0.x - mov r2.xy, t0.wzzw - texld r1, r1, s1 - texld r2, r2, s0 - mad r0, c5.x, r1, r0 - mul r0, r2.w, r0 - mov oC0, r0 - - // approximately 40 instruction slots used (10 texture, 30 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[9], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_temps 4 - mov r0.xz, v1.xxxx - add r1.xyzw, v1.yyyy, cb0[3].xzyw - mov r0.yw, r1.xxxz - sample r2.xyzw, r0.zwzz, t0.xyzw, s1 - sample r0.xyzw, r0.xyxx, t0.xyzw, s1 - mul r2.xyzw, r2.xyzw, cb0[6].yyyy - mad r0.xyzw, cb0[6].xxxx, r0.xyzw, r2.xyzw - mov r1.xz, v1.xxxx - sample r2.xyzw, r1.xyxx, t0.xyzw, s1 - sample r1.xyzw, r1.zwzz, t0.xyzw, s1 - mad r0.xyzw, cb0[6].zzzz, r2.xyzw, r0.xyzw - mad r0.xyzw, cb0[6].wwww, r1.xyzw, r0.xyzw - mov r1.xz, v1.xxxx - add r2.xyzw, v1.yyyy, cb0[4].xzyw - mov r1.yw, r2.xxxz - sample r3.xyzw, r1.xyxx, t0.xyzw, s1 - sample r1.xyzw, r1.zwzz, t0.xyzw, s1 - mad r0.xyzw, cb0[7].xxxx, r3.xyzw, r0.xyzw - mad r0.xyzw, cb0[7].yyyy, r1.xyzw, r0.xyzw - mov r2.xz, v1.xxxx - sample r1.xyzw, r2.xyxx, t0.xyzw, s1 - sample r2.xyzw, r2.zwzz, t0.xyzw, s1 - mad r0.xyzw, cb0[7].zzzz, r1.xyzw, r0.xyzw - mad r0.xyzw, cb0[7].wwww, r2.xyzw, r0.xyzw - add r1.y, v1.y, cb0[5].x - mov r1.x, v1.x - sample r1.xyzw, r1.xyxx, t0.xyzw, s1 - mad r0.xyzw, cb0[8].xxxx, r1.xyzw, r0.xyzw - sample r1.xyzw, v1.zwzz, t1.xyzw, s0 - mul o0.xyzw, r0.xyzw, r1.wwww - ret - // Approximately 31 instruction slots used - - }; - } - -} - -technique10 SampleTextTexture -{ - pass Unmasked - { - RasterizerState = TextureRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = bTextBlend; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c4, 0, 1, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx - mad r0.xy, v0, c1.zwzw, c1 - add oPos.xy, r0, c0 - mov oPos.zw, c4.xyxy - - // approximately 5 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.zw, l(0,0,0,1.000000) - mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy - ret - // Approximately 5 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 [unused] - // float4 TexCoords; // Offset: 16 Size: 16 [unused] - // float4 MaskTexCoords; // Offset: 32 Size: 16 [unused] - // float4 TextColor; // Offset: 48 Size: 16 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sSampler sampler NA NA 0 1 - // tex texture float4 2d 0 1 - // cb0 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // SV_Target 1 xyzw 1 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c1, 1, 0, 0, 0 - dcl t0 - dcl_2d s0 - mov r0.xyz, c0 - mad r0, r0.xyzx, c1.xxxy, c1.yyyx - mov oC0, r0 - texld r0, t0, s0 - mul r0, r0.zyxy, c0.w - mov oC1, r0 - - // approximately 6 instruction slots used (1 texture, 5 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_input_ps linear v1.xy - dcl_output o0.xyzw - dcl_output o1.xyzw - dcl_temps 1 - mov o0.xyz, cb0[3].xyzx - mov o0.w, l(1.000000) - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - mul o1.xyzw, r0.zyxy, cb0[3].wwww - ret - // Approximately 5 instruction slots used - - }; - } - - pass Masked - { - RasterizerState = TextureRast; - AB_BlendFactor = float4(0, 0, 0, 0); - AB_SampleMask = uint(0xffffffff); - BlendState = bTextBlend; - VertexShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 - // float4 TexCoords; // Offset: 16 Size: 16 - // float4 MaskTexCoords; // Offset: 32 Size: 16 - // float4 TextColor; // Offset: 48 Size: 16 [unused] - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // cb0 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // POSITION 0 xyz 0 NONE float xy - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float xyzw - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c1 cb0 0 3 ( FLT, FLT, FLT, FLT) - // - // - // Runtime generated constant mappings: - // - // Target Reg Constant Description - // ---------- -------------------------------------------------- - // c0 Vertex Shader position offset - // - // - // Level9 shader bytecode: - // - vs_2_x - def c4, 0, 1, 0, 0 - dcl_texcoord v0 - mad oT0.xy, v0, c2.zwzw, c2 - mad oT0.zw, v0.xyyx, c3.xywz, c3.xyyx - mad r0.xy, v0, c1.zwzw, c1 - add oPos.xy, r0, c0 - mov oPos.zw, c4.xyxy - - // approximately 5 instruction slots used - vs_4_0 - dcl_constantbuffer cb0[3], immediateIndexed - dcl_input v0.xy - dcl_output_siv o0.xyzw, position - dcl_output o1.xy - dcl_output o1.zw - mad o0.xy, v0.xyxx, cb0[0].zwzz, cb0[0].xyxx - mov o0.zw, l(0,0,0,1.000000) - mad o1.xy, v0.xyxx, cb0[1].zwzz, cb0[1].xyxx - mad o1.zw, v0.xxxy, cb0[2].zzzw, cb0[2].xxxy - ret - // Approximately 5 instruction slots used - - }; - GeometryShader = NULL; - PixelShader = asm { - // - // Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 - // - // - // Buffer Definitions: - // - // cbuffer cb0 - // { - // - // float4 QuadDesc; // Offset: 0 Size: 16 [unused] - // float4 TexCoords; // Offset: 16 Size: 16 [unused] - // float4 MaskTexCoords; // Offset: 32 Size: 16 [unused] - // float4 TextColor; // Offset: 48 Size: 16 - // - // } - // - // - // Resource Bindings: - // - // Name Type Format Dim Slot Elements - // ------------------------------ ---------- ------- ----------- ---- -------- - // sSampler sampler NA NA 0 1 - // sMaskSampler sampler NA NA 1 1 - // tex texture float4 2d 0 1 - // mask texture float4 2d 1 1 - // cb0 cbuffer NA NA 0 1 - // - // - // - // Input signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Position 0 xyzw 0 POS float - // TEXCOORD 0 xy 1 NONE float xy - // TEXCOORD 1 zw 1 NONE float zw - // - // - // Output signature: - // - // Name Index Mask Register SysValue Format Used - // -------------------- ----- ------ -------- -------- ------- ------ - // SV_Target 0 xyzw 0 TARGET float xyzw - // SV_Target 1 xyzw 1 TARGET float xyzw - // - // - // Constant buffer to DX9 shader constant mappings: - // - // Target Reg Buffer Start Reg # of Regs Data Conversion - // ---------- ------- --------- --------- ---------------------- - // c0 cb0 3 1 ( FLT, FLT, FLT, FLT) - // - // - // Sampler/Resource to DX9 shader sampler mappings: - // - // Target Sampler Source Sampler Source Resource - // -------------- --------------- ---------------- - // s0 s0 t0 - // s1 s1 t1 - // - // - // Level9 shader bytecode: - // - ps_2_x - def c1, 1, 0, 0, 0 - dcl t0 - dcl_2d s0 - dcl_2d s1 - mov r0.xyz, c0 - mad r0, r0.xyzx, c1.xxxy, c1.yyyx - mov oC0, r0 - mov r0.xy, t0.wzzw - texld r1, t0, s0 - texld r0, r0, s1 - mul r1, r1.zyxy, c0.w - mul r0, r0.w, r1 - mov oC1, r0 - - // approximately 9 instruction slots used (2 texture, 7 arithmetic) - ps_4_0 - dcl_constantbuffer cb0[4], immediateIndexed - dcl_sampler s0, mode_default - dcl_sampler s1, mode_default - dcl_resource_texture2d (float,float,float,float) t0 - dcl_resource_texture2d (float,float,float,float) t1 - dcl_input_ps linear v1.xy - dcl_input_ps linear v1.zw - dcl_output o0.xyzw - dcl_output o1.xyzw - dcl_temps 2 - mov o0.xyz, cb0[3].xyzx - mov o0.w, l(1.000000) - sample r0.xyzw, v1.xyxx, t0.xyzw, s0 - mul r0.xyzw, r0.zyxy, cb0[3].wwww - sample r1.xyzw, v1.zwzz, t1.xyzw, s1 - mul o1.xyzw, r0.xyzw, r1.wwww - ret - // Approximately 7 instruction slots used - - }; - } - -} - -#endif - -const BYTE d2deffect[] = { - 68, 88, 66, 67, 90, 71, 243, 245, 168, 88, 153, 105, 108, 146, 135, - 174, 199, 125, 74, 149, 1, 0, 0, 0, 137, 80, 1, 0, 1, 0, - 0, 0, 36, 0, 0, 0, 70, 88, 49, 48, 93, 80, 1, 0, 1, - 16, 255, 254, 5, 0, 0, 0, 22, 0, 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, - 0, 37, 66, 1, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 38, 0, 0, 0, - 0, 0, 0, 0, 36, 71, 108, 111, 98, 97, 108, 115, 0, 117, 105, - 110, 116, 0, 13, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 25, 9, 0, - 0, 98, 108, 101, 110, 100, 111, 112, 0, 99, 98, 48, 0, 102, 108, - 111, 97, 116, 52, 0, 58, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 10, - 33, 0, 0, 81, 117, 97, 100, 68, 101, 115, 99, 0, 84, 101, 120, - 67, 111, 111, 114, 100, 115, 0, 77, 97, 115, 107, 84, 101, 120, 67, - 111, 111, 114, 100, 115, 0, 84, 101, 120, 116, 67, 111, 108, 111, 114, - 0, 99, 98, 49, 0, 58, 0, 0, 0, 1, 0, 0, 0, 3, 0, - 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 48, 0, 0, 0, 10, - 33, 0, 0, 66, 108, 117, 114, 79, 102, 102, 115, 101, 116, 115, 72, - 0, 66, 108, 117, 114, 79, 102, 102, 115, 101, 116, 115, 86, 0, 66, - 108, 117, 114, 87, 101, 105, 103, 104, 116, 115, 0, 83, 104, 97, 100, - 111, 119, 67, 111, 108, 111, 114, 0, 99, 98, 50, 0, 102, 108, 111, - 97, 116, 51, 120, 51, 0, 222, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 44, 0, 0, 0, 48, 0, 0, 0, 36, 0, 0, 0, - 11, 91, 0, 0, 68, 101, 118, 105, 99, 101, 83, 112, 97, 99, 101, - 84, 111, 85, 115, 101, 114, 83, 112, 97, 99, 101, 0, 102, 108, 111, - 97, 116, 50, 0, 26, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 8, 0, 0, 0, 16, 0, 0, 0, 8, 0, 0, 0, 10, 17, - 0, 0, 100, 105, 109, 101, 110, 115, 105, 111, 110, 115, 0, 102, 108, - 111, 97, 116, 51, 0, 72, 1, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 12, 0, 0, 0, 10, - 25, 0, 0, 100, 105, 102, 102, 0, 99, 101, 110, 116, 101, 114, 49, - 0, 102, 108, 111, 97, 116, 0, 120, 1, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 4, 0, 0, - 0, 9, 9, 0, 0, 65, 0, 114, 97, 100, 105, 117, 115, 49, 0, - 115, 113, 95, 114, 97, 100, 105, 117, 115, 49, 0, 99, 98, 51, 0, - 68, 101, 118, 105, 99, 101, 83, 112, 97, 99, 101, 84, 111, 85, 115, - 101, 114, 83, 112, 97, 99, 101, 95, 99, 98, 51, 0, 100, 105, 109, - 101, 110, 115, 105, 111, 110, 115, 95, 99, 98, 51, 0, 99, 101, 110, - 116, 101, 114, 0, 97, 110, 103, 108, 101, 0, 115, 116, 97, 114, 116, - 95, 111, 102, 102, 115, 101, 116, 0, 101, 110, 100, 95, 111, 102, 102, - 115, 101, 116, 0, 84, 101, 120, 116, 117, 114, 101, 50, 68, 0, 2, - 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 116, 101, 120, - 0, 98, 99, 107, 116, 101, 120, 0, 109, 97, 115, 107, 0, 83, 97, - 109, 112, 108, 101, 114, 83, 116, 97, 116, 101, 0, 56, 2, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 21, 0, 0, 0, 115, 83, 97, 109, 112, 108, - 101, 114, 0, 1, 0, 0, 0, 2, 0, 0, 0, 21, 0, 0, 0, - 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, - 0, 2, 0, 0, 0, 3, 0, 0, 0, 115, 66, 99, 107, 83, 97, - 109, 112, 108, 101, 114, 0, 1, 0, 0, 0, 2, 0, 0, 0, 21, - 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 115, 87, 114, - 97, 112, 83, 97, 109, 112, 108, 101, 114, 0, 1, 0, 0, 0, 2, - 0, 0, 0, 21, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, - 0, 115, 77, 105, 114, 114, 111, 114, 83, 97, 109, 112, 108, 101, 114, - 0, 1, 0, 0, 0, 2, 0, 0, 0, 21, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, - 0, 0, 0, 2, 0, 0, 0, 115, 77, 97, 115, 107, 83, 97, 109, - 112, 108, 101, 114, 0, 1, 0, 0, 0, 2, 0, 0, 0, 21, 0, - 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 1, - 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 115, 83, 104, 97, - 100, 111, 119, 83, 97, 109, 112, 108, 101, 114, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 21, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, - 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 4, 0, - 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 82, 97, 115, 116, 101, 114, 105, - 122, 101, 114, 83, 116, 97, 116, 101, 0, 170, 3, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 84, 101, 120, 116, 117, 114, 101, 82, - 97, 115, 116, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, - 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 66, 108, - 101, 110, 100, 83, 116, 97, 116, 101, 0, 250, 3, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 83, 104, 97, 100, 111, 119, 66, 108, - 101, 110, 100, 72, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 15, 0, 0, 0, 83, - 104, 97, 100, 111, 119, 66, 108, 101, 110, 100, 86, 0, 1, 0, 0, - 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, - 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 6, - 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, - 0, 2, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 15, - 0, 0, 0, 98, 84, 101, 120, 116, 66, 108, 101, 110, 100, 0, 1, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, - 0, 16, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 17, 0, - 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, - 0, 0, 0, 2, 0, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 19, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 15, 0, - 0, 0, 83, 97, 109, 112, 108, 101, 84, 101, 120, 116, 117, 114, 101, - 0, 80, 48, 0, 68, 4, 0, 0, 68, 88, 66, 67, 77, 85, 167, - 240, 56, 56, 155, 78, 125, 96, 49, 253, 103, 100, 22, 62, 1, 0, - 0, 0, 68, 4, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 248, - 0, 0, 0, 244, 1, 0, 0, 112, 2, 0, 0, 160, 3, 0, 0, - 212, 3, 0, 0, 65, 111, 110, 57, 184, 0, 0, 0, 184, 0, 0, - 0, 0, 2, 254, 255, 132, 0, 0, 0, 52, 0, 0, 0, 1, 0, - 36, 0, 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 36, 0, 1, - 0, 48, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 254, 255, 81, 0, 0, 5, 4, 0, 15, - 160, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, - 0, 0, 31, 0, 0, 2, 5, 0, 0, 128, 0, 0, 15, 144, 4, - 0, 0, 4, 0, 0, 3, 224, 0, 0, 228, 144, 2, 0, 238, 160, - 2, 0, 228, 160, 4, 0, 0, 4, 0, 0, 12, 224, 0, 0, 20, - 144, 3, 0, 180, 160, 3, 0, 20, 160, 4, 0, 0, 4, 0, 0, - 3, 128, 0, 0, 228, 144, 1, 0, 238, 160, 1, 0, 228, 160, 2, - 0, 0, 3, 0, 0, 3, 192, 0, 0, 228, 128, 0, 0, 228, 160, - 1, 0, 0, 2, 0, 0, 12, 192, 4, 0, 68, 160, 255, 255, 0, - 0, 83, 72, 68, 82, 244, 0, 0, 0, 64, 0, 1, 0, 61, 0, - 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 95, 0, 0, 3, 50, 16, 16, 0, 0, 0, 0, 0, - 103, 0, 0, 4, 242, 32, 16, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 101, 0, 0, 3, 50, 32, 16, 0, 1, 0, 0, 0, 101, 0, - 0, 3, 194, 32, 16, 0, 1, 0, 0, 0, 50, 0, 0, 11, 50, - 32, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, - 230, 138, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, 32, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 8, 194, 32, - 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 63, 50, 0, 0, 11, - 50, 32, 16, 0, 1, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 70, 128, - 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 11, 194, - 32, 16, 0, 1, 0, 0, 0, 6, 20, 16, 0, 0, 0, 0, 0, - 166, 142, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 132, 32, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 62, 0, 0, 1, 83, 84, - 65, 84, 116, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 82, 68, 69, 70, 40, 1, 0, 0, 1, 0, 0, 0, 64, - 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 0, 4, 254, 255, - 0, 1, 0, 0, 246, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 99, 98, 48, 0, 60, - 0, 0, 0, 4, 0, 0, 0, 88, 0, 0, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, 0, - 0, 0, 212, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 2, - 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 222, 0, 0, 0, - 32, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, 0, 0, - 0, 0, 0, 0, 0, 236, 0, 0, 0, 48, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 81, - 117, 97, 100, 68, 101, 115, 99, 0, 171, 171, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 101, 120, - 67, 111, 111, 114, 100, 115, 0, 77, 97, 115, 107, 84, 101, 120, 67, - 111, 111, 114, 100, 115, 0, 84, 101, 120, 116, 67, 111, 108, 111, 114, - 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, 73, 83, 71, 78, 44, 0, 0, 0, 1, - 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 7, 3, 0, - 0, 80, 79, 83, 73, 84, 73, 79, 78, 0, 171, 171, 171, 79, 83, - 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 12, - 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, 0, 12, 3, 0, 0, 83, 86, 95, 80, - 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, - 68, 0, 171, 171, 171, 59, 5, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 212, 2, 0, 0, 68, - 88, 66, 67, 17, 106, 69, 218, 119, 68, 79, 85, 211, 176, 27, 183, - 77, 210, 131, 41, 1, 0, 0, 0, 212, 2, 0, 0, 6, 0, 0, - 0, 56, 0, 0, 0, 164, 0, 0, 0, 16, 1, 0, 0, 140, 1, - 0, 0, 48, 2, 0, 0, 160, 2, 0, 0, 65, 111, 110, 57, 100, - 0, 0, 0, 100, 0, 0, 0, 0, 2, 255, 255, 60, 0, 0, 0, - 40, 0, 0, 0, 0, 0, 40, 0, 0, 0, 40, 0, 0, 0, 40, - 0, 1, 0, 36, 0, 0, 0, 40, 0, 0, 0, 0, 0, 1, 2, - 255, 255, 31, 0, 0, 2, 0, 0, 0, 128, 0, 0, 15, 176, 31, - 0, 0, 2, 0, 0, 0, 144, 0, 8, 15, 160, 66, 0, 0, 3, - 0, 0, 15, 128, 0, 0, 228, 176, 0, 8, 228, 160, 1, 0, 0, - 2, 0, 8, 15, 128, 0, 0, 228, 128, 255, 255, 0, 0, 83, 72, - 68, 82, 100, 0, 0, 0, 64, 0, 0, 0, 25, 0, 0, 0, 90, - 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, 0, 88, 24, 0, 4, - 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, 0, 0, 98, 16, 0, - 3, 50, 16, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, - 16, 0, 0, 0, 0, 0, 69, 0, 0, 9, 242, 32, 16, 0, 0, - 0, 0, 0, 70, 16, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, - 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 62, 0, 0, - 1, 83, 84, 65, 84, 116, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 82, 68, 69, 70, 156, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 28, 0, 0, 0, 0, - 4, 255, 255, 0, 1, 0, 0, 105, 0, 0, 0, 92, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 101, 0, - 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, - 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, - 115, 83, 97, 109, 112, 108, 101, 114, 0, 116, 101, 120, 0, 77, 105, - 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, - 56, 52, 0, 171, 73, 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, - 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 3, 3, 0, 0, 92, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, 0, - 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, - 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 79, 83, 71, 78, - 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 97, 114, 103, 101, 116, - 0, 171, 171, 151, 9, 0, 0, 0, 0, 0, 0, 83, 97, 109, 112, - 108, 101, 84, 101, 120, 116, 117, 114, 101, 70, 111, 114, 83, 101, 112, - 97, 114, 97, 98, 108, 101, 66, 108, 101, 110, 100, 105, 110, 103, 95, - 49, 0, 68, 4, 0, 0, 68, 88, 66, 67, 77, 85, 167, 240, 56, - 56, 155, 78, 125, 96, 49, 253, 103, 100, 22, 62, 1, 0, 0, 0, - 68, 4, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 248, 0, 0, - 0, 244, 1, 0, 0, 112, 2, 0, 0, 160, 3, 0, 0, 212, 3, - 0, 0, 65, 111, 110, 57, 184, 0, 0, 0, 184, 0, 0, 0, 0, - 2, 254, 255, 132, 0, 0, 0, 52, 0, 0, 0, 1, 0, 36, 0, - 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 36, 0, 1, 0, 48, - 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 254, 255, 81, 0, 0, 5, 4, 0, 15, 160, 0, - 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 31, 0, 0, 2, 5, 0, 0, 128, 0, 0, 15, 144, 4, 0, 0, - 4, 0, 0, 3, 224, 0, 0, 228, 144, 2, 0, 238, 160, 2, 0, - 228, 160, 4, 0, 0, 4, 0, 0, 12, 224, 0, 0, 20, 144, 3, - 0, 180, 160, 3, 0, 20, 160, 4, 0, 0, 4, 0, 0, 3, 128, - 0, 0, 228, 144, 1, 0, 238, 160, 1, 0, 228, 160, 2, 0, 0, - 3, 0, 0, 3, 192, 0, 0, 228, 128, 0, 0, 228, 160, 1, 0, - 0, 2, 0, 0, 12, 192, 4, 0, 68, 160, 255, 255, 0, 0, 83, - 72, 68, 82, 244, 0, 0, 0, 64, 0, 1, 0, 61, 0, 0, 0, - 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 95, 0, 0, 3, 50, 16, 16, 0, 0, 0, 0, 0, 103, 0, - 0, 4, 242, 32, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 101, - 0, 0, 3, 50, 32, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, - 194, 32, 16, 0, 1, 0, 0, 0, 50, 0, 0, 11, 50, 32, 16, - 0, 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 8, 194, 32, 16, 0, - 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 128, 63, 50, 0, 0, 11, 50, 32, - 16, 0, 1, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, - 138, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 11, 194, 32, 16, - 0, 1, 0, 0, 0, 6, 20, 16, 0, 0, 0, 0, 0, 166, 142, - 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 132, 32, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, - 116, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 68, 69, 70, 40, 1, 0, 0, 1, 0, 0, 0, 64, 0, 0, - 0, 1, 0, 0, 0, 28, 0, 0, 0, 0, 4, 254, 255, 0, 1, - 0, 0, 246, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 99, 98, 48, 0, 60, 0, 0, - 0, 4, 0, 0, 0, 88, 0, 0, 0, 64, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 16, - 0, 0, 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, - 212, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, - 0, 196, 0, 0, 0, 0, 0, 0, 0, 222, 0, 0, 0, 32, 0, - 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, - 0, 0, 0, 236, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 81, 117, 97, - 100, 68, 101, 115, 99, 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 101, 120, 67, 111, - 111, 114, 100, 115, 0, 77, 97, 115, 107, 84, 101, 120, 67, 111, 111, - 114, 100, 115, 0, 84, 101, 120, 116, 67, 111, 108, 111, 114, 0, 77, - 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, - 51, 56, 52, 0, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, - 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 7, 3, 0, 0, 80, - 79, 83, 73, 84, 73, 79, 78, 0, 171, 171, 171, 79, 83, 71, 78, - 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 12, 0, 0, - 92, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 12, 3, 0, 0, 83, 86, 95, 80, 111, 115, - 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, - 171, 171, 171, 155, 12, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 72, 13, 0, 0, 68, 88, 66, - 67, 193, 65, 249, 15, 188, 209, 36, 123, 179, 111, 3, 63, 40, 10, - 7, 98, 1, 0, 0, 0, 72, 13, 0, 0, 6, 0, 0, 0, 56, - 0, 0, 0, 172, 4, 0, 0, 188, 10, 0, 0, 56, 11, 0, 0, - 164, 12, 0, 0, 20, 13, 0, 0, 65, 111, 110, 57, 108, 4, 0, - 0, 108, 4, 0, 0, 0, 2, 255, 255, 52, 4, 0, 0, 56, 0, - 0, 0, 1, 0, 44, 0, 0, 0, 56, 0, 0, 0, 56, 0, 2, - 0, 36, 0, 0, 0, 56, 0, 0, 0, 0, 0, 1, 1, 1, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 2, 255, - 255, 81, 0, 0, 5, 1, 0, 15, 160, 0, 0, 128, 191, 0, 0, - 0, 192, 0, 0, 64, 192, 0, 0, 128, 192, 81, 0, 0, 5, 2, - 0, 15, 160, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 192, 81, 0, 0, 5, 3, 0, 15, 160, 0, 0, 160, - 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, - 0, 2, 0, 0, 0, 128, 0, 0, 15, 176, 31, 0, 0, 2, 0, - 0, 0, 144, 0, 8, 15, 160, 31, 0, 0, 2, 0, 0, 0, 144, - 1, 8, 15, 160, 1, 0, 0, 2, 0, 0, 8, 128, 0, 0, 0, - 160, 2, 0, 0, 3, 0, 0, 1, 128, 0, 0, 255, 128, 3, 0, - 0, 160, 5, 0, 0, 3, 0, 0, 1, 128, 0, 0, 0, 128, 0, - 0, 0, 128, 66, 0, 0, 3, 1, 0, 15, 128, 0, 0, 228, 176, - 1, 8, 228, 160, 66, 0, 0, 3, 2, 0, 15, 128, 0, 0, 228, - 176, 0, 8, 228, 160, 6, 0, 0, 2, 0, 0, 2, 128, 2, 0, - 255, 128, 4, 0, 0, 4, 3, 0, 7, 128, 2, 0, 228, 128, 0, - 0, 85, 128, 2, 0, 0, 161, 5, 0, 0, 3, 3, 0, 7, 128, - 3, 0, 228, 128, 3, 0, 228, 128, 4, 0, 0, 4, 4, 0, 7, - 128, 2, 0, 228, 128, 0, 0, 85, 129, 2, 0, 0, 160, 6, 0, - 0, 2, 3, 0, 8, 128, 4, 0, 0, 128, 6, 0, 0, 2, 4, - 0, 8, 128, 1, 0, 255, 128, 5, 0, 0, 3, 5, 0, 7, 128, - 1, 0, 228, 128, 4, 0, 255, 128, 4, 0, 0, 4, 1, 0, 7, - 128, 1, 0, 228, 128, 4, 0, 255, 129, 2, 0, 170, 160, 5, 0, - 0, 3, 3, 0, 8, 128, 3, 0, 255, 128, 5, 0, 0, 128, 10, - 0, 0, 3, 4, 0, 8, 128, 3, 0, 255, 128, 2, 0, 0, 160, - 88, 0, 0, 4, 4, 0, 8, 128, 3, 0, 0, 129, 2, 0, 0, - 160, 4, 0, 255, 128, 5, 0, 0, 3, 6, 0, 7, 128, 5, 0, - 228, 128, 5, 0, 228, 128, 88, 0, 0, 4, 7, 0, 1, 128, 6, - 0, 0, 129, 2, 0, 85, 160, 4, 0, 255, 128, 6, 0, 0, 2, - 4, 0, 8, 128, 4, 0, 85, 128, 5, 0, 0, 3, 4, 0, 8, - 128, 4, 0, 255, 128, 5, 0, 85, 128, 10, 0, 0, 3, 5, 0, - 8, 128, 4, 0, 255, 128, 2, 0, 0, 160, 88, 0, 0, 4, 4, - 0, 8, 128, 3, 0, 85, 129, 2, 0, 0, 160, 5, 0, 255, 128, - 88, 0, 0, 4, 7, 0, 2, 128, 6, 0, 85, 129, 2, 0, 85, - 160, 4, 0, 255, 128, 6, 0, 0, 2, 4, 0, 8, 128, 4, 0, - 170, 128, 5, 0, 0, 3, 4, 0, 8, 128, 4, 0, 255, 128, 5, - 0, 170, 128, 10, 0, 0, 3, 5, 0, 8, 128, 4, 0, 255, 128, - 2, 0, 0, 160, 88, 0, 0, 4, 4, 0, 8, 128, 3, 0, 170, - 129, 2, 0, 0, 160, 5, 0, 255, 128, 88, 0, 0, 4, 7, 0, - 4, 128, 6, 0, 170, 129, 2, 0, 85, 160, 4, 0, 255, 128, 5, - 0, 0, 3, 3, 0, 7, 128, 0, 0, 85, 128, 2, 0, 228, 128, - 4, 0, 0, 4, 6, 0, 7, 128, 2, 0, 228, 128, 0, 0, 85, - 128, 5, 0, 228, 128, 4, 0, 0, 4, 6, 0, 7, 128, 3, 0, - 228, 128, 5, 0, 228, 129, 6, 0, 228, 128, 11, 0, 0, 3, 8, - 0, 7, 128, 3, 0, 228, 128, 5, 0, 228, 128, 88, 0, 0, 4, - 0, 0, 7, 128, 0, 0, 0, 129, 8, 0, 228, 128, 7, 0, 228, - 128, 2, 0, 0, 3, 7, 0, 15, 128, 0, 0, 255, 128, 1, 0, - 228, 160, 5, 0, 0, 3, 7, 0, 15, 128, 7, 0, 228, 128, 7, - 0, 228, 128, 10, 0, 0, 3, 8, 0, 7, 128, 5, 0, 228, 128, - 3, 0, 228, 128, 88, 0, 0, 4, 0, 0, 7, 128, 7, 0, 255, - 129, 8, 0, 228, 128, 0, 0, 228, 128, 4, 0, 0, 4, 8, 0, - 7, 128, 5, 0, 228, 128, 2, 0, 255, 161, 2, 0, 0, 161, 2, - 0, 0, 3, 8, 0, 7, 128, 8, 0, 228, 129, 2, 0, 0, 160, - 4, 0, 0, 4, 4, 0, 7, 128, 4, 0, 228, 128, 8, 0, 228, - 129, 2, 0, 0, 160, 2, 0, 0, 3, 8, 0, 7, 128, 5, 0, - 228, 128, 5, 0, 228, 128, 5, 0, 0, 3, 5, 0, 7, 128, 5, - 0, 228, 128, 3, 0, 228, 128, 5, 0, 0, 3, 8, 0, 7, 128, - 3, 0, 228, 128, 8, 0, 228, 128, 88, 0, 0, 4, 1, 0, 7, - 128, 1, 0, 228, 128, 8, 0, 228, 128, 4, 0, 228, 128, 88, 0, - 0, 4, 0, 0, 7, 128, 7, 0, 170, 129, 1, 0, 228, 128, 0, - 0, 228, 128, 88, 0, 0, 4, 0, 0, 7, 128, 7, 0, 85, 129, - 6, 0, 228, 128, 0, 0, 228, 128, 88, 0, 0, 4, 0, 0, 7, - 128, 7, 0, 0, 129, 5, 0, 228, 128, 0, 0, 228, 128, 18, 0, - 0, 4, 4, 0, 7, 128, 1, 0, 255, 128, 0, 0, 228, 128, 3, - 0, 228, 128, 5, 0, 0, 3, 4, 0, 8, 128, 1, 0, 255, 128, - 1, 0, 255, 128, 88, 0, 0, 4, 4, 0, 8, 128, 4, 0, 255, - 129, 2, 0, 0, 160, 2, 0, 85, 160, 5, 0, 0, 3, 0, 0, - 7, 128, 2, 0, 255, 128, 4, 0, 228, 128, 5, 0, 0, 3, 0, - 0, 8, 128, 2, 0, 255, 128, 2, 0, 255, 128, 88, 0, 0, 4, - 0, 0, 8, 128, 0, 0, 255, 129, 2, 0, 0, 160, 2, 0, 85, - 160, 2, 0, 0, 3, 0, 0, 8, 128, 4, 0, 255, 128, 0, 0, - 255, 128, 88, 0, 0, 4, 2, 0, 7, 128, 0, 0, 255, 129, 0, - 0, 228, 128, 2, 0, 228, 128, 1, 0, 0, 2, 0, 8, 15, 128, - 2, 0, 228, 128, 255, 255, 0, 0, 83, 72, 68, 82, 8, 6, 0, - 0, 64, 0, 0, 0, 130, 1, 0, 0, 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 90, 0, 0, 3, 0, - 96, 16, 0, 0, 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, - 1, 0, 0, 0, 88, 24, 0, 4, 0, 112, 16, 0, 0, 0, 0, - 0, 85, 85, 0, 0, 88, 24, 0, 4, 0, 112, 16, 0, 1, 0, - 0, 0, 85, 85, 0, 0, 98, 16, 0, 3, 50, 16, 16, 0, 1, - 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, 0, 0, 0, 0, 0, - 104, 0, 0, 2, 7, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, - 0, 0, 0, 0, 0, 70, 16, 16, 0, 1, 0, 0, 0, 70, 126, - 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 69, - 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 70, 16, 16, 0, - 1, 0, 0, 0, 70, 126, 16, 0, 1, 0, 0, 0, 0, 96, 16, - 0, 1, 0, 0, 0, 24, 0, 0, 7, 18, 0, 16, 0, 2, 0, - 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, - 0, 0, 0, 24, 0, 0, 7, 34, 0, 16, 0, 2, 0, 0, 0, - 58, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, - 0, 60, 0, 0, 7, 18, 0, 16, 0, 2, 0, 0, 0, 26, 0, - 16, 0, 2, 0, 0, 0, 10, 0, 16, 0, 2, 0, 0, 0, 31, - 0, 4, 3, 10, 0, 16, 0, 2, 0, 0, 0, 54, 0, 0, 5, - 242, 32, 16, 0, 0, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, - 0, 62, 0, 0, 1, 21, 0, 0, 1, 14, 0, 0, 7, 114, 0, - 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, 0, 14, 0, 0, 7, 114, 0, 16, 0, - 1, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 246, 15, 16, - 0, 1, 0, 0, 0, 32, 0, 0, 8, 18, 0, 16, 0, 2, 0, - 0, 0, 10, 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 64, 0, 0, 1, 0, 0, 0, 31, 0, 4, 3, 10, 0, 16, 0, - 2, 0, 0, 0, 56, 0, 0, 7, 114, 0, 16, 0, 2, 0, 0, - 0, 70, 2, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 1, 0, - 0, 0, 18, 0, 0, 1, 32, 0, 0, 8, 130, 0, 16, 0, 2, - 0, 0, 0, 10, 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 2, 0, 0, 0, 31, 0, 4, 3, 58, 0, 16, - 0, 2, 0, 0, 0, 0, 0, 0, 7, 114, 0, 16, 0, 3, 0, - 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 1, - 0, 0, 0, 50, 0, 0, 10, 114, 0, 16, 0, 2, 0, 0, 0, - 70, 2, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 70, 2, 16, - 0, 1, 0, 0, 0, 70, 2, 16, 0, 3, 0, 0, 0, 18, 0, - 0, 1, 32, 0, 0, 8, 130, 0, 16, 0, 2, 0, 0, 0, 10, - 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, - 3, 0, 0, 0, 31, 0, 4, 3, 58, 0, 16, 0, 2, 0, 0, - 0, 29, 0, 0, 10, 114, 0, 16, 0, 3, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, - 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 0, 0, 0, 7, - 114, 0, 16, 0, 4, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, - 0, 70, 2, 16, 0, 1, 0, 0, 0, 56, 0, 0, 7, 114, 0, - 16, 0, 4, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 70, - 2, 16, 0, 4, 0, 0, 0, 50, 0, 0, 15, 114, 0, 16, 0, - 5, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 2, 64, 0, - 0, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, - 0, 0, 2, 64, 0, 0, 0, 0, 128, 191, 0, 0, 128, 191, 0, - 0, 128, 191, 0, 0, 0, 0, 0, 0, 0, 11, 114, 0, 16, 0, - 6, 0, 0, 0, 70, 2, 16, 128, 65, 0, 0, 0, 0, 0, 0, - 0, 2, 64, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 0, 0, 0, 0, 0, 11, 114, 0, 16, 0, 5, - 0, 0, 0, 70, 2, 16, 128, 65, 0, 0, 0, 5, 0, 0, 0, - 2, 64, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, - 63, 0, 0, 0, 0, 50, 0, 0, 13, 114, 0, 16, 0, 5, 0, - 0, 0, 70, 2, 16, 128, 65, 0, 0, 0, 6, 0, 0, 0, 70, - 2, 16, 0, 5, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 55, 0, 0, - 9, 114, 0, 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 3, 0, - 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 70, 2, 16, 0, 5, - 0, 0, 0, 18, 0, 0, 1, 32, 0, 0, 8, 130, 0, 16, 0, - 2, 0, 0, 0, 10, 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 64, 0, 0, 4, 0, 0, 0, 31, 0, 4, 3, 58, 0, - 16, 0, 2, 0, 0, 0, 51, 0, 0, 7, 114, 0, 16, 0, 2, - 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, - 1, 0, 0, 0, 18, 0, 0, 1, 32, 0, 0, 8, 130, 0, 16, - 0, 2, 0, 0, 0, 10, 128, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 64, 0, 0, 5, 0, 0, 0, 31, 0, 4, 3, 58, - 0, 16, 0, 2, 0, 0, 0, 52, 0, 0, 7, 114, 0, 16, 0, - 2, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 70, 2, 16, - 0, 1, 0, 0, 0, 18, 0, 0, 1, 24, 0, 0, 10, 114, 0, - 16, 0, 3, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 2, - 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 24, 0, 0, 10, 114, 0, 16, 0, 4, 0, 0, - 0, 70, 2, 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, - 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 0, - 0, 0, 11, 114, 0, 16, 0, 5, 0, 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, - 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 14, 0, - 0, 7, 114, 0, 16, 0, 1, 0, 0, 0, 70, 2, 16, 0, 1, - 0, 0, 0, 70, 2, 16, 0, 5, 0, 0, 0, 51, 0, 0, 10, - 114, 0, 16, 0, 1, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, - 0, 2, 64, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 0, 0, 55, 0, 0, 12, 114, 0, 16, 0, 1, - 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 2, 64, 0, 0, - 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, - 0, 70, 2, 16, 0, 1, 0, 0, 0, 55, 0, 0, 12, 114, 0, - 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 3, 0, 0, 0, 2, - 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 21, 0, 0, - 1, 21, 0, 0, 1, 21, 0, 0, 1, 21, 0, 0, 1, 21, 0, - 0, 1, 0, 0, 0, 8, 18, 0, 16, 0, 1, 0, 0, 0, 58, - 0, 16, 128, 65, 0, 0, 0, 1, 0, 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 56, 0, 0, 7, 226, 0, 16, 0, 1, 0, 0, - 0, 246, 15, 16, 0, 1, 0, 0, 0, 6, 9, 16, 0, 2, 0, - 0, 0, 50, 0, 0, 9, 114, 0, 16, 0, 0, 0, 0, 0, 6, - 0, 16, 0, 1, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, - 150, 7, 16, 0, 1, 0, 0, 0, 56, 0, 0, 7, 114, 32, 16, - 0, 0, 0, 0, 0, 246, 15, 16, 0, 0, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, 54, 0, 0, 5, 130, 32, 16, 0, 0, - 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, 0, 0, 57, 0, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 25, 0, 0, 0, 5, 0, - 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, 69, 70, 100, 1, 0, 0, 1, 0, 0, - 0, 232, 0, 0, 0, 5, 0, 0, 0, 28, 0, 0, 0, 0, 4, - 255, 255, 0, 1, 0, 0, 48, 1, 0, 0, 188, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 209, - 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, - 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, - 0, 213, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, - 0, 0, 255, 255, 255, 255, 1, 0, 0, 0, 1, 0, 0, 0, 12, - 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 115, 83, 97, 109, 112, 108, 101, 114, 0, 115, - 66, 99, 107, 83, 97, 109, 112, 108, 101, 114, 0, 116, 101, 120, 0, - 98, 99, 107, 116, 101, 120, 0, 36, 71, 108, 111, 98, 97, 108, 115, - 0, 171, 171, 171, 220, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, - 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 1, - 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 32, - 1, 0, 0, 0, 0, 0, 0, 98, 108, 101, 110, 100, 111, 112, 0, - 0, 0, 19, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, 171, 171, 73, 83, 71, 78, 104, 0, 0, - 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, - 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, 92, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, - 0, 0, 12, 0, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, - 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, - 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 97, - 114, 103, 101, 116, 0, 171, 171, 247, 16, 0, 0, 0, 0, 0, 0, - 83, 97, 109, 112, 108, 101, 84, 101, 120, 116, 117, 114, 101, 70, 111, - 114, 83, 101, 112, 97, 114, 97, 98, 108, 101, 66, 108, 101, 110, 100, - 105, 110, 103, 95, 50, 0, 68, 4, 0, 0, 68, 88, 66, 67, 77, - 85, 167, 240, 56, 56, 155, 78, 125, 96, 49, 253, 103, 100, 22, 62, - 1, 0, 0, 0, 68, 4, 0, 0, 6, 0, 0, 0, 56, 0, 0, - 0, 248, 0, 0, 0, 244, 1, 0, 0, 112, 2, 0, 0, 160, 3, - 0, 0, 212, 3, 0, 0, 65, 111, 110, 57, 184, 0, 0, 0, 184, - 0, 0, 0, 0, 2, 254, 255, 132, 0, 0, 0, 52, 0, 0, 0, - 1, 0, 36, 0, 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 36, - 0, 1, 0, 48, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 2, 254, 255, 81, 0, 0, 5, 4, - 0, 15, 160, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 0, 0, 2, 5, 0, 0, 128, 0, 0, 15, - 144, 4, 0, 0, 4, 0, 0, 3, 224, 0, 0, 228, 144, 2, 0, - 238, 160, 2, 0, 228, 160, 4, 0, 0, 4, 0, 0, 12, 224, 0, - 0, 20, 144, 3, 0, 180, 160, 3, 0, 20, 160, 4, 0, 0, 4, - 0, 0, 3, 128, 0, 0, 228, 144, 1, 0, 238, 160, 1, 0, 228, - 160, 2, 0, 0, 3, 0, 0, 3, 192, 0, 0, 228, 128, 0, 0, - 228, 160, 1, 0, 0, 2, 0, 0, 12, 192, 4, 0, 68, 160, 255, - 255, 0, 0, 83, 72, 68, 82, 244, 0, 0, 0, 64, 0, 1, 0, - 61, 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 95, 0, 0, 3, 50, 16, 16, 0, 0, 0, - 0, 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 101, 0, 0, 3, 50, 32, 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 194, 32, 16, 0, 1, 0, 0, 0, 50, 0, 0, - 11, 50, 32, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, - 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 8, - 194, 32, 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 63, 50, 0, - 0, 11, 50, 32, 16, 0, 1, 0, 0, 0, 70, 16, 16, 0, 0, - 0, 0, 0, 230, 138, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 70, 128, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, - 11, 194, 32, 16, 0, 1, 0, 0, 0, 6, 20, 16, 0, 0, 0, - 0, 0, 166, 142, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, - 132, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, 69, 70, 40, 1, 0, 0, 1, 0, 0, - 0, 64, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 0, 4, - 254, 255, 0, 1, 0, 0, 246, 0, 0, 0, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 99, 98, 48, - 0, 60, 0, 0, 0, 4, 0, 0, 0, 88, 0, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, 0, 0, 0, - 0, 0, 0, 0, 212, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 222, 0, - 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, - 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 48, 0, 0, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, - 0, 81, 117, 97, 100, 68, 101, 115, 99, 0, 171, 171, 171, 1, 0, - 3, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, - 101, 120, 67, 111, 111, 114, 100, 115, 0, 77, 97, 115, 107, 84, 101, - 120, 67, 111, 111, 114, 100, 115, 0, 84, 101, 120, 116, 67, 111, 108, - 111, 114, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, - 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, - 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, - 48, 46, 49, 54, 51, 56, 52, 0, 73, 83, 71, 78, 44, 0, 0, - 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 7, - 3, 0, 0, 80, 79, 83, 73, 84, 73, 79, 78, 0, 171, 171, 171, - 79, 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, - 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, - 3, 12, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, 3, 0, 0, 83, 86, - 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, 171, 111, 30, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 88, 17, 0, - 0, 68, 88, 66, 67, 62, 116, 36, 238, 73, 63, 158, 95, 222, 192, - 91, 113, 112, 55, 55, 145, 1, 0, 0, 0, 88, 17, 0, 0, 6, - 0, 0, 0, 56, 0, 0, 0, 88, 6, 0, 0, 204, 14, 0, 0, - 72, 15, 0, 0, 180, 16, 0, 0, 36, 17, 0, 0, 65, 111, 110, - 57, 24, 6, 0, 0, 24, 6, 0, 0, 0, 2, 255, 255, 224, 5, - 0, 0, 56, 0, 0, 0, 1, 0, 44, 0, 0, 0, 56, 0, 0, - 0, 56, 0, 2, 0, 36, 0, 0, 0, 56, 0, 0, 0, 0, 0, - 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, - 0, 1, 2, 255, 255, 81, 0, 0, 5, 1, 0, 15, 160, 0, 0, - 224, 192, 0, 0, 0, 193, 0, 0, 16, 193, 0, 0, 32, 193, 81, - 0, 0, 5, 2, 0, 15, 160, 0, 0, 128, 63, 0, 0, 0, 0, - 0, 0, 128, 191, 0, 0, 128, 62, 81, 0, 0, 5, 3, 0, 15, - 160, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 128, 191, 0, 0, - 128, 64, 81, 0, 0, 5, 4, 0, 15, 160, 0, 0, 128, 65, 0, - 0, 64, 193, 0, 0, 0, 64, 0, 0, 128, 63, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, 15, 176, 31, 0, 0, 2, 0, 0, 0, - 144, 0, 8, 15, 160, 31, 0, 0, 2, 0, 0, 0, 144, 1, 8, - 15, 160, 1, 0, 0, 2, 0, 0, 8, 128, 0, 0, 0, 160, 2, - 0, 0, 3, 0, 0, 15, 128, 0, 0, 255, 128, 1, 0, 228, 160, - 5, 0, 0, 3, 0, 0, 15, 128, 0, 0, 228, 128, 0, 0, 228, - 128, 66, 0, 0, 3, 1, 0, 15, 128, 0, 0, 228, 176, 0, 8, - 228, 160, 66, 0, 0, 3, 2, 0, 15, 128, 0, 0, 228, 176, 1, - 8, 228, 160, 6, 0, 0, 2, 3, 0, 8, 128, 2, 0, 255, 128, - 4, 0, 0, 4, 3, 0, 3, 128, 2, 0, 233, 128, 3, 0, 255, - 129, 2, 0, 255, 160, 5, 0, 0, 3, 4, 0, 7, 128, 2, 0, - 228, 128, 3, 0, 255, 128, 4, 0, 0, 4, 5, 0, 7, 128, 4, - 0, 228, 128, 4, 0, 0, 160, 4, 0, 85, 160, 4, 0, 0, 4, - 5, 0, 7, 128, 5, 0, 228, 128, 4, 0, 228, 128, 3, 0, 255, - 160, 5, 0, 0, 3, 5, 0, 7, 128, 4, 0, 228, 128, 5, 0, - 228, 128, 7, 0, 0, 2, 4, 0, 8, 128, 4, 0, 85, 128, 6, - 0, 0, 2, 4, 0, 8, 128, 4, 0, 255, 128, 88, 0, 0, 4, - 4, 0, 8, 128, 3, 0, 0, 128, 5, 0, 85, 128, 4, 0, 255, - 128, 4, 0, 0, 4, 4, 0, 8, 128, 2, 0, 85, 128, 3, 0, - 255, 129, 4, 0, 255, 128, 6, 0, 0, 2, 3, 0, 1, 128, 1, - 0, 255, 128, 5, 0, 0, 3, 6, 0, 7, 128, 1, 0, 228, 128, - 3, 0, 0, 128, 4, 0, 0, 4, 7, 0, 7, 128, 6, 0, 228, - 128, 3, 0, 85, 160, 3, 0, 170, 160, 4, 0, 0, 4, 4, 0, - 8, 128, 7, 0, 85, 128, 4, 0, 255, 128, 4, 0, 85, 128, 4, - 0, 0, 4, 8, 0, 7, 128, 1, 0, 228, 128, 3, 0, 0, 129, - 3, 0, 0, 160, 4, 0, 0, 4, 9, 0, 15, 128, 2, 0, 36, - 128, 3, 0, 255, 129, 2, 0, 192, 160, 4, 0, 0, 4, 10, 0, - 7, 128, 6, 0, 228, 128, 4, 0, 170, 161, 4, 0, 255, 160, 5, - 0, 0, 3, 10, 0, 7, 128, 4, 0, 228, 128, 10, 0, 228, 128, - 4, 0, 0, 4, 10, 0, 7, 128, 10, 0, 228, 128, 9, 0, 228, - 129, 4, 0, 228, 128, 88, 0, 0, 4, 11, 0, 2, 128, 8, 0, - 85, 128, 10, 0, 85, 128, 4, 0, 255, 128, 7, 0, 0, 2, 4, - 0, 8, 128, 4, 0, 170, 128, 6, 0, 0, 2, 4, 0, 8, 128, - 4, 0, 255, 128, 88, 0, 0, 4, 4, 0, 8, 128, 3, 0, 85, - 128, 5, 0, 170, 128, 4, 0, 255, 128, 4, 0, 0, 4, 4, 0, - 8, 128, 2, 0, 170, 128, 3, 0, 255, 129, 4, 0, 255, 128, 4, - 0, 0, 4, 4, 0, 8, 128, 7, 0, 170, 128, 4, 0, 255, 128, - 4, 0, 170, 128, 88, 0, 0, 4, 11, 0, 4, 128, 8, 0, 170, - 128, 10, 0, 170, 128, 4, 0, 255, 128, 7, 0, 0, 2, 4, 0, - 8, 128, 4, 0, 0, 128, 6, 0, 0, 2, 4, 0, 8, 128, 4, - 0, 255, 128, 88, 0, 0, 4, 4, 0, 8, 128, 9, 0, 255, 128, - 5, 0, 0, 128, 4, 0, 255, 128, 4, 0, 0, 4, 4, 0, 8, - 128, 2, 0, 0, 128, 3, 0, 255, 129, 4, 0, 255, 128, 4, 0, - 0, 4, 2, 0, 7, 128, 2, 0, 228, 128, 3, 0, 255, 128, 2, - 0, 170, 160, 5, 0, 0, 3, 2, 0, 7, 128, 2, 0, 228, 128, - 2, 0, 228, 128, 4, 0, 0, 4, 4, 0, 8, 128, 7, 0, 0, - 128, 4, 0, 255, 128, 4, 0, 0, 128, 2, 0, 0, 3, 3, 0, - 14, 128, 7, 0, 144, 129, 2, 0, 0, 160, 4, 0, 0, 4, 3, - 0, 14, 128, 9, 0, 144, 128, 3, 0, 228, 129, 2, 0, 0, 160, - 88, 0, 0, 4, 11, 0, 1, 128, 8, 0, 0, 128, 10, 0, 0, - 128, 4, 0, 255, 128, 4, 0, 0, 4, 5, 0, 7, 128, 1, 0, - 228, 128, 3, 0, 0, 128, 4, 0, 228, 129, 4, 0, 0, 4, 7, - 0, 7, 128, 1, 0, 228, 128, 3, 0, 0, 128, 4, 0, 228, 128, - 35, 0, 0, 2, 5, 0, 7, 128, 5, 0, 228, 128, 5, 0, 0, - 3, 10, 0, 7, 128, 4, 0, 228, 128, 6, 0, 228, 128, 4, 0, - 0, 4, 7, 0, 7, 128, 10, 0, 228, 128, 3, 0, 85, 161, 7, - 0, 228, 128, 88, 0, 0, 4, 5, 0, 7, 128, 0, 0, 255, 129, - 5, 0, 228, 128, 7, 0, 228, 128, 88, 0, 0, 4, 5, 0, 7, - 128, 0, 0, 170, 129, 11, 0, 228, 128, 5, 0, 228, 128, 2, 0, - 0, 3, 7, 0, 7, 128, 6, 0, 228, 128, 6, 0, 228, 128, 5, - 0, 0, 3, 4, 0, 7, 128, 4, 0, 228, 128, 7, 0, 228, 128, - 88, 0, 0, 4, 3, 0, 7, 128, 8, 0, 228, 128, 4, 0, 228, - 128, 3, 0, 249, 128, 88, 0, 0, 4, 0, 0, 14, 128, 0, 0, - 85, 129, 3, 0, 144, 128, 5, 0, 144, 128, 6, 0, 0, 2, 6, - 0, 8, 128, 6, 0, 0, 128, 4, 0, 0, 4, 6, 0, 8, 128, - 9, 0, 0, 128, 6, 0, 255, 129, 2, 0, 0, 160, 11, 0, 0, - 3, 3, 0, 1, 128, 6, 0, 255, 128, 2, 0, 85, 160, 5, 0, - 0, 3, 3, 0, 14, 128, 6, 0, 144, 128, 6, 0, 144, 128, 88, - 0, 0, 4, 6, 0, 8, 128, 3, 0, 85, 129, 2, 0, 85, 160, - 3, 0, 0, 128, 88, 0, 0, 4, 4, 0, 1, 128, 2, 0, 0, - 129, 2, 0, 0, 160, 6, 0, 255, 128, 6, 0, 0, 2, 4, 0, - 8, 128, 6, 0, 85, 128, 4, 0, 0, 4, 4, 0, 8, 128, 9, - 0, 85, 128, 4, 0, 255, 129, 2, 0, 0, 160, 11, 0, 0, 3, - 6, 0, 8, 128, 4, 0, 255, 128, 2, 0, 85, 160, 88, 0, 0, - 4, 4, 0, 8, 128, 3, 0, 170, 129, 2, 0, 85, 160, 6, 0, - 255, 128, 88, 0, 0, 4, 4, 0, 2, 128, 2, 0, 85, 129, 2, - 0, 0, 160, 4, 0, 255, 128, 6, 0, 0, 2, 4, 0, 8, 128, - 6, 0, 170, 128, 4, 0, 0, 4, 4, 0, 8, 128, 9, 0, 170, - 128, 4, 0, 255, 129, 2, 0, 0, 160, 11, 0, 0, 3, 6, 0, - 8, 128, 4, 0, 255, 128, 2, 0, 85, 160, 88, 0, 0, 4, 4, - 0, 8, 128, 3, 0, 255, 129, 2, 0, 85, 160, 6, 0, 255, 128, - 88, 0, 0, 4, 4, 0, 4, 128, 2, 0, 170, 129, 2, 0, 0, - 160, 4, 0, 255, 128, 88, 0, 0, 4, 0, 0, 7, 128, 0, 0, - 0, 129, 4, 0, 228, 128, 0, 0, 249, 128, 18, 0, 0, 4, 3, - 0, 7, 128, 2, 0, 255, 128, 0, 0, 228, 128, 6, 0, 228, 128, - 5, 0, 0, 3, 3, 0, 8, 128, 2, 0, 255, 128, 2, 0, 255, - 128, 88, 0, 0, 4, 3, 0, 8, 128, 3, 0, 255, 129, 2, 0, - 0, 160, 2, 0, 85, 160, 5, 0, 0, 3, 0, 0, 7, 128, 1, - 0, 255, 128, 3, 0, 228, 128, 5, 0, 0, 3, 0, 0, 8, 128, - 1, 0, 255, 128, 1, 0, 255, 128, 88, 0, 0, 4, 0, 0, 8, - 128, 0, 0, 255, 129, 2, 0, 0, 160, 2, 0, 85, 160, 2, 0, - 0, 3, 0, 0, 8, 128, 3, 0, 255, 128, 0, 0, 255, 128, 88, - 0, 0, 4, 1, 0, 7, 128, 0, 0, 255, 129, 0, 0, 228, 128, - 1, 0, 228, 128, 1, 0, 0, 2, 0, 8, 15, 128, 1, 0, 228, - 128, 255, 255, 0, 0, 83, 72, 68, 82, 108, 8, 0, 0, 64, 0, - 0, 0, 27, 2, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, - 0, 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 1, 0, 0, - 0, 88, 24, 0, 4, 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, - 0, 0, 88, 24, 0, 4, 0, 112, 16, 0, 1, 0, 0, 0, 85, - 85, 0, 0, 98, 16, 0, 3, 50, 16, 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 242, 32, 16, 0, 0, 0, 0, 0, 104, 0, 0, - 2, 7, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 0, 0, - 0, 0, 70, 16, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 0, - 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 69, 0, 0, 9, - 242, 0, 16, 0, 1, 0, 0, 0, 70, 16, 16, 0, 1, 0, 0, - 0, 70, 126, 16, 0, 1, 0, 0, 0, 0, 96, 16, 0, 1, 0, - 0, 0, 24, 0, 0, 7, 18, 0, 16, 0, 2, 0, 0, 0, 58, - 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, - 24, 0, 0, 7, 34, 0, 16, 0, 2, 0, 0, 0, 58, 0, 16, - 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 60, 0, - 0, 7, 18, 0, 16, 0, 2, 0, 0, 0, 26, 0, 16, 0, 2, - 0, 0, 0, 10, 0, 16, 0, 2, 0, 0, 0, 31, 0, 4, 3, - 10, 0, 16, 0, 2, 0, 0, 0, 54, 0, 0, 5, 242, 32, 16, - 0, 0, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 62, 0, - 0, 1, 21, 0, 0, 1, 14, 0, 0, 7, 114, 0, 16, 0, 0, - 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 246, 15, 16, 0, - 0, 0, 0, 0, 14, 0, 0, 7, 114, 0, 16, 0, 1, 0, 0, - 0, 70, 2, 16, 0, 1, 0, 0, 0, 246, 15, 16, 0, 1, 0, - 0, 0, 32, 0, 0, 8, 18, 0, 16, 0, 2, 0, 0, 0, 10, - 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, - 7, 0, 0, 0, 31, 0, 4, 3, 10, 0, 16, 0, 2, 0, 0, - 0, 24, 0, 0, 10, 114, 0, 16, 0, 2, 0, 0, 0, 70, 2, - 16, 0, 1, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 63, 0, - 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 24, 0, 0, 10, - 114, 0, 16, 0, 3, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, - 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 114, 0, 16, 0, 4, - 0, 0, 0, 70, 2, 16, 128, 65, 0, 0, 0, 1, 0, 0, 0, - 2, 64, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, - 63, 0, 0, 0, 0, 14, 0, 0, 7, 114, 0, 16, 0, 4, 0, - 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 70, 2, 16, 0, 0, - 0, 0, 0, 51, 0, 0, 10, 114, 0, 16, 0, 4, 0, 0, 0, - 70, 2, 16, 0, 4, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, - 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, - 0, 11, 114, 0, 16, 0, 4, 0, 0, 0, 70, 2, 16, 128, 65, - 0, 0, 0, 4, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 55, 0, 0, - 12, 114, 0, 16, 0, 3, 0, 0, 0, 70, 2, 16, 0, 3, 0, - 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, - 55, 0, 0, 12, 114, 0, 16, 0, 2, 0, 0, 0, 70, 2, 16, - 0, 2, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 70, 2, 16, 0, 3, - 0, 0, 0, 18, 0, 0, 1, 32, 0, 0, 8, 130, 0, 16, 0, - 2, 0, 0, 0, 10, 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 64, 0, 0, 8, 0, 0, 0, 31, 0, 4, 3, 58, 0, - 16, 0, 2, 0, 0, 0, 29, 0, 0, 10, 114, 0, 16, 0, 3, - 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 114, 0, 16, 0, 4, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 56, - 0, 0, 7, 114, 0, 16, 0, 4, 0, 0, 0, 70, 2, 16, 0, - 1, 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 50, 0, 0, - 15, 114, 0, 16, 0, 5, 0, 0, 0, 70, 2, 16, 0, 0, 0, - 0, 0, 2, 64, 0, 0, 0, 0, 0, 64, 0, 0, 0, 64, 0, - 0, 0, 64, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 191, - 0, 0, 128, 191, 0, 0, 128, 191, 0, 0, 0, 0, 0, 0, 0, - 11, 114, 0, 16, 0, 6, 0, 0, 0, 70, 2, 16, 128, 65, 0, - 0, 0, 1, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 63, 0, - 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 11, - 114, 0, 16, 0, 5, 0, 0, 0, 70, 2, 16, 128, 65, 0, 0, - 0, 5, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 50, 0, 0, 13, 114, - 0, 16, 0, 5, 0, 0, 0, 70, 2, 16, 128, 65, 0, 0, 0, - 6, 0, 0, 0, 70, 2, 16, 0, 5, 0, 0, 0, 2, 64, 0, - 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, - 0, 0, 55, 0, 0, 9, 114, 0, 16, 0, 2, 0, 0, 0, 70, - 2, 16, 0, 3, 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, - 70, 2, 16, 0, 5, 0, 0, 0, 18, 0, 0, 1, 32, 0, 0, - 8, 130, 0, 16, 0, 2, 0, 0, 0, 10, 128, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 9, 0, 0, 0, 31, - 0, 4, 3, 58, 0, 16, 0, 2, 0, 0, 0, 29, 0, 0, 10, - 114, 0, 16, 0, 3, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, - 62, 0, 0, 128, 62, 0, 0, 128, 62, 0, 0, 0, 0, 70, 2, - 16, 0, 1, 0, 0, 0, 50, 0, 0, 15, 114, 0, 16, 0, 4, - 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 2, 64, 0, 0, - 0, 0, 128, 65, 0, 0, 128, 65, 0, 0, 128, 65, 0, 0, 0, - 0, 2, 64, 0, 0, 0, 0, 64, 193, 0, 0, 64, 193, 0, 0, - 64, 193, 0, 0, 0, 0, 50, 0, 0, 12, 114, 0, 16, 0, 4, - 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 70, 2, 16, 0, - 1, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 64, 0, 0, 128, - 64, 0, 0, 128, 64, 0, 0, 0, 0, 56, 0, 0, 7, 114, 0, - 16, 0, 4, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 70, - 2, 16, 0, 4, 0, 0, 0, 75, 0, 0, 5, 114, 0, 16, 0, - 5, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 55, 0, 0, - 9, 114, 0, 16, 0, 3, 0, 0, 0, 70, 2, 16, 0, 3, 0, - 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 70, 2, 16, 0, 5, - 0, 0, 0, 29, 0, 0, 10, 114, 0, 16, 0, 4, 0, 0, 0, - 2, 64, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, - 63, 0, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 50, 0, - 0, 16, 114, 0, 16, 0, 5, 0, 0, 0, 70, 2, 16, 128, 65, - 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 64, - 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 0, 2, 64, 0, - 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, - 0, 0, 56, 0, 0, 7, 114, 0, 16, 0, 5, 0, 0, 0, 70, - 2, 16, 0, 1, 0, 0, 0, 70, 2, 16, 0, 5, 0, 0, 0, - 0, 0, 0, 11, 114, 0, 16, 0, 6, 0, 0, 0, 70, 2, 16, - 128, 65, 0, 0, 0, 1, 0, 0, 0, 2, 64, 0, 0, 0, 0, - 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 50, - 0, 0, 10, 114, 0, 16, 0, 5, 0, 0, 0, 70, 2, 16, 128, - 65, 0, 0, 0, 5, 0, 0, 0, 70, 2, 16, 0, 6, 0, 0, - 0, 70, 2, 16, 0, 1, 0, 0, 0, 50, 0, 0, 15, 114, 0, - 16, 0, 6, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 2, - 64, 0, 0, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 64, - 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 191, 0, 0, 128, - 191, 0, 0, 128, 191, 0, 0, 0, 0, 0, 0, 0, 8, 114, 0, - 16, 0, 3, 0, 0, 0, 70, 2, 16, 128, 65, 0, 0, 0, 1, - 0, 0, 0, 70, 2, 16, 0, 3, 0, 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 3, 0, 0, 0, 70, 2, 16, 0, 6, 0, 0, - 0, 70, 2, 16, 0, 3, 0, 0, 0, 70, 2, 16, 0, 1, 0, - 0, 0, 55, 0, 0, 9, 114, 0, 16, 0, 2, 0, 0, 0, 70, - 2, 16, 0, 4, 0, 0, 0, 70, 2, 16, 0, 5, 0, 0, 0, - 70, 2, 16, 0, 3, 0, 0, 0, 18, 0, 0, 1, 32, 0, 0, - 8, 130, 0, 16, 0, 2, 0, 0, 0, 10, 128, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 10, 0, 0, 0, 0, - 0, 0, 8, 114, 0, 16, 0, 3, 0, 0, 0, 70, 2, 16, 0, - 0, 0, 0, 0, 70, 2, 16, 128, 65, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 7, 114, 0, 16, 0, 4, 0, 0, 0, 70, 2, - 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 56, - 0, 0, 7, 114, 0, 16, 0, 1, 0, 0, 0, 70, 2, 16, 0, - 0, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 50, 0, 0, - 13, 114, 0, 16, 0, 1, 0, 0, 0, 70, 2, 16, 128, 65, 0, - 0, 0, 1, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 64, 0, - 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 0, 70, 2, 16, 0, - 4, 0, 0, 0, 55, 0, 0, 10, 114, 0, 16, 0, 2, 0, 0, - 0, 246, 15, 16, 0, 2, 0, 0, 0, 70, 2, 16, 128, 129, 0, - 0, 0, 3, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 21, - 0, 0, 1, 21, 0, 0, 1, 21, 0, 0, 1, 0, 0, 0, 8, - 18, 0, 16, 0, 1, 0, 0, 0, 58, 0, 16, 128, 65, 0, 0, - 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 56, 0, - 0, 7, 226, 0, 16, 0, 1, 0, 0, 0, 246, 15, 16, 0, 1, - 0, 0, 0, 6, 9, 16, 0, 2, 0, 0, 0, 50, 0, 0, 9, - 114, 0, 16, 0, 0, 0, 0, 0, 6, 0, 16, 0, 1, 0, 0, - 0, 70, 2, 16, 0, 0, 0, 0, 0, 150, 7, 16, 0, 1, 0, - 0, 0, 56, 0, 0, 7, 114, 32, 16, 0, 0, 0, 0, 0, 246, - 15, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 130, 32, 16, 0, 0, 0, 0, 0, 58, 0, 16, - 0, 0, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, - 0, 0, 66, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 38, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, - 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, - 69, 70, 100, 1, 0, 0, 1, 0, 0, 0, 232, 0, 0, 0, 5, - 0, 0, 0, 28, 0, 0, 0, 0, 4, 255, 255, 0, 1, 0, 0, - 48, 1, 0, 0, 188, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 2, 0, 0, - 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 213, 0, 0, 0, 2, - 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, - 1, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 220, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 115, - 83, 97, 109, 112, 108, 101, 114, 0, 115, 66, 99, 107, 83, 97, 109, - 112, 108, 101, 114, 0, 116, 101, 120, 0, 98, 99, 107, 116, 101, 120, - 0, 36, 71, 108, 111, 98, 97, 108, 115, 0, 171, 171, 171, 220, 0, - 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 2, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, - 0, 98, 108, 101, 110, 100, 111, 112, 0, 0, 0, 19, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, - 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, - 171, 171, 73, 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, 8, - 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, - 0, 0, 3, 3, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, - 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, - 67, 79, 79, 82, 68, 0, 171, 171, 171, 79, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 83, 86, 95, 84, 97, 114, 103, 101, 116, 0, 171, - 171, 203, 34, 0, 0, 0, 0, 0, 0, 83, 97, 109, 112, 108, 101, - 84, 101, 120, 116, 117, 114, 101, 70, 111, 114, 78, 111, 110, 83, 101, - 112, 97, 114, 97, 98, 108, 101, 66, 108, 101, 110, 100, 105, 110, 103, - 0, 68, 4, 0, 0, 68, 88, 66, 67, 77, 85, 167, 240, 56, 56, - 155, 78, 125, 96, 49, 253, 103, 100, 22, 62, 1, 0, 0, 0, 68, - 4, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 248, 0, 0, 0, - 244, 1, 0, 0, 112, 2, 0, 0, 160, 3, 0, 0, 212, 3, 0, - 0, 65, 111, 110, 57, 184, 0, 0, 0, 184, 0, 0, 0, 0, 2, - 254, 255, 132, 0, 0, 0, 52, 0, 0, 0, 1, 0, 36, 0, 0, - 0, 48, 0, 0, 0, 48, 0, 0, 0, 36, 0, 1, 0, 48, 0, - 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 254, 255, 81, 0, 0, 5, 4, 0, 15, 160, 0, 0, - 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 31, - 0, 0, 2, 5, 0, 0, 128, 0, 0, 15, 144, 4, 0, 0, 4, - 0, 0, 3, 224, 0, 0, 228, 144, 2, 0, 238, 160, 2, 0, 228, - 160, 4, 0, 0, 4, 0, 0, 12, 224, 0, 0, 20, 144, 3, 0, - 180, 160, 3, 0, 20, 160, 4, 0, 0, 4, 0, 0, 3, 128, 0, - 0, 228, 144, 1, 0, 238, 160, 1, 0, 228, 160, 2, 0, 0, 3, - 0, 0, 3, 192, 0, 0, 228, 128, 0, 0, 228, 160, 1, 0, 0, - 2, 0, 0, 12, 192, 4, 0, 68, 160, 255, 255, 0, 0, 83, 72, - 68, 82, 244, 0, 0, 0, 64, 0, 1, 0, 61, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 95, 0, 0, 3, 50, 16, 16, 0, 0, 0, 0, 0, 103, 0, 0, - 4, 242, 32, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 101, 0, - 0, 3, 50, 32, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 194, - 32, 16, 0, 1, 0, 0, 0, 50, 0, 0, 11, 50, 32, 16, 0, - 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 0, 0, 8, 194, 32, 16, 0, 0, - 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 128, 63, 50, 0, 0, 11, 50, 32, 16, - 0, 1, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, - 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 70, 128, 32, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 11, 194, 32, 16, 0, - 1, 0, 0, 0, 6, 20, 16, 0, 0, 0, 0, 0, 166, 142, 32, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 132, 32, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, - 68, 69, 70, 40, 1, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, - 1, 0, 0, 0, 28, 0, 0, 0, 0, 4, 254, 255, 0, 1, 0, - 0, 246, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 99, 98, 48, 0, 60, 0, 0, 0, - 4, 0, 0, 0, 88, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 212, - 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, - 196, 0, 0, 0, 0, 0, 0, 0, 222, 0, 0, 0, 32, 0, 0, - 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, 0, - 0, 0, 236, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 81, 117, 97, 100, - 68, 101, 115, 99, 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 101, 120, 67, 111, 111, - 114, 100, 115, 0, 77, 97, 115, 107, 84, 101, 120, 67, 111, 111, 114, - 100, 115, 0, 84, 101, 120, 116, 67, 111, 108, 111, 114, 0, 77, 105, - 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, - 56, 52, 0, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 7, 3, 0, 0, 80, 79, - 83, 73, 84, 73, 79, 78, 0, 171, 171, 171, 79, 83, 71, 78, 104, - 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 12, 0, 0, 92, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 12, 3, 0, 0, 83, 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, - 171, 171, 84, 52, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 216, 37, 0, 0, 68, 88, 66, 67, - 205, 124, 125, 227, 208, 119, 203, 250, 120, 38, 135, 194, 158, 189, 85, - 176, 1, 0, 0, 0, 216, 37, 0, 0, 6, 0, 0, 0, 56, 0, - 0, 0, 72, 13, 0, 0, 76, 35, 0, 0, 200, 35, 0, 0, 52, - 37, 0, 0, 164, 37, 0, 0, 65, 111, 110, 57, 8, 13, 0, 0, - 8, 13, 0, 0, 0, 2, 255, 255, 208, 12, 0, 0, 56, 0, 0, - 0, 1, 0, 44, 0, 0, 0, 56, 0, 0, 0, 56, 0, 2, 0, - 36, 0, 0, 0, 56, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 2, 255, 255, - 81, 0, 0, 5, 1, 0, 15, 160, 0, 0, 64, 193, 0, 0, 80, - 193, 0, 0, 96, 193, 0, 0, 0, 0, 81, 0, 0, 5, 2, 0, - 15, 160, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 81, 0, 0, 5, 3, 0, 15, 160, 154, 153, 153, 62, - 61, 10, 23, 63, 174, 71, 225, 61, 0, 0, 0, 0, 31, 0, 0, - 2, 0, 0, 0, 128, 0, 0, 15, 176, 31, 0, 0, 2, 0, 0, - 0, 144, 0, 8, 15, 160, 31, 0, 0, 2, 0, 0, 0, 144, 1, - 8, 15, 160, 1, 0, 0, 2, 0, 0, 2, 128, 2, 0, 85, 160, - 1, 0, 0, 2, 1, 0, 2, 128, 2, 0, 85, 160, 1, 0, 0, - 2, 2, 0, 4, 128, 2, 0, 85, 160, 66, 0, 0, 3, 3, 0, - 15, 128, 0, 0, 228, 176, 1, 8, 228, 160, 66, 0, 0, 3, 4, - 0, 15, 128, 0, 0, 228, 176, 0, 8, 228, 160, 6, 0, 0, 2, - 0, 0, 8, 128, 4, 0, 255, 128, 5, 0, 0, 3, 5, 0, 7, - 128, 0, 0, 255, 128, 4, 0, 228, 128, 4, 0, 0, 4, 6, 0, - 3, 128, 4, 0, 225, 128, 0, 0, 255, 128, 5, 0, 230, 129, 88, - 0, 0, 4, 7, 0, 3, 128, 6, 0, 0, 128, 5, 0, 233, 128, - 5, 0, 230, 128, 11, 0, 0, 3, 1, 0, 8, 128, 5, 0, 0, - 128, 7, 0, 0, 128, 10, 0, 0, 3, 2, 0, 8, 128, 7, 0, - 85, 128, 5, 0, 0, 128, 2, 0, 0, 3, 7, 0, 8, 128, 1, - 0, 255, 128, 2, 0, 255, 129, 6, 0, 0, 2, 1, 0, 8, 128, - 3, 0, 255, 128, 5, 0, 0, 3, 8, 0, 7, 128, 1, 0, 255, - 128, 3, 0, 228, 128, 4, 0, 0, 4, 9, 0, 3, 128, 3, 0, - 0, 128, 1, 0, 255, 128, 8, 0, 230, 129, 6, 0, 0, 2, 2, - 0, 8, 128, 9, 0, 85, 128, 5, 0, 0, 3, 2, 0, 8, 128, - 2, 0, 255, 128, 7, 0, 255, 128, 4, 0, 0, 4, 10, 0, 15, - 128, 3, 0, 150, 128, 1, 0, 255, 128, 8, 0, 96, 129, 5, 0, - 0, 3, 7, 0, 2, 128, 2, 0, 255, 128, 10, 0, 255, 128, 1, - 0, 0, 2, 9, 0, 12, 128, 10, 0, 228, 128, 88, 0, 0, 4, - 1, 0, 5, 128, 9, 0, 85, 129, 9, 0, 245, 128, 7, 0, 215, - 128, 6, 0, 0, 2, 2, 0, 8, 128, 9, 0, 0, 128, 5, 0, - 0, 3, 2, 0, 8, 128, 2, 0, 255, 128, 7, 0, 255, 128, 5, - 0, 0, 3, 7, 0, 1, 128, 2, 0, 255, 128, 9, 0, 170, 128, - 88, 0, 0, 4, 2, 0, 3, 128, 9, 0, 0, 129, 9, 0, 232, - 128, 7, 0, 227, 128, 88, 0, 0, 4, 1, 0, 7, 128, 9, 0, - 255, 128, 1, 0, 228, 128, 2, 0, 228, 128, 6, 0, 0, 2, 5, - 0, 8, 128, 9, 0, 255, 128, 5, 0, 0, 3, 5, 0, 8, 128, - 5, 0, 255, 128, 7, 0, 255, 128, 5, 0, 0, 3, 7, 0, 4, - 128, 5, 0, 255, 128, 9, 0, 85, 128, 88, 0, 0, 4, 0, 0, - 5, 128, 10, 0, 255, 129, 9, 0, 245, 128, 7, 0, 246, 128, 88, - 0, 0, 4, 0, 0, 7, 128, 10, 0, 0, 128, 0, 0, 228, 128, - 1, 0, 228, 128, 1, 0, 0, 2, 1, 0, 1, 128, 2, 0, 85, - 160, 1, 0, 0, 2, 2, 0, 1, 128, 2, 0, 85, 160, 1, 0, - 0, 2, 11, 0, 4, 128, 2, 0, 85, 160, 6, 0, 0, 2, 2, - 0, 8, 128, 9, 0, 170, 128, 5, 0, 0, 3, 2, 0, 8, 128, - 2, 0, 255, 128, 7, 0, 255, 128, 5, 0, 0, 3, 7, 0, 1, - 128, 2, 0, 255, 128, 9, 0, 0, 128, 88, 0, 0, 4, 11, 0, - 3, 128, 10, 0, 170, 129, 9, 0, 232, 128, 7, 0, 236, 128, 6, - 0, 0, 2, 2, 0, 8, 128, 10, 0, 85, 128, 5, 0, 0, 3, - 2, 0, 8, 128, 2, 0, 255, 128, 7, 0, 255, 128, 5, 0, 0, - 3, 7, 0, 2, 128, 2, 0, 255, 128, 10, 0, 0, 128, 88, 0, - 0, 4, 2, 0, 6, 128, 10, 0, 85, 129, 10, 0, 196, 128, 7, - 0, 220, 128, 88, 0, 0, 4, 2, 0, 7, 128, 10, 0, 0, 128, - 2, 0, 228, 128, 11, 0, 228, 128, 6, 0, 0, 2, 2, 0, 8, - 128, 10, 0, 0, 128, 5, 0, 0, 3, 2, 0, 8, 128, 2, 0, - 255, 128, 7, 0, 255, 128, 5, 0, 0, 3, 7, 0, 4, 128, 2, - 0, 255, 128, 10, 0, 85, 128, 88, 0, 0, 4, 1, 0, 6, 128, - 10, 0, 0, 129, 10, 0, 196, 128, 7, 0, 248, 128, 88, 0, 0, - 4, 1, 0, 7, 128, 9, 0, 255, 128, 1, 0, 228, 128, 2, 0, - 228, 128, 88, 0, 0, 4, 0, 0, 7, 128, 10, 0, 85, 128, 1, - 0, 228, 128, 0, 0, 228, 128, 88, 0, 0, 4, 1, 0, 3, 128, - 9, 0, 170, 128, 8, 0, 233, 128, 8, 0, 230, 128, 8, 0, 0, - 3, 5, 0, 8, 128, 0, 0, 228, 128, 3, 0, 228, 160, 8, 0, - 0, 3, 1, 0, 4, 128, 8, 0, 228, 128, 3, 0, 228, 160, 2, - 0, 0, 3, 5, 0, 8, 128, 5, 0, 255, 129, 1, 0, 170, 128, - 2, 0, 0, 3, 0, 0, 7, 128, 0, 0, 228, 128, 5, 0, 255, - 128, 2, 0, 0, 3, 5, 0, 8, 128, 0, 0, 85, 129, 0, 0, - 0, 128, 88, 0, 0, 4, 2, 0, 3, 128, 5, 0, 255, 128, 0, - 0, 225, 128, 0, 0, 228, 128, 10, 0, 0, 3, 5, 0, 8, 128, - 0, 0, 170, 128, 2, 0, 0, 128, 11, 0, 0, 3, 7, 0, 1, - 128, 2, 0, 85, 128, 0, 0, 170, 128, 8, 0, 0, 3, 2, 0, - 1, 128, 0, 0, 228, 128, 3, 0, 228, 160, 2, 0, 0, 3, 2, - 0, 2, 128, 5, 0, 255, 129, 2, 0, 0, 128, 6, 0, 0, 2, - 2, 0, 2, 128, 2, 0, 85, 128, 2, 0, 0, 3, 7, 0, 14, - 128, 0, 0, 144, 128, 2, 0, 0, 129, 5, 0, 0, 3, 7, 0, - 14, 128, 2, 0, 0, 128, 7, 0, 228, 128, 4, 0, 0, 4, 2, - 0, 14, 128, 7, 0, 228, 128, 2, 0, 85, 128, 2, 0, 0, 128, - 88, 0, 0, 4, 0, 0, 7, 128, 5, 0, 255, 128, 0, 0, 228, - 128, 2, 0, 249, 128, 2, 0, 0, 3, 2, 0, 14, 128, 2, 0, - 0, 129, 0, 0, 144, 128, 2, 0, 0, 3, 5, 0, 8, 128, 2, - 0, 0, 129, 2, 0, 0, 160, 5, 0, 0, 3, 2, 0, 14, 128, - 2, 0, 228, 128, 5, 0, 255, 128, 2, 0, 0, 3, 5, 0, 8, - 128, 2, 0, 0, 129, 7, 0, 0, 128, 2, 0, 0, 3, 7, 0, - 1, 128, 7, 0, 0, 129, 2, 0, 0, 160, 6, 0, 0, 2, 5, - 0, 8, 128, 5, 0, 255, 128, 4, 0, 0, 4, 2, 0, 7, 128, - 2, 0, 249, 128, 5, 0, 255, 128, 2, 0, 0, 128, 88, 0, 0, - 4, 0, 0, 7, 128, 7, 0, 0, 128, 0, 0, 228, 128, 2, 0, - 228, 128, 8, 0, 0, 3, 5, 0, 8, 128, 5, 0, 228, 128, 3, - 0, 228, 160, 2, 0, 0, 3, 2, 0, 1, 128, 1, 0, 170, 128, - 5, 0, 255, 129, 2, 0, 0, 3, 5, 0, 8, 128, 1, 0, 170, - 129, 5, 0, 255, 128, 4, 0, 0, 4, 2, 0, 14, 128, 3, 0, - 144, 128, 1, 0, 255, 128, 5, 0, 255, 128, 4, 0, 0, 4, 3, - 0, 7, 128, 4, 0, 228, 128, 0, 0, 255, 128, 2, 0, 0, 128, - 4, 0, 0, 4, 7, 0, 15, 128, 4, 0, 38, 128, 0, 0, 255, - 128, 5, 0, 144, 129, 2, 0, 0, 3, 0, 0, 8, 128, 3, 0, - 85, 129, 3, 0, 0, 128, 88, 0, 0, 4, 8, 0, 6, 128, 0, - 0, 255, 128, 3, 0, 196, 128, 3, 0, 208, 128, 10, 0, 0, 3, - 0, 0, 8, 128, 3, 0, 170, 128, 8, 0, 85, 128, 11, 0, 0, - 3, 1, 0, 8, 128, 8, 0, 170, 128, 3, 0, 170, 128, 8, 0, - 0, 3, 5, 0, 8, 128, 3, 0, 228, 128, 3, 0, 228, 160, 2, - 0, 0, 3, 2, 0, 1, 128, 0, 0, 255, 129, 5, 0, 255, 128, - 6, 0, 0, 2, 2, 0, 1, 128, 2, 0, 0, 128, 2, 0, 0, - 3, 8, 0, 14, 128, 3, 0, 144, 128, 5, 0, 255, 129, 5, 0, - 0, 3, 8, 0, 14, 128, 5, 0, 255, 128, 8, 0, 228, 128, 4, - 0, 0, 4, 8, 0, 14, 128, 8, 0, 228, 128, 2, 0, 0, 128, - 5, 0, 255, 128, 88, 0, 0, 4, 3, 0, 7, 128, 0, 0, 255, - 128, 3, 0, 228, 128, 8, 0, 249, 128, 2, 0, 0, 3, 8, 0, - 14, 128, 5, 0, 255, 129, 3, 0, 144, 128, 2, 0, 0, 3, 0, - 0, 8, 128, 5, 0, 255, 129, 2, 0, 0, 160, 5, 0, 0, 3, - 8, 0, 14, 128, 0, 0, 255, 128, 8, 0, 228, 128, 2, 0, 0, - 3, 0, 0, 8, 128, 1, 0, 255, 128, 5, 0, 255, 129, 2, 0, - 0, 3, 1, 0, 8, 128, 1, 0, 255, 129, 2, 0, 0, 160, 6, - 0, 0, 2, 0, 0, 8, 128, 0, 0, 255, 128, 4, 0, 0, 4, - 8, 0, 14, 128, 8, 0, 228, 128, 0, 0, 255, 128, 5, 0, 255, - 128, 88, 0, 0, 4, 3, 0, 7, 128, 1, 0, 255, 128, 3, 0, - 228, 128, 8, 0, 249, 128, 2, 0, 0, 3, 0, 0, 8, 128, 2, - 0, 170, 129, 2, 0, 85, 128, 88, 0, 0, 4, 8, 0, 6, 128, - 0, 0, 255, 128, 2, 0, 216, 128, 2, 0, 228, 128, 10, 0, 0, - 3, 0, 0, 8, 128, 2, 0, 255, 128, 8, 0, 85, 128, 11, 0, - 0, 3, 1, 0, 8, 128, 8, 0, 170, 128, 2, 0, 255, 128, 8, - 0, 0, 3, 5, 0, 8, 128, 2, 0, 249, 128, 3, 0, 228, 160, - 2, 0, 0, 3, 2, 0, 1, 128, 0, 0, 255, 129, 5, 0, 255, - 128, 6, 0, 0, 2, 2, 0, 1, 128, 2, 0, 0, 128, 2, 0, - 0, 3, 8, 0, 14, 128, 2, 0, 228, 128, 5, 0, 255, 129, 5, - 0, 0, 3, 8, 0, 14, 128, 5, 0, 255, 128, 8, 0, 228, 128, - 4, 0, 0, 4, 8, 0, 14, 128, 8, 0, 228, 128, 2, 0, 0, - 128, 5, 0, 255, 128, 88, 0, 0, 4, 2, 0, 7, 128, 0, 0, - 255, 128, 2, 0, 249, 128, 8, 0, 249, 128, 2, 0, 0, 3, 8, - 0, 14, 128, 5, 0, 255, 129, 2, 0, 144, 128, 2, 0, 0, 3, - 0, 0, 8, 128, 5, 0, 255, 129, 2, 0, 0, 160, 5, 0, 0, - 3, 8, 0, 14, 128, 0, 0, 255, 128, 8, 0, 228, 128, 2, 0, - 0, 3, 0, 0, 8, 128, 1, 0, 255, 128, 5, 0, 255, 129, 2, - 0, 0, 3, 1, 0, 8, 128, 1, 0, 255, 129, 2, 0, 0, 160, - 6, 0, 0, 2, 0, 0, 8, 128, 0, 0, 255, 128, 4, 0, 0, - 4, 8, 0, 14, 128, 8, 0, 228, 128, 0, 0, 255, 128, 5, 0, - 255, 128, 88, 0, 0, 4, 2, 0, 7, 128, 1, 0, 255, 128, 2, - 0, 228, 128, 8, 0, 249, 128, 1, 0, 0, 2, 0, 0, 8, 128, - 0, 0, 0, 160, 2, 0, 0, 3, 8, 0, 14, 128, 0, 0, 255, - 128, 1, 0, 144, 160, 5, 0, 0, 3, 8, 0, 14, 128, 8, 0, - 228, 128, 8, 0, 228, 128, 88, 0, 0, 4, 2, 0, 7, 128, 8, - 0, 255, 129, 3, 0, 228, 128, 2, 0, 228, 128, 88, 0, 0, 4, - 0, 0, 7, 128, 8, 0, 170, 129, 0, 0, 228, 128, 2, 0, 228, - 128, 1, 0, 0, 2, 2, 0, 2, 128, 2, 0, 85, 160, 1, 0, - 0, 2, 3, 0, 2, 128, 2, 0, 85, 160, 1, 0, 0, 2, 9, - 0, 4, 128, 2, 0, 85, 160, 11, 0, 0, 3, 0, 0, 8, 128, - 8, 0, 0, 128, 1, 0, 0, 128, 10, 0, 0, 3, 2, 0, 8, - 128, 1, 0, 85, 128, 8, 0, 0, 128, 2, 0, 0, 3, 10, 0, - 8, 128, 0, 0, 255, 128, 2, 0, 255, 129, 6, 0, 0, 2, 0, - 0, 8, 128, 7, 0, 255, 128, 5, 0, 0, 3, 0, 0, 8, 128, - 0, 0, 255, 128, 10, 0, 255, 128, 5, 0, 0, 3, 10, 0, 1, - 128, 0, 0, 255, 128, 6, 0, 0, 128, 1, 0, 0, 2, 6, 0, - 12, 128, 7, 0, 180, 128, 88, 0, 0, 4, 9, 0, 3, 128, 7, - 0, 255, 129, 6, 0, 226, 128, 10, 0, 227, 128, 6, 0, 0, 2, - 0, 0, 8, 128, 6, 0, 85, 128, 5, 0, 0, 3, 0, 0, 8, - 128, 0, 0, 255, 128, 10, 0, 255, 128, 5, 0, 0, 3, 10, 0, - 2, 128, 0, 0, 255, 128, 7, 0, 170, 128, 88, 0, 0, 4, 3, - 0, 5, 128, 6, 0, 85, 129, 6, 0, 245, 128, 10, 0, 215, 128, - 88, 0, 0, 4, 1, 0, 11, 128, 7, 0, 170, 128, 3, 0, 164, - 128, 9, 0, 164, 128, 6, 0, 0, 2, 0, 0, 8, 128, 7, 0, - 170, 128, 5, 0, 0, 3, 0, 0, 8, 128, 0, 0, 255, 128, 10, - 0, 255, 128, 5, 0, 0, 3, 10, 0, 4, 128, 0, 0, 255, 128, - 6, 0, 85, 128, 88, 0, 0, 4, 2, 0, 5, 128, 7, 0, 170, - 129, 6, 0, 245, 128, 10, 0, 246, 128, 88, 0, 0, 4, 1, 0, - 11, 128, 7, 0, 0, 128, 2, 0, 164, 128, 1, 0, 228, 128, 1, - 0, 0, 2, 2, 0, 1, 128, 2, 0, 85, 160, 1, 0, 0, 2, - 3, 0, 4, 128, 2, 0, 85, 160, 6, 0, 0, 2, 0, 0, 8, - 128, 6, 0, 0, 128, 5, 0, 0, 3, 0, 0, 8, 128, 0, 0, - 255, 128, 10, 0, 255, 128, 5, 0, 0, 3, 10, 0, 1, 128, 0, - 0, 255, 128, 7, 0, 255, 128, 88, 0, 0, 4, 3, 0, 3, 128, - 6, 0, 0, 129, 6, 0, 226, 128, 10, 0, 236, 128, 6, 0, 0, - 2, 0, 0, 8, 128, 7, 0, 85, 128, 5, 0, 0, 3, 0, 0, - 8, 128, 0, 0, 255, 128, 10, 0, 255, 128, 5, 0, 0, 3, 10, - 0, 2, 128, 0, 0, 255, 128, 7, 0, 0, 128, 88, 0, 0, 4, - 2, 0, 6, 128, 7, 0, 85, 129, 7, 0, 196, 128, 10, 0, 220, - 128, 88, 0, 0, 4, 2, 0, 7, 128, 7, 0, 0, 128, 2, 0, - 228, 128, 3, 0, 228, 128, 1, 0, 0, 2, 3, 0, 1, 128, 2, - 0, 85, 160, 6, 0, 0, 2, 0, 0, 8, 128, 7, 0, 0, 128, - 5, 0, 0, 3, 0, 0, 8, 128, 0, 0, 255, 128, 10, 0, 255, - 128, 5, 0, 0, 3, 10, 0, 4, 128, 0, 0, 255, 128, 7, 0, - 85, 128, 88, 0, 0, 4, 3, 0, 6, 128, 7, 0, 0, 129, 7, - 0, 196, 128, 10, 0, 248, 128, 88, 0, 0, 4, 2, 0, 7, 128, - 7, 0, 170, 128, 3, 0, 228, 128, 2, 0, 228, 128, 88, 0, 0, - 4, 1, 0, 11, 128, 7, 0, 85, 128, 2, 0, 164, 128, 1, 0, - 228, 128, 8, 0, 0, 3, 0, 0, 8, 128, 1, 0, 244, 128, 3, - 0, 228, 160, 2, 0, 0, 3, 0, 0, 8, 128, 0, 0, 255, 129, - 1, 0, 170, 128, 2, 0, 0, 3, 1, 0, 7, 128, 0, 0, 255, - 128, 1, 0, 244, 128, 2, 0, 0, 3, 0, 0, 8, 128, 1, 0, - 85, 129, 1, 0, 0, 128, 88, 0, 0, 4, 2, 0, 3, 128, 0, - 0, 255, 128, 1, 0, 225, 128, 1, 0, 228, 128, 10, 0, 0, 3, - 0, 0, 8, 128, 1, 0, 170, 128, 2, 0, 0, 128, 11, 0, 0, - 3, 5, 0, 8, 128, 2, 0, 85, 128, 1, 0, 170, 128, 8, 0, - 0, 3, 1, 0, 8, 128, 1, 0, 228, 128, 3, 0, 228, 160, 2, - 0, 0, 3, 2, 0, 7, 128, 1, 0, 255, 129, 1, 0, 228, 128, - 5, 0, 0, 3, 2, 0, 7, 128, 1, 0, 255, 128, 2, 0, 228, - 128, 2, 0, 0, 3, 2, 0, 8, 128, 0, 0, 255, 129, 1, 0, - 255, 128, 6, 0, 0, 2, 2, 0, 8, 128, 2, 0, 255, 128, 4, - 0, 0, 4, 2, 0, 7, 128, 2, 0, 228, 128, 2, 0, 255, 128, - 1, 0, 255, 128, 88, 0, 0, 4, 1, 0, 7, 128, 0, 0, 255, - 128, 1, 0, 228, 128, 2, 0, 228, 128, 2, 0, 0, 3, 2, 0, - 7, 128, 1, 0, 255, 129, 1, 0, 228, 128, 2, 0, 0, 3, 0, - 0, 8, 128, 1, 0, 255, 129, 2, 0, 0, 160, 5, 0, 0, 3, - 2, 0, 7, 128, 0, 0, 255, 128, 2, 0, 228, 128, 2, 0, 0, - 3, 0, 0, 8, 128, 1, 0, 255, 129, 5, 0, 255, 128, 2, 0, - 0, 3, 2, 0, 8, 128, 5, 0, 255, 129, 2, 0, 0, 160, 6, - 0, 0, 2, 0, 0, 8, 128, 0, 0, 255, 128, 4, 0, 0, 4, - 2, 0, 7, 128, 2, 0, 228, 128, 0, 0, 255, 128, 1, 0, 255, - 128, 88, 0, 0, 4, 1, 0, 7, 128, 2, 0, 255, 128, 1, 0, - 228, 128, 2, 0, 228, 128, 88, 0, 0, 4, 0, 0, 7, 128, 8, - 0, 85, 129, 1, 0, 228, 128, 0, 0, 228, 128, 18, 0, 0, 4, - 1, 0, 7, 128, 3, 0, 255, 128, 0, 0, 228, 128, 5, 0, 228, - 128, 5, 0, 0, 3, 1, 0, 8, 128, 3, 0, 255, 128, 3, 0, - 255, 128, 88, 0, 0, 4, 1, 0, 8, 128, 1, 0, 255, 129, 2, - 0, 0, 160, 2, 0, 85, 160, 5, 0, 0, 3, 0, 0, 7, 128, - 4, 0, 255, 128, 1, 0, 228, 128, 5, 0, 0, 3, 0, 0, 8, - 128, 4, 0, 255, 128, 4, 0, 255, 128, 88, 0, 0, 4, 0, 0, - 8, 128, 0, 0, 255, 129, 2, 0, 0, 160, 2, 0, 85, 160, 2, - 0, 0, 3, 0, 0, 8, 128, 1, 0, 255, 128, 0, 0, 255, 128, - 88, 0, 0, 4, 4, 0, 7, 128, 0, 0, 255, 129, 0, 0, 228, - 128, 4, 0, 228, 128, 1, 0, 0, 2, 0, 8, 15, 128, 4, 0, - 228, 128, 255, 255, 0, 0, 83, 72, 68, 82, 252, 21, 0, 0, 64, - 0, 0, 0, 127, 5, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, - 0, 0, 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 1, 0, - 0, 0, 88, 24, 0, 4, 0, 112, 16, 0, 0, 0, 0, 0, 85, - 85, 0, 0, 88, 24, 0, 4, 0, 112, 16, 0, 1, 0, 0, 0, - 85, 85, 0, 0, 98, 16, 0, 3, 50, 16, 16, 0, 1, 0, 0, - 0, 101, 0, 0, 3, 242, 32, 16, 0, 0, 0, 0, 0, 104, 0, - 0, 2, 9, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 16, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, - 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 69, 0, 0, - 9, 242, 0, 16, 0, 1, 0, 0, 0, 70, 16, 16, 0, 1, 0, - 0, 0, 70, 126, 16, 0, 1, 0, 0, 0, 0, 96, 16, 0, 1, - 0, 0, 0, 24, 0, 0, 7, 18, 0, 16, 0, 2, 0, 0, 0, - 58, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, - 0, 24, 0, 0, 7, 34, 0, 16, 0, 2, 0, 0, 0, 58, 0, - 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 60, - 0, 0, 7, 18, 0, 16, 0, 2, 0, 0, 0, 26, 0, 16, 0, - 2, 0, 0, 0, 10, 0, 16, 0, 2, 0, 0, 0, 31, 0, 4, - 3, 10, 0, 16, 0, 2, 0, 0, 0, 54, 0, 0, 5, 242, 32, - 16, 0, 0, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 62, - 0, 0, 1, 21, 0, 0, 1, 14, 0, 0, 7, 114, 0, 16, 0, - 0, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 246, 15, 16, - 0, 0, 0, 0, 0, 14, 0, 0, 7, 114, 0, 16, 0, 1, 0, - 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 246, 15, 16, 0, 1, - 0, 0, 0, 32, 0, 0, 8, 18, 0, 16, 0, 2, 0, 0, 0, - 10, 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, - 0, 12, 0, 0, 0, 31, 0, 4, 3, 10, 0, 16, 0, 2, 0, - 0, 0, 52, 0, 0, 7, 18, 0, 16, 0, 2, 0, 0, 0, 42, - 0, 16, 0, 1, 0, 0, 0, 26, 0, 16, 0, 1, 0, 0, 0, - 52, 0, 0, 7, 18, 0, 16, 0, 2, 0, 0, 0, 10, 0, 16, - 0, 1, 0, 0, 0, 10, 0, 16, 0, 2, 0, 0, 0, 51, 0, - 0, 7, 34, 0, 16, 0, 2, 0, 0, 0, 42, 0, 16, 0, 1, - 0, 0, 0, 26, 0, 16, 0, 1, 0, 0, 0, 51, 0, 0, 7, - 34, 0, 16, 0, 2, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, - 0, 26, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 8, 130, 0, - 16, 0, 2, 0, 0, 0, 26, 0, 16, 128, 65, 0, 0, 0, 2, - 0, 0, 0, 10, 0, 16, 0, 2, 0, 0, 0, 29, 0, 0, 7, - 18, 0, 16, 0, 3, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, - 0, 10, 0, 16, 0, 0, 0, 0, 0, 31, 0, 4, 3, 10, 0, - 16, 0, 3, 0, 0, 0, 0, 0, 0, 8, 242, 0, 16, 0, 3, - 0, 0, 0, 6, 10, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, - 150, 4, 16, 0, 0, 0, 0, 0, 49, 0, 0, 10, 114, 0, 16, - 0, 4, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 7, 16, 0, 3, - 0, 0, 0, 14, 0, 0, 7, 114, 0, 16, 0, 5, 0, 0, 0, - 246, 15, 16, 0, 2, 0, 0, 0, 22, 7, 16, 0, 3, 0, 0, - 0, 56, 0, 0, 7, 114, 0, 16, 0, 2, 0, 0, 0, 70, 2, - 16, 0, 3, 0, 0, 0, 70, 2, 16, 0, 5, 0, 0, 0, 55, - 0, 0, 9, 98, 0, 16, 0, 5, 0, 0, 0, 6, 0, 16, 0, - 4, 0, 0, 0, 6, 3, 16, 0, 2, 0, 0, 0, 6, 1, 16, - 0, 3, 0, 0, 0, 29, 0, 0, 7, 146, 0, 16, 0, 4, 0, - 0, 0, 166, 10, 16, 0, 0, 0, 0, 0, 86, 1, 16, 0, 0, - 0, 0, 0, 55, 0, 0, 9, 98, 0, 16, 0, 6, 0, 0, 0, - 86, 5, 16, 0, 4, 0, 0, 0, 246, 13, 16, 0, 2, 0, 0, - 0, 6, 1, 16, 0, 3, 0, 0, 0, 55, 0, 0, 9, 50, 0, - 16, 0, 3, 0, 0, 0, 166, 10, 16, 0, 4, 0, 0, 0, 230, - 10, 16, 0, 2, 0, 0, 0, 230, 10, 16, 0, 3, 0, 0, 0, - 54, 0, 0, 5, 18, 0, 16, 0, 6, 0, 0, 0, 1, 64, 0, - 0, 0, 0, 0, 0, 54, 0, 0, 5, 66, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 55, 0, 0, 9, 114, - 0, 16, 0, 3, 0, 0, 0, 246, 15, 16, 0, 4, 0, 0, 0, - 70, 2, 16, 0, 6, 0, 0, 0, 70, 2, 16, 0, 3, 0, 0, - 0, 54, 0, 0, 5, 18, 0, 16, 0, 5, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 0, 55, 0, 0, 9, 114, 0, 16, 0, 3, - 0, 0, 0, 6, 0, 16, 0, 4, 0, 0, 0, 70, 2, 16, 0, - 5, 0, 0, 0, 70, 2, 16, 0, 3, 0, 0, 0, 18, 0, 0, - 1, 0, 0, 0, 8, 242, 0, 16, 0, 4, 0, 0, 0, 86, 10, - 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 134, 1, 16, 0, 0, - 0, 0, 0, 49, 0, 0, 10, 114, 0, 16, 0, 5, 0, 0, 0, - 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 22, 7, 16, 0, 4, 0, 0, 0, 14, 0, - 0, 7, 114, 0, 16, 0, 6, 0, 0, 0, 246, 15, 16, 0, 2, - 0, 0, 0, 22, 7, 16, 0, 4, 0, 0, 0, 56, 0, 0, 7, - 114, 0, 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, - 0, 70, 2, 16, 0, 6, 0, 0, 0, 55, 0, 0, 9, 82, 0, - 16, 0, 6, 0, 0, 0, 6, 0, 16, 0, 5, 0, 0, 0, 6, - 3, 16, 0, 2, 0, 0, 0, 6, 1, 16, 0, 4, 0, 0, 0, - 29, 0, 0, 7, 146, 0, 16, 0, 5, 0, 0, 0, 166, 10, 16, - 0, 0, 0, 0, 0, 6, 4, 16, 0, 0, 0, 0, 0, 55, 0, - 0, 9, 82, 0, 16, 0, 7, 0, 0, 0, 86, 5, 16, 0, 5, - 0, 0, 0, 246, 13, 16, 0, 2, 0, 0, 0, 6, 1, 16, 0, - 4, 0, 0, 0, 55, 0, 0, 9, 50, 0, 16, 0, 2, 0, 0, - 0, 166, 10, 16, 0, 5, 0, 0, 0, 182, 15, 16, 0, 2, 0, - 0, 0, 182, 15, 16, 0, 4, 0, 0, 0, 54, 0, 0, 5, 34, - 0, 16, 0, 7, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 66, 0, 16, 0, 2, 0, 0, 0, 1, 64, 0, - 0, 0, 0, 0, 0, 55, 0, 0, 9, 114, 0, 16, 0, 2, 0, - 0, 0, 246, 15, 16, 0, 5, 0, 0, 0, 70, 2, 16, 0, 7, - 0, 0, 0, 70, 2, 16, 0, 2, 0, 0, 0, 54, 0, 0, 5, - 34, 0, 16, 0, 6, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, - 0, 55, 0, 0, 9, 114, 0, 16, 0, 3, 0, 0, 0, 6, 0, - 16, 0, 5, 0, 0, 0, 70, 2, 16, 0, 6, 0, 0, 0, 70, - 2, 16, 0, 2, 0, 0, 0, 21, 0, 0, 1, 16, 0, 0, 10, - 18, 0, 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, - 0, 2, 64, 0, 0, 154, 153, 153, 62, 61, 10, 23, 63, 174, 71, - 225, 61, 0, 0, 0, 0, 16, 0, 0, 10, 34, 0, 16, 0, 2, - 0, 0, 0, 70, 2, 16, 0, 3, 0, 0, 0, 2, 64, 0, 0, - 154, 153, 153, 62, 61, 10, 23, 63, 174, 71, 225, 61, 0, 0, 0, - 0, 0, 0, 0, 8, 18, 0, 16, 0, 2, 0, 0, 0, 26, 0, - 16, 128, 65, 0, 0, 0, 2, 0, 0, 0, 10, 0, 16, 0, 2, - 0, 0, 0, 0, 0, 0, 7, 114, 0, 16, 0, 2, 0, 0, 0, - 6, 0, 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 3, 0, 0, - 0, 16, 0, 0, 10, 130, 0, 16, 0, 2, 0, 0, 0, 70, 2, - 16, 0, 2, 0, 0, 0, 2, 64, 0, 0, 154, 153, 153, 62, 61, - 10, 23, 63, 174, 71, 225, 61, 0, 0, 0, 0, 51, 0, 0, 7, - 18, 0, 16, 0, 3, 0, 0, 0, 26, 0, 16, 0, 2, 0, 0, - 0, 10, 0, 16, 0, 2, 0, 0, 0, 51, 0, 0, 7, 18, 0, - 16, 0, 3, 0, 0, 0, 42, 0, 16, 0, 2, 0, 0, 0, 10, - 0, 16, 0, 3, 0, 0, 0, 52, 0, 0, 7, 34, 0, 16, 0, - 3, 0, 0, 0, 26, 0, 16, 0, 2, 0, 0, 0, 10, 0, 16, - 0, 2, 0, 0, 0, 52, 0, 0, 7, 34, 0, 16, 0, 3, 0, - 0, 0, 42, 0, 16, 0, 2, 0, 0, 0, 26, 0, 16, 0, 3, - 0, 0, 0, 49, 0, 0, 7, 66, 0, 16, 0, 3, 0, 0, 0, - 10, 0, 16, 0, 3, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 114, 0, 16, 0, 4, 0, 0, 0, 246, 15, - 16, 128, 65, 0, 0, 0, 2, 0, 0, 0, 70, 2, 16, 0, 2, - 0, 0, 0, 56, 0, 0, 7, 114, 0, 16, 0, 4, 0, 0, 0, - 246, 15, 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, - 0, 0, 0, 0, 8, 18, 0, 16, 0, 3, 0, 0, 0, 58, 0, - 16, 0, 2, 0, 0, 0, 10, 0, 16, 128, 65, 0, 0, 0, 3, - 0, 0, 0, 14, 0, 0, 7, 114, 0, 16, 0, 4, 0, 0, 0, - 70, 2, 16, 0, 4, 0, 0, 0, 6, 0, 16, 0, 3, 0, 0, - 0, 0, 0, 0, 7, 114, 0, 16, 0, 4, 0, 0, 0, 246, 15, - 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 55, - 0, 0, 9, 114, 0, 16, 0, 2, 0, 0, 0, 166, 10, 16, 0, - 3, 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 70, 2, 16, - 0, 2, 0, 0, 0, 49, 0, 0, 7, 18, 0, 16, 0, 3, 0, - 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 26, 0, 16, 0, 3, - 0, 0, 0, 0, 0, 0, 8, 114, 0, 16, 0, 4, 0, 0, 0, - 246, 15, 16, 128, 65, 0, 0, 0, 2, 0, 0, 0, 70, 2, 16, - 0, 2, 0, 0, 0, 0, 0, 0, 8, 66, 0, 16, 0, 3, 0, - 0, 0, 58, 0, 16, 128, 65, 0, 0, 0, 2, 0, 0, 0, 1, - 64, 0, 0, 0, 0, 128, 63, 56, 0, 0, 7, 114, 0, 16, 0, - 4, 0, 0, 0, 166, 10, 16, 0, 3, 0, 0, 0, 70, 2, 16, - 0, 4, 0, 0, 0, 0, 0, 0, 8, 34, 0, 16, 0, 3, 0, - 0, 0, 58, 0, 16, 128, 65, 0, 0, 0, 2, 0, 0, 0, 26, - 0, 16, 0, 3, 0, 0, 0, 14, 0, 0, 7, 226, 0, 16, 0, - 3, 0, 0, 0, 6, 9, 16, 0, 4, 0, 0, 0, 86, 5, 16, - 0, 3, 0, 0, 0, 0, 0, 0, 7, 226, 0, 16, 0, 3, 0, - 0, 0, 246, 15, 16, 0, 2, 0, 0, 0, 86, 14, 16, 0, 3, - 0, 0, 0, 55, 0, 0, 9, 114, 0, 16, 0, 2, 0, 0, 0, - 6, 0, 16, 0, 3, 0, 0, 0, 150, 7, 16, 0, 3, 0, 0, - 0, 70, 2, 16, 0, 2, 0, 0, 0, 18, 0, 0, 1, 32, 0, - 0, 8, 130, 0, 16, 0, 2, 0, 0, 0, 10, 128, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 13, 0, 0, 0, - 31, 0, 4, 3, 58, 0, 16, 0, 2, 0, 0, 0, 52, 0, 0, - 7, 130, 0, 16, 0, 2, 0, 0, 0, 42, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 52, 0, 0, 7, 130, - 0, 16, 0, 2, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 2, 0, 0, 0, 51, 0, 0, 7, 18, 0, 16, - 0, 3, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, 51, 0, 0, 7, 18, 0, 16, 0, 3, - 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, - 3, 0, 0, 0, 0, 0, 0, 8, 130, 0, 16, 0, 3, 0, 0, - 0, 58, 0, 16, 0, 2, 0, 0, 0, 10, 0, 16, 128, 65, 0, - 0, 0, 3, 0, 0, 0, 29, 0, 0, 7, 130, 0, 16, 0, 2, - 0, 0, 0, 26, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, - 1, 0, 0, 0, 31, 0, 4, 3, 58, 0, 16, 0, 2, 0, 0, - 0, 0, 0, 0, 8, 242, 0, 16, 0, 4, 0, 0, 0, 6, 10, - 16, 128, 65, 0, 0, 0, 1, 0, 0, 0, 150, 4, 16, 0, 1, - 0, 0, 0, 49, 0, 0, 10, 114, 0, 16, 0, 5, 0, 0, 0, - 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 22, 7, 16, 0, 4, 0, 0, 0, 14, 0, - 0, 7, 114, 0, 16, 0, 6, 0, 0, 0, 246, 15, 16, 0, 3, - 0, 0, 0, 22, 7, 16, 0, 4, 0, 0, 0, 56, 0, 0, 7, - 114, 0, 16, 0, 3, 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, - 0, 70, 2, 16, 0, 6, 0, 0, 0, 55, 0, 0, 9, 98, 0, - 16, 0, 6, 0, 0, 0, 6, 0, 16, 0, 5, 0, 0, 0, 6, - 3, 16, 0, 3, 0, 0, 0, 6, 1, 16, 0, 4, 0, 0, 0, - 29, 0, 0, 7, 146, 0, 16, 0, 5, 0, 0, 0, 166, 10, 16, - 0, 1, 0, 0, 0, 86, 1, 16, 0, 1, 0, 0, 0, 55, 0, - 0, 9, 98, 0, 16, 0, 7, 0, 0, 0, 86, 5, 16, 0, 5, - 0, 0, 0, 246, 13, 16, 0, 3, 0, 0, 0, 6, 1, 16, 0, - 4, 0, 0, 0, 55, 0, 0, 9, 50, 0, 16, 0, 4, 0, 0, - 0, 166, 10, 16, 0, 5, 0, 0, 0, 230, 10, 16, 0, 3, 0, - 0, 0, 230, 10, 16, 0, 4, 0, 0, 0, 54, 0, 0, 5, 18, - 0, 16, 0, 7, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 66, 0, 16, 0, 4, 0, 0, 0, 1, 64, 0, - 0, 0, 0, 0, 0, 55, 0, 0, 9, 114, 0, 16, 0, 4, 0, - 0, 0, 246, 15, 16, 0, 5, 0, 0, 0, 70, 2, 16, 0, 7, - 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 54, 0, 0, 5, - 18, 0, 16, 0, 6, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, - 0, 55, 0, 0, 9, 114, 0, 16, 0, 4, 0, 0, 0, 6, 0, - 16, 0, 5, 0, 0, 0, 70, 2, 16, 0, 6, 0, 0, 0, 70, - 2, 16, 0, 4, 0, 0, 0, 18, 0, 0, 1, 0, 0, 0, 8, - 242, 0, 16, 0, 5, 0, 0, 0, 86, 10, 16, 128, 65, 0, 0, - 0, 1, 0, 0, 0, 134, 1, 16, 0, 1, 0, 0, 0, 49, 0, - 0, 10, 114, 0, 16, 0, 6, 0, 0, 0, 2, 64, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 22, 7, 16, 0, 5, 0, 0, 0, 14, 0, 0, 7, 114, 0, 16, - 0, 7, 0, 0, 0, 246, 15, 16, 0, 3, 0, 0, 0, 22, 7, - 16, 0, 5, 0, 0, 0, 56, 0, 0, 7, 114, 0, 16, 0, 3, - 0, 0, 0, 70, 2, 16, 0, 5, 0, 0, 0, 70, 2, 16, 0, - 7, 0, 0, 0, 55, 0, 0, 9, 82, 0, 16, 0, 7, 0, 0, - 0, 6, 0, 16, 0, 6, 0, 0, 0, 6, 3, 16, 0, 3, 0, - 0, 0, 6, 1, 16, 0, 5, 0, 0, 0, 29, 0, 0, 7, 146, - 0, 16, 0, 6, 0, 0, 0, 166, 10, 16, 0, 1, 0, 0, 0, - 6, 4, 16, 0, 1, 0, 0, 0, 55, 0, 0, 9, 82, 0, 16, - 0, 8, 0, 0, 0, 86, 5, 16, 0, 6, 0, 0, 0, 246, 13, - 16, 0, 3, 0, 0, 0, 6, 1, 16, 0, 5, 0, 0, 0, 55, - 0, 0, 9, 50, 0, 16, 0, 3, 0, 0, 0, 166, 10, 16, 0, - 6, 0, 0, 0, 182, 15, 16, 0, 3, 0, 0, 0, 182, 15, 16, - 0, 5, 0, 0, 0, 54, 0, 0, 5, 34, 0, 16, 0, 8, 0, - 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 54, 0, 0, 5, 66, - 0, 16, 0, 3, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, - 55, 0, 0, 9, 114, 0, 16, 0, 3, 0, 0, 0, 246, 15, 16, - 0, 6, 0, 0, 0, 70, 2, 16, 0, 8, 0, 0, 0, 70, 2, - 16, 0, 3, 0, 0, 0, 54, 0, 0, 5, 34, 0, 16, 0, 7, - 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 55, 0, 0, 9, - 114, 0, 16, 0, 4, 0, 0, 0, 6, 0, 16, 0, 6, 0, 0, - 0, 70, 2, 16, 0, 7, 0, 0, 0, 70, 2, 16, 0, 3, 0, - 0, 0, 21, 0, 0, 1, 16, 0, 0, 10, 130, 0, 16, 0, 2, - 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 2, 64, 0, 0, - 154, 153, 153, 62, 61, 10, 23, 63, 174, 71, 225, 61, 0, 0, 0, - 0, 16, 0, 0, 10, 18, 0, 16, 0, 3, 0, 0, 0, 70, 2, - 16, 0, 4, 0, 0, 0, 2, 64, 0, 0, 154, 153, 153, 62, 61, - 10, 23, 63, 174, 71, 225, 61, 0, 0, 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 2, 0, 0, 0, 58, 0, 16, 0, 2, 0, 0, - 0, 10, 0, 16, 128, 65, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 7, 114, 0, 16, 0, 3, 0, 0, 0, 246, 15, 16, 0, 2, - 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 16, 0, 0, 10, - 130, 0, 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 3, 0, 0, - 0, 2, 64, 0, 0, 154, 153, 153, 62, 61, 10, 23, 63, 174, 71, - 225, 61, 0, 0, 0, 0, 51, 0, 0, 7, 130, 0, 16, 0, 3, - 0, 0, 0, 26, 0, 16, 0, 3, 0, 0, 0, 10, 0, 16, 0, - 3, 0, 0, 0, 51, 0, 0, 7, 130, 0, 16, 0, 3, 0, 0, - 0, 42, 0, 16, 0, 3, 0, 0, 0, 58, 0, 16, 0, 3, 0, - 0, 0, 52, 0, 0, 7, 18, 0, 16, 0, 4, 0, 0, 0, 26, - 0, 16, 0, 3, 0, 0, 0, 10, 0, 16, 0, 3, 0, 0, 0, - 52, 0, 0, 7, 18, 0, 16, 0, 4, 0, 0, 0, 42, 0, 16, - 0, 3, 0, 0, 0, 10, 0, 16, 0, 4, 0, 0, 0, 49, 0, - 0, 7, 34, 0, 16, 0, 4, 0, 0, 0, 58, 0, 16, 0, 3, - 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, - 114, 0, 16, 0, 5, 0, 0, 0, 246, 15, 16, 128, 65, 0, 0, - 0, 2, 0, 0, 0, 70, 2, 16, 0, 3, 0, 0, 0, 56, 0, - 0, 7, 114, 0, 16, 0, 5, 0, 0, 0, 246, 15, 16, 0, 2, - 0, 0, 0, 70, 2, 16, 0, 5, 0, 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 3, 0, 0, 0, 58, 0, 16, 0, 2, 0, 0, - 0, 58, 0, 16, 128, 65, 0, 0, 0, 3, 0, 0, 0, 14, 0, - 0, 7, 114, 0, 16, 0, 5, 0, 0, 0, 70, 2, 16, 0, 5, - 0, 0, 0, 246, 15, 16, 0, 3, 0, 0, 0, 0, 0, 0, 7, - 114, 0, 16, 0, 5, 0, 0, 0, 246, 15, 16, 0, 2, 0, 0, - 0, 70, 2, 16, 0, 5, 0, 0, 0, 55, 0, 0, 9, 114, 0, - 16, 0, 3, 0, 0, 0, 86, 5, 16, 0, 4, 0, 0, 0, 70, - 2, 16, 0, 5, 0, 0, 0, 70, 2, 16, 0, 3, 0, 0, 0, - 49, 0, 0, 7, 130, 0, 16, 0, 3, 0, 0, 0, 1, 64, 0, - 0, 0, 0, 128, 63, 10, 0, 16, 0, 4, 0, 0, 0, 0, 0, - 0, 8, 226, 0, 16, 0, 4, 0, 0, 0, 246, 15, 16, 128, 65, - 0, 0, 0, 2, 0, 0, 0, 6, 9, 16, 0, 3, 0, 0, 0, - 0, 0, 0, 8, 18, 0, 16, 0, 5, 0, 0, 0, 58, 0, 16, - 128, 65, 0, 0, 0, 2, 0, 0, 0, 1, 64, 0, 0, 0, 0, - 128, 63, 56, 0, 0, 7, 226, 0, 16, 0, 4, 0, 0, 0, 86, - 14, 16, 0, 4, 0, 0, 0, 6, 0, 16, 0, 5, 0, 0, 0, - 0, 0, 0, 8, 18, 0, 16, 0, 4, 0, 0, 0, 58, 0, 16, - 128, 65, 0, 0, 0, 2, 0, 0, 0, 10, 0, 16, 0, 4, 0, - 0, 0, 14, 0, 0, 7, 114, 0, 16, 0, 4, 0, 0, 0, 150, - 7, 16, 0, 4, 0, 0, 0, 6, 0, 16, 0, 4, 0, 0, 0, - 0, 0, 0, 7, 114, 0, 16, 0, 4, 0, 0, 0, 246, 15, 16, - 0, 2, 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 55, 0, - 0, 9, 114, 0, 16, 0, 2, 0, 0, 0, 246, 15, 16, 0, 3, - 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 70, 2, 16, 0, - 3, 0, 0, 0, 18, 0, 0, 1, 32, 0, 0, 8, 130, 0, 16, - 0, 2, 0, 0, 0, 10, 128, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 64, 0, 0, 14, 0, 0, 0, 31, 0, 4, 3, 58, - 0, 16, 0, 2, 0, 0, 0, 16, 0, 0, 10, 130, 0, 16, 0, - 2, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 2, 64, 0, - 0, 154, 153, 153, 62, 61, 10, 23, 63, 174, 71, 225, 61, 0, 0, - 0, 0, 16, 0, 0, 10, 18, 0, 16, 0, 3, 0, 0, 0, 70, - 2, 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 154, 153, 153, 62, - 61, 10, 23, 63, 174, 71, 225, 61, 0, 0, 0, 0, 0, 0, 0, - 8, 130, 0, 16, 0, 2, 0, 0, 0, 58, 0, 16, 0, 2, 0, - 0, 0, 10, 0, 16, 128, 65, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 7, 114, 0, 16, 0, 3, 0, 0, 0, 70, 2, 16, 0, - 0, 0, 0, 0, 246, 15, 16, 0, 2, 0, 0, 0, 16, 0, 0, - 10, 130, 0, 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 3, 0, - 0, 0, 2, 64, 0, 0, 154, 153, 153, 62, 61, 10, 23, 63, 174, - 71, 225, 61, 0, 0, 0, 0, 51, 0, 0, 7, 130, 0, 16, 0, - 3, 0, 0, 0, 26, 0, 16, 0, 3, 0, 0, 0, 10, 0, 16, - 0, 3, 0, 0, 0, 51, 0, 0, 7, 130, 0, 16, 0, 3, 0, - 0, 0, 42, 0, 16, 0, 3, 0, 0, 0, 58, 0, 16, 0, 3, - 0, 0, 0, 52, 0, 0, 7, 18, 0, 16, 0, 4, 0, 0, 0, - 26, 0, 16, 0, 3, 0, 0, 0, 10, 0, 16, 0, 3, 0, 0, - 0, 52, 0, 0, 7, 18, 0, 16, 0, 4, 0, 0, 0, 42, 0, - 16, 0, 3, 0, 0, 0, 10, 0, 16, 0, 4, 0, 0, 0, 49, - 0, 0, 7, 34, 0, 16, 0, 4, 0, 0, 0, 58, 0, 16, 0, - 3, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 114, 0, 16, 0, 5, 0, 0, 0, 246, 15, 16, 128, 65, 0, - 0, 0, 2, 0, 0, 0, 70, 2, 16, 0, 3, 0, 0, 0, 56, - 0, 0, 7, 114, 0, 16, 0, 5, 0, 0, 0, 246, 15, 16, 0, - 2, 0, 0, 0, 70, 2, 16, 0, 5, 0, 0, 0, 0, 0, 0, - 8, 130, 0, 16, 0, 3, 0, 0, 0, 58, 0, 16, 0, 2, 0, - 0, 0, 58, 0, 16, 128, 65, 0, 0, 0, 3, 0, 0, 0, 14, - 0, 0, 7, 114, 0, 16, 0, 5, 0, 0, 0, 70, 2, 16, 0, - 5, 0, 0, 0, 246, 15, 16, 0, 3, 0, 0, 0, 0, 0, 0, - 7, 114, 0, 16, 0, 5, 0, 0, 0, 246, 15, 16, 0, 2, 0, - 0, 0, 70, 2, 16, 0, 5, 0, 0, 0, 55, 0, 0, 9, 114, - 0, 16, 0, 3, 0, 0, 0, 86, 5, 16, 0, 4, 0, 0, 0, - 70, 2, 16, 0, 5, 0, 0, 0, 70, 2, 16, 0, 3, 0, 0, - 0, 49, 0, 0, 7, 130, 0, 16, 0, 3, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, 10, 0, 16, 0, 4, 0, 0, 0, 0, - 0, 0, 8, 226, 0, 16, 0, 4, 0, 0, 0, 246, 15, 16, 128, - 65, 0, 0, 0, 2, 0, 0, 0, 6, 9, 16, 0, 3, 0, 0, - 0, 0, 0, 0, 8, 18, 0, 16, 0, 5, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, 2, 0, 0, 0, 1, 64, 0, 0, 0, - 0, 128, 63, 56, 0, 0, 7, 226, 0, 16, 0, 4, 0, 0, 0, - 86, 14, 16, 0, 4, 0, 0, 0, 6, 0, 16, 0, 5, 0, 0, - 0, 0, 0, 0, 8, 18, 0, 16, 0, 4, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, 2, 0, 0, 0, 10, 0, 16, 0, 4, - 0, 0, 0, 14, 0, 0, 7, 114, 0, 16, 0, 4, 0, 0, 0, - 150, 7, 16, 0, 4, 0, 0, 0, 6, 0, 16, 0, 4, 0, 0, - 0, 0, 0, 0, 7, 114, 0, 16, 0, 4, 0, 0, 0, 246, 15, - 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 55, - 0, 0, 9, 114, 0, 16, 0, 2, 0, 0, 0, 246, 15, 16, 0, - 3, 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 70, 2, 16, - 0, 3, 0, 0, 0, 18, 0, 0, 1, 16, 0, 0, 10, 130, 0, - 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 2, - 64, 0, 0, 154, 153, 153, 62, 61, 10, 23, 63, 174, 71, 225, 61, - 0, 0, 0, 0, 16, 0, 0, 10, 18, 0, 16, 0, 3, 0, 0, - 0, 70, 2, 16, 0, 1, 0, 0, 0, 2, 64, 0, 0, 154, 153, - 153, 62, 61, 10, 23, 63, 174, 71, 225, 61, 0, 0, 0, 0, 0, - 0, 0, 8, 130, 0, 16, 0, 2, 0, 0, 0, 58, 0, 16, 0, - 2, 0, 0, 0, 10, 0, 16, 128, 65, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 7, 114, 0, 16, 0, 1, 0, 0, 0, 70, 2, - 16, 0, 1, 0, 0, 0, 246, 15, 16, 0, 2, 0, 0, 0, 16, - 0, 0, 10, 130, 0, 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, - 1, 0, 0, 0, 2, 64, 0, 0, 154, 153, 153, 62, 61, 10, 23, - 63, 174, 71, 225, 61, 0, 0, 0, 0, 51, 0, 0, 7, 18, 0, - 16, 0, 3, 0, 0, 0, 26, 0, 16, 0, 1, 0, 0, 0, 10, - 0, 16, 0, 1, 0, 0, 0, 51, 0, 0, 7, 18, 0, 16, 0, - 3, 0, 0, 0, 42, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, - 0, 3, 0, 0, 0, 52, 0, 0, 7, 34, 0, 16, 0, 3, 0, - 0, 0, 26, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 1, - 0, 0, 0, 52, 0, 0, 7, 34, 0, 16, 0, 3, 0, 0, 0, - 42, 0, 16, 0, 1, 0, 0, 0, 26, 0, 16, 0, 3, 0, 0, - 0, 49, 0, 0, 7, 66, 0, 16, 0, 3, 0, 0, 0, 10, 0, - 16, 0, 3, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 114, 0, 16, 0, 4, 0, 0, 0, 70, 2, 16, 0, - 1, 0, 0, 0, 246, 15, 16, 128, 65, 0, 0, 0, 2, 0, 0, - 0, 56, 0, 0, 7, 114, 0, 16, 0, 4, 0, 0, 0, 246, 15, - 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 0, - 0, 0, 8, 18, 0, 16, 0, 3, 0, 0, 0, 58, 0, 16, 0, - 2, 0, 0, 0, 10, 0, 16, 128, 65, 0, 0, 0, 3, 0, 0, - 0, 14, 0, 0, 7, 114, 0, 16, 0, 4, 0, 0, 0, 70, 2, - 16, 0, 4, 0, 0, 0, 6, 0, 16, 0, 3, 0, 0, 0, 0, - 0, 0, 7, 114, 0, 16, 0, 4, 0, 0, 0, 246, 15, 16, 0, - 2, 0, 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 55, 0, 0, - 9, 114, 0, 16, 0, 1, 0, 0, 0, 166, 10, 16, 0, 3, 0, - 0, 0, 70, 2, 16, 0, 4, 0, 0, 0, 70, 2, 16, 0, 1, - 0, 0, 0, 49, 0, 0, 7, 18, 0, 16, 0, 3, 0, 0, 0, - 1, 64, 0, 0, 0, 0, 128, 63, 26, 0, 16, 0, 3, 0, 0, - 0, 0, 0, 0, 8, 114, 0, 16, 0, 4, 0, 0, 0, 246, 15, - 16, 128, 65, 0, 0, 0, 2, 0, 0, 0, 70, 2, 16, 0, 1, - 0, 0, 0, 0, 0, 0, 8, 66, 0, 16, 0, 3, 0, 0, 0, - 58, 0, 16, 128, 65, 0, 0, 0, 2, 0, 0, 0, 1, 64, 0, - 0, 0, 0, 128, 63, 56, 0, 0, 7, 114, 0, 16, 0, 4, 0, - 0, 0, 166, 10, 16, 0, 3, 0, 0, 0, 70, 2, 16, 0, 4, - 0, 0, 0, 0, 0, 0, 8, 34, 0, 16, 0, 3, 0, 0, 0, - 58, 0, 16, 128, 65, 0, 0, 0, 2, 0, 0, 0, 26, 0, 16, - 0, 3, 0, 0, 0, 14, 0, 0, 7, 226, 0, 16, 0, 3, 0, - 0, 0, 6, 9, 16, 0, 4, 0, 0, 0, 86, 5, 16, 0, 3, - 0, 0, 0, 0, 0, 0, 7, 226, 0, 16, 0, 3, 0, 0, 0, - 246, 15, 16, 0, 2, 0, 0, 0, 86, 14, 16, 0, 3, 0, 0, - 0, 55, 0, 0, 9, 114, 0, 16, 0, 2, 0, 0, 0, 6, 0, - 16, 0, 3, 0, 0, 0, 150, 7, 16, 0, 3, 0, 0, 0, 70, - 2, 16, 0, 1, 0, 0, 0, 21, 0, 0, 1, 21, 0, 0, 1, - 21, 0, 0, 1, 0, 0, 0, 8, 18, 0, 16, 0, 1, 0, 0, - 0, 58, 0, 16, 128, 65, 0, 0, 0, 1, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, 56, 0, 0, 7, 226, 0, 16, 0, 1, - 0, 0, 0, 246, 15, 16, 0, 1, 0, 0, 0, 6, 9, 16, 0, - 2, 0, 0, 0, 50, 0, 0, 9, 114, 0, 16, 0, 0, 0, 0, - 0, 6, 0, 16, 0, 1, 0, 0, 0, 70, 2, 16, 0, 0, 0, - 0, 0, 150, 7, 16, 0, 1, 0, 0, 0, 56, 0, 0, 7, 114, - 32, 16, 0, 0, 0, 0, 0, 246, 15, 16, 0, 0, 0, 0, 0, - 70, 2, 16, 0, 0, 0, 0, 0, 54, 0, 0, 5, 130, 32, 16, - 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 62, 0, - 0, 1, 83, 84, 65, 84, 116, 0, 0, 0, 195, 0, 0, 0, 9, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 128, 0, 0, 0, - 3, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, - 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 82, 68, 69, 70, 100, 1, 0, 0, 1, - 0, 0, 0, 232, 0, 0, 0, 5, 0, 0, 0, 28, 0, 0, 0, - 0, 4, 255, 255, 0, 1, 0, 0, 48, 1, 0, 0, 188, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 197, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 209, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, - 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 12, - 0, 0, 0, 213, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, - 4, 0, 0, 0, 255, 255, 255, 255, 1, 0, 0, 0, 1, 0, 0, - 0, 12, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 115, 83, 97, 109, 112, 108, 101, 114, - 0, 115, 66, 99, 107, 83, 97, 109, 112, 108, 101, 114, 0, 116, 101, - 120, 0, 98, 99, 107, 116, 101, 120, 0, 36, 71, 108, 111, 98, 97, - 108, 115, 0, 171, 171, 171, 220, 0, 0, 0, 1, 0, 0, 0, 0, - 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 24, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, - 0, 32, 1, 0, 0, 0, 0, 0, 0, 98, 108, 101, 110, 100, 111, - 112, 0, 0, 0, 19, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, - 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, - 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, - 48, 46, 49, 54, 51, 56, 52, 0, 171, 171, 73, 83, 71, 78, 104, - 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, 92, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 12, 0, 0, 0, 83, 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, - 171, 171, 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, - 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, - 84, 97, 114, 103, 101, 116, 0, 171, 171, 176, 56, 0, 0, 0, 0, - 0, 0, 83, 97, 109, 112, 108, 101, 82, 97, 100, 105, 97, 108, 71, - 114, 97, 100, 105, 101, 110, 116, 0, 65, 80, 111, 115, 0, 44, 7, - 0, 0, 68, 88, 66, 67, 172, 27, 205, 113, 176, 254, 27, 44, 22, - 107, 179, 112, 127, 38, 148, 161, 1, 0, 0, 0, 44, 7, 0, 0, - 6, 0, 0, 0, 56, 0, 0, 0, 148, 1, 0, 0, 104, 3, 0, - 0, 228, 3, 0, 0, 136, 6, 0, 0, 188, 6, 0, 0, 65, 111, - 110, 57, 84, 1, 0, 0, 84, 1, 0, 0, 0, 2, 254, 255, 252, - 0, 0, 0, 88, 0, 0, 0, 4, 0, 36, 0, 0, 0, 84, 0, - 0, 0, 84, 0, 0, 0, 36, 0, 1, 0, 84, 0, 0, 0, 0, - 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 3, 0, 0, - 0, 0, 0, 1, 0, 3, 0, 1, 0, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 254, 255, 81, 0, 0, 5, 6, 0, 15, - 160, 0, 0, 128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, - 0, 0, 31, 0, 0, 2, 5, 0, 0, 128, 0, 0, 15, 144, 4, - 0, 0, 4, 0, 0, 3, 224, 0, 0, 228, 144, 2, 0, 238, 160, - 2, 0, 228, 160, 4, 0, 0, 4, 0, 0, 3, 128, 0, 0, 228, - 144, 1, 0, 238, 160, 1, 0, 228, 160, 2, 0, 0, 3, 0, 0, - 4, 128, 0, 0, 0, 128, 6, 0, 0, 160, 5, 0, 0, 3, 0, - 0, 4, 128, 0, 0, 170, 128, 5, 0, 0, 160, 5, 0, 0, 3, - 1, 0, 1, 128, 0, 0, 170, 128, 6, 0, 85, 160, 2, 0, 0, - 3, 0, 0, 4, 128, 0, 0, 85, 129, 6, 0, 0, 160, 2, 0, - 0, 3, 0, 0, 3, 192, 0, 0, 228, 128, 0, 0, 228, 160, 5, - 0, 0, 3, 0, 0, 1, 128, 0, 0, 170, 128, 5, 0, 85, 160, - 5, 0, 0, 3, 1, 0, 2, 128, 0, 0, 0, 128, 6, 0, 85, - 160, 1, 0, 0, 2, 1, 0, 4, 128, 6, 0, 0, 160, 8, 0, - 0, 3, 0, 0, 8, 224, 1, 0, 228, 128, 3, 0, 228, 160, 8, - 0, 0, 3, 0, 0, 4, 224, 1, 0, 228, 128, 4, 0, 228, 160, - 1, 0, 0, 2, 0, 0, 12, 192, 6, 0, 36, 160, 255, 255, 0, - 0, 83, 72, 68, 82, 204, 1, 0, 0, 64, 0, 1, 0, 115, 0, - 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 1, 0, 0, 0, - 4, 0, 0, 0, 95, 0, 0, 3, 50, 16, 16, 0, 0, 0, 0, - 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 101, 0, 0, 3, 50, 32, 16, 0, 1, 0, 0, 0, 101, - 0, 0, 3, 194, 32, 16, 0, 1, 0, 0, 0, 104, 0, 0, 2, - 2, 0, 0, 0, 54, 0, 0, 8, 194, 32, 16, 0, 0, 0, 0, - 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 63, 50, 0, 0, 11, 50, 0, 16, 0, 0, - 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 54, 0, 0, 5, 50, 32, 16, 0, 0, 0, - 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 7, 18, - 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 0, 0, 128, 63, 0, 0, 0, 8, 34, 0, 16, - 0, 0, 0, 0, 0, 26, 0, 16, 128, 65, 0, 0, 0, 0, 0, - 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 56, 0, 0, 8, 50, - 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, - 70, 128, 32, 0, 1, 0, 0, 0, 3, 0, 0, 0, 56, 0, 0, - 10, 50, 0, 16, 0, 1, 0, 0, 0, 70, 0, 16, 0, 0, 0, - 0, 0, 2, 64, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, - 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 5, 66, 0, 16, 0, - 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 16, 0, 0, - 8, 66, 32, 16, 0, 1, 0, 0, 0, 70, 2, 16, 0, 1, 0, - 0, 0, 70, 130, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16, - 0, 0, 8, 130, 32, 16, 0, 1, 0, 0, 0, 70, 2, 16, 0, - 1, 0, 0, 0, 70, 130, 32, 0, 1, 0, 0, 0, 1, 0, 0, - 0, 50, 0, 0, 11, 50, 32, 16, 0, 1, 0, 0, 0, 70, 16, - 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, 0, 0, 12, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, 69, 70, 156, 2, 0, - 0, 2, 0, 0, 0, 100, 0, 0, 0, 2, 0, 0, 0, 28, 0, - 0, 0, 0, 4, 254, 255, 0, 1, 0, 0, 103, 2, 0, 0, 92, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 99, 98, 48, 0, 99, 98, 50, 0, 92, 0, 0, 0, - 4, 0, 0, 0, 148, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 96, 0, 0, 0, 7, 0, 0, 0, 52, 1, - 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 16, 1, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 26, 1, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 2, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 40, 1, 0, 0, - 48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 81, 117, 97, 100, 68, 101, 115, 99, 0, 171, - 171, 171, 1, 0, 3, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 84, 101, 120, 67, 111, 111, 114, 100, 115, 0, 77, 97, - 115, 107, 84, 101, 120, 67, 111, 111, 114, 100, 115, 0, 84, 101, 120, - 116, 67, 111, 108, 111, 114, 0, 171, 171, 220, 1, 0, 0, 0, 0, - 0, 0, 44, 0, 0, 0, 2, 0, 0, 0, 244, 1, 0, 0, 0, - 0, 0, 0, 4, 2, 0, 0, 48, 0, 0, 0, 8, 0, 0, 0, - 2, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, 32, 2, 0, - 0, 64, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 40, 2, - 0, 0, 0, 0, 0, 0, 56, 2, 0, 0, 80, 0, 0, 0, 8, - 0, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, - 64, 2, 0, 0, 88, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, - 0, 68, 2, 0, 0, 0, 0, 0, 0, 84, 2, 0, 0, 92, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 68, 2, 0, 0, 0, - 0, 0, 0, 92, 2, 0, 0, 96, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 68, 2, 0, 0, 0, 0, 0, 0, 68, 101, 118, - 105, 99, 101, 83, 112, 97, 99, 101, 84, 111, 85, 115, 101, 114, 83, - 112, 97, 99, 101, 0, 171, 3, 0, 3, 0, 3, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 100, 105, 109, 101, 110, 115, 105, 111, - 110, 115, 0, 171, 1, 0, 3, 0, 1, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 100, 105, 102, 102, 0, 171, 171, 171, 1, 0, - 3, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, - 101, 110, 116, 101, 114, 49, 0, 65, 0, 171, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 97, 100, - 105, 117, 115, 49, 0, 115, 113, 95, 114, 97, 100, 105, 117, 115, 49, - 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, 171, 171, 171, 73, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 7, 3, 0, 0, 80, 79, 83, 73, 84, 73, 79, 78, 0, 171, 171, - 171, 79, 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, - 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, - 0, 3, 12, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, 3, 0, 0, 83, - 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 171, 171, 171, 174, 94, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 224, 9, - 0, 0, 68, 88, 66, 67, 76, 106, 34, 250, 169, 50, 124, 43, 130, - 255, 198, 178, 126, 127, 40, 188, 1, 0, 0, 0, 224, 9, 0, 0, - 6, 0, 0, 0, 56, 0, 0, 0, 128, 2, 0, 0, 88, 6, 0, - 0, 212, 6, 0, 0, 60, 9, 0, 0, 172, 9, 0, 0, 65, 111, - 110, 57, 64, 2, 0, 0, 64, 2, 0, 0, 0, 2, 255, 255, 8, - 2, 0, 0, 56, 0, 0, 0, 1, 0, 44, 0, 0, 0, 56, 0, - 0, 0, 56, 0, 2, 0, 36, 0, 0, 0, 56, 0, 0, 0, 0, - 0, 1, 1, 1, 0, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 255, 255, 81, 0, 0, 5, 3, 0, 15, 160, 0, - 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 81, 0, 0, 5, 4, 0, 15, 160, 0, 0, 128, 63, 0, 0, 128, - 191, 0, 0, 0, 0, 0, 0, 0, 128, 31, 0, 0, 2, 0, 0, - 0, 128, 0, 0, 15, 176, 31, 0, 0, 2, 0, 0, 0, 144, 0, - 8, 15, 160, 31, 0, 0, 2, 0, 0, 0, 144, 1, 8, 15, 160, - 2, 0, 0, 3, 0, 0, 3, 128, 0, 0, 235, 176, 1, 0, 228, - 161, 90, 0, 0, 4, 0, 0, 8, 128, 0, 0, 228, 128, 0, 0, - 228, 128, 2, 0, 0, 161, 5, 0, 0, 3, 0, 0, 8, 128, 0, - 0, 255, 128, 1, 0, 170, 160, 1, 0, 0, 2, 0, 0, 4, 128, - 1, 0, 255, 160, 8, 0, 0, 3, 0, 0, 1, 128, 0, 0, 228, - 128, 0, 0, 228, 160, 4, 0, 0, 4, 0, 0, 2, 128, 0, 0, - 0, 128, 0, 0, 0, 128, 0, 0, 255, 129, 35, 0, 0, 2, 0, - 0, 4, 128, 0, 0, 85, 128, 7, 0, 0, 2, 0, 0, 4, 128, - 0, 0, 170, 128, 6, 0, 0, 2, 1, 0, 1, 128, 0, 0, 170, - 128, 1, 0, 0, 2, 1, 0, 6, 128, 1, 0, 0, 129, 2, 0, - 0, 3, 0, 0, 13, 128, 0, 0, 0, 128, 1, 0, 148, 128, 6, - 0, 0, 2, 1, 0, 1, 128, 1, 0, 170, 160, 5, 0, 0, 3, - 0, 0, 13, 128, 0, 0, 228, 128, 1, 0, 0, 128, 1, 0, 0, - 2, 1, 0, 8, 128, 1, 0, 255, 160, 4, 0, 0, 4, 1, 0, - 7, 128, 0, 0, 248, 128, 0, 0, 170, 160, 1, 0, 255, 128, 88, - 0, 0, 4, 2, 0, 1, 128, 1, 0, 0, 128, 0, 0, 0, 128, - 0, 0, 255, 128, 88, 0, 0, 4, 0, 0, 13, 128, 1, 0, 148, - 128, 4, 0, 68, 160, 4, 0, 230, 160, 1, 0, 0, 2, 2, 0, - 2, 128, 3, 0, 0, 160, 66, 0, 0, 3, 1, 0, 15, 128, 0, - 0, 228, 176, 1, 8, 228, 160, 66, 0, 0, 3, 2, 0, 15, 128, - 2, 0, 228, 128, 0, 8, 228, 160, 5, 0, 0, 3, 2, 0, 7, - 128, 2, 0, 255, 128, 2, 0, 228, 128, 5, 0, 0, 3, 1, 0, - 15, 128, 1, 0, 255, 128, 2, 0, 228, 128, 2, 0, 0, 3, 0, - 0, 8, 128, 0, 0, 255, 128, 0, 0, 0, 128, 88, 0, 0, 4, - 0, 0, 1, 128, 0, 0, 255, 128, 0, 0, 0, 128, 0, 0, 170, - 128, 88, 0, 0, 4, 1, 0, 15, 128, 0, 0, 0, 129, 4, 0, - 170, 160, 1, 0, 228, 128, 88, 0, 0, 4, 0, 0, 15, 128, 0, - 0, 85, 128, 1, 0, 228, 128, 4, 0, 170, 160, 1, 0, 0, 2, - 0, 8, 15, 128, 0, 0, 228, 128, 255, 255, 0, 0, 83, 72, 68, - 82, 208, 3, 0, 0, 64, 0, 0, 0, 244, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 7, 0, 0, 0, 90, - 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, 0, 90, 0, 0, 3, - 0, 96, 16, 0, 1, 0, 0, 0, 88, 24, 0, 4, 0, 112, 16, - 0, 0, 0, 0, 0, 85, 85, 0, 0, 88, 24, 0, 4, 0, 112, - 16, 0, 1, 0, 0, 0, 85, 85, 0, 0, 98, 16, 0, 3, 50, - 16, 16, 0, 1, 0, 0, 0, 98, 16, 0, 3, 194, 16, 16, 0, - 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, 0, 0, 0, 0, - 0, 104, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 9, 50, 0, - 16, 0, 0, 0, 0, 0, 230, 26, 16, 0, 1, 0, 0, 0, 70, - 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, - 54, 0, 0, 6, 66, 0, 16, 0, 0, 0, 0, 0, 58, 128, 32, - 0, 0, 0, 0, 0, 5, 0, 0, 0, 16, 0, 0, 8, 66, 0, - 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 70, - 130, 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, 15, 0, 0, 7, - 18, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, - 0, 70, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 9, 18, 0, - 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 10, - 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, - 56, 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, - 0, 0, 0, 0, 0, 42, 128, 32, 0, 0, 0, 0, 0, 5, 0, - 0, 0, 50, 0, 0, 10, 18, 0, 16, 0, 0, 0, 0, 0, 42, - 0, 16, 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, - 7, 34, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 75, 0, 0, 6, 18, - 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 128, 129, 0, 0, 0, - 0, 0, 0, 0, 54, 0, 0, 6, 34, 0, 16, 0, 1, 0, 0, - 0, 10, 0, 16, 128, 65, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 7, 82, 0, 16, 0, 0, 0, 0, 0, 166, 10, 16, 0, 0, - 0, 0, 0, 6, 1, 16, 0, 1, 0, 0, 0, 14, 0, 0, 8, - 82, 0, 16, 0, 0, 0, 0, 0, 6, 2, 16, 0, 0, 0, 0, - 0, 166, 138, 32, 0, 0, 0, 0, 0, 5, 0, 0, 0, 56, 0, - 0, 8, 50, 0, 16, 0, 1, 0, 0, 0, 134, 0, 16, 0, 0, - 0, 0, 0, 166, 138, 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 29, 0, 0, 9, 50, 0, 16, 0, 1, 0, 0, 0, 70, 0, 16, - 0, 1, 0, 0, 0, 246, 143, 32, 128, 65, 0, 0, 0, 0, 0, - 0, 0, 5, 0, 0, 0, 1, 0, 0, 10, 50, 0, 16, 0, 1, - 0, 0, 0, 70, 0, 16, 0, 1, 0, 0, 0, 2, 64, 0, 0, - 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, 0, 42, 0, - 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, - 0, 0, 0, 50, 0, 0, 9, 18, 0, 16, 0, 2, 0, 0, 0, - 10, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, - 0, 42, 0, 16, 0, 0, 0, 0, 0, 54, 0, 0, 5, 34, 0, - 16, 0, 2, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 63, 69, - 0, 0, 9, 242, 0, 16, 0, 2, 0, 0, 0, 70, 0, 16, 0, - 2, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, - 0, 0, 0, 0, 0, 31, 0, 4, 3, 26, 0, 16, 0, 0, 0, - 0, 0, 54, 0, 0, 8, 242, 32, 16, 0, 0, 0, 0, 0, 2, - 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 0, 0, 1, 21, 0, 0, 1, 52, 0, 0, - 7, 18, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 0, 1, 0, - 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 29, 0, 0, 7, 18, - 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 31, 0, 4, 3, 10, 0, 16, - 0, 0, 0, 0, 0, 54, 0, 0, 8, 242, 32, 16, 0, 0, 0, - 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 1, 21, 0, 0, 1, - 56, 0, 0, 7, 114, 0, 16, 0, 2, 0, 0, 0, 246, 15, 16, - 0, 2, 0, 0, 0, 70, 2, 16, 0, 2, 0, 0, 0, 69, 0, - 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 1, - 0, 0, 0, 70, 126, 16, 0, 1, 0, 0, 0, 0, 96, 16, 0, - 1, 0, 0, 0, 56, 0, 0, 7, 242, 32, 16, 0, 0, 0, 0, - 0, 246, 15, 16, 0, 0, 0, 0, 0, 70, 14, 16, 0, 2, 0, - 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, 0, 0, 33, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, 69, 70, 96, - 2, 0, 0, 1, 0, 0, 0, 224, 0, 0, 0, 5, 0, 0, 0, - 28, 0, 0, 0, 0, 4, 255, 255, 0, 1, 0, 0, 43, 2, 0, - 0, 188, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 197, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 210, 0, 0, 0, 2, 0, 0, 0, 5, 0, - 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 1, - 0, 0, 0, 12, 0, 0, 0, 214, 0, 0, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 1, 0, 0, - 0, 1, 0, 0, 0, 12, 0, 0, 0, 219, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 115, 83, 97, 109, - 112, 108, 101, 114, 0, 115, 77, 97, 115, 107, 83, 97, 109, 112, 108, - 101, 114, 0, 116, 101, 120, 0, 109, 97, 115, 107, 0, 99, 98, 50, - 0, 171, 219, 0, 0, 0, 7, 0, 0, 0, 248, 0, 0, 0, 112, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 1, 0, 0, - 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 184, 1, 0, - 0, 0, 0, 0, 0, 200, 1, 0, 0, 48, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, 212, 1, 0, 0, 0, 0, 0, 0, 228, - 1, 0, 0, 64, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, - 236, 1, 0, 0, 0, 0, 0, 0, 252, 1, 0, 0, 80, 0, 0, - 0, 8, 0, 0, 0, 2, 0, 0, 0, 212, 1, 0, 0, 0, 0, - 0, 0, 4, 2, 0, 0, 88, 0, 0, 0, 4, 0, 0, 0, 2, - 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 24, 2, 0, 0, - 92, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 8, 2, 0, - 0, 0, 0, 0, 0, 32, 2, 0, 0, 96, 0, 0, 0, 4, 0, - 0, 0, 2, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 68, - 101, 118, 105, 99, 101, 83, 112, 97, 99, 101, 84, 111, 85, 115, 101, - 114, 83, 112, 97, 99, 101, 0, 171, 3, 0, 3, 0, 3, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, 109, 101, 110, 115, - 105, 111, 110, 115, 0, 171, 1, 0, 3, 0, 1, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 100, 105, 102, 102, 0, 171, 171, 171, - 1, 0, 3, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 99, 101, 110, 116, 101, 114, 49, 0, 65, 0, 171, 171, 0, 0, - 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, - 97, 100, 105, 117, 115, 49, 0, 115, 113, 95, 114, 97, 100, 105, 117, - 115, 49, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, - 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, - 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, - 48, 46, 49, 54, 51, 56, 52, 0, 171, 171, 171, 73, 83, 71, 78, - 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, - 92, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 12, 12, 0, 0, 83, 86, 95, 80, 111, 115, - 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, - 171, 171, 171, 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, - 95, 84, 97, 114, 103, 101, 116, 0, 171, 171, 242, 101, 0, 0, 0, - 0, 0, 0, 65, 48, 0, 44, 7, 0, 0, 68, 88, 66, 67, 172, - 27, 205, 113, 176, 254, 27, 44, 22, 107, 179, 112, 127, 38, 148, 161, - 1, 0, 0, 0, 44, 7, 0, 0, 6, 0, 0, 0, 56, 0, 0, - 0, 148, 1, 0, 0, 104, 3, 0, 0, 228, 3, 0, 0, 136, 6, - 0, 0, 188, 6, 0, 0, 65, 111, 110, 57, 84, 1, 0, 0, 84, - 1, 0, 0, 0, 2, 254, 255, 252, 0, 0, 0, 88, 0, 0, 0, - 4, 0, 36, 0, 0, 0, 84, 0, 0, 0, 84, 0, 0, 0, 36, - 0, 1, 0, 84, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 1, 0, 3, 0, - 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 254, - 255, 81, 0, 0, 5, 6, 0, 15, 160, 0, 0, 128, 63, 0, 0, - 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 2, 5, - 0, 0, 128, 0, 0, 15, 144, 4, 0, 0, 4, 0, 0, 3, 224, - 0, 0, 228, 144, 2, 0, 238, 160, 2, 0, 228, 160, 4, 0, 0, - 4, 0, 0, 3, 128, 0, 0, 228, 144, 1, 0, 238, 160, 1, 0, - 228, 160, 2, 0, 0, 3, 0, 0, 4, 128, 0, 0, 0, 128, 6, - 0, 0, 160, 5, 0, 0, 3, 0, 0, 4, 128, 0, 0, 170, 128, - 5, 0, 0, 160, 5, 0, 0, 3, 1, 0, 1, 128, 0, 0, 170, - 128, 6, 0, 85, 160, 2, 0, 0, 3, 0, 0, 4, 128, 0, 0, - 85, 129, 6, 0, 0, 160, 2, 0, 0, 3, 0, 0, 3, 192, 0, - 0, 228, 128, 0, 0, 228, 160, 5, 0, 0, 3, 0, 0, 1, 128, - 0, 0, 170, 128, 5, 0, 85, 160, 5, 0, 0, 3, 1, 0, 2, - 128, 0, 0, 0, 128, 6, 0, 85, 160, 1, 0, 0, 2, 1, 0, - 4, 128, 6, 0, 0, 160, 8, 0, 0, 3, 0, 0, 8, 224, 1, - 0, 228, 128, 3, 0, 228, 160, 8, 0, 0, 3, 0, 0, 4, 224, - 1, 0, 228, 128, 4, 0, 228, 160, 1, 0, 0, 2, 0, 0, 12, - 192, 6, 0, 36, 160, 255, 255, 0, 0, 83, 72, 68, 82, 204, 1, - 0, 0, 64, 0, 1, 0, 115, 0, 0, 0, 89, 0, 0, 4, 70, - 142, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, 89, 0, 0, 4, - 70, 142, 32, 0, 1, 0, 0, 0, 4, 0, 0, 0, 95, 0, 0, - 3, 50, 16, 16, 0, 0, 0, 0, 0, 103, 0, 0, 4, 242, 32, - 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 101, 0, 0, 3, 50, - 32, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 194, 32, 16, 0, - 1, 0, 0, 0, 104, 0, 0, 2, 2, 0, 0, 0, 54, 0, 0, - 8, 194, 32, 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 63, 50, - 0, 0, 11, 50, 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, - 0, 0, 0, 0, 230, 138, 32, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 70, 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, - 0, 5, 50, 32, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, - 63, 0, 0, 0, 8, 34, 0, 16, 0, 0, 0, 0, 0, 26, 0, - 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, - 0, 128, 63, 56, 0, 0, 8, 50, 0, 16, 0, 0, 0, 0, 0, - 70, 0, 16, 0, 0, 0, 0, 0, 70, 128, 32, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 56, 0, 0, 10, 50, 0, 16, 0, 1, 0, - 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, - 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 66, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, - 0, 0, 0, 128, 63, 16, 0, 0, 8, 66, 32, 16, 0, 1, 0, - 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 70, 130, 32, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 130, 32, 16, 0, - 1, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 70, 130, 32, - 0, 1, 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 11, 50, 32, - 16, 0, 1, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, - 138, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, - 84, 116, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 82, 68, 69, 70, 156, 2, 0, 0, 2, 0, 0, 0, 100, 0, - 0, 0, 2, 0, 0, 0, 28, 0, 0, 0, 0, 4, 254, 255, 0, - 1, 0, 0, 103, 2, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 99, 98, 48, 0, - 99, 98, 50, 0, 92, 0, 0, 0, 4, 0, 0, 0, 148, 0, 0, - 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, - 0, 0, 7, 0, 0, 0, 52, 1, 0, 0, 112, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 16, 1, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 26, 1, 0, 0, 32, - 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 40, 1, 0, 0, 48, 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 81, 117, - 97, 100, 68, 101, 115, 99, 0, 171, 171, 171, 1, 0, 3, 0, 1, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 101, 120, 67, - 111, 111, 114, 100, 115, 0, 77, 97, 115, 107, 84, 101, 120, 67, 111, - 111, 114, 100, 115, 0, 84, 101, 120, 116, 67, 111, 108, 111, 114, 0, - 171, 171, 220, 1, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 2, - 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, - 48, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 16, 2, 0, - 0, 0, 0, 0, 0, 32, 2, 0, 0, 64, 0, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, 40, 2, 0, 0, 0, 0, 0, 0, 56, - 2, 0, 0, 80, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 16, 2, 0, 0, 0, 0, 0, 0, 64, 2, 0, 0, 88, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 68, 2, 0, 0, 0, 0, - 0, 0, 84, 2, 0, 0, 92, 0, 0, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 68, 2, 0, 0, 0, 0, 0, 0, 92, 2, 0, 0, - 96, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 68, 2, 0, - 0, 0, 0, 0, 0, 68, 101, 118, 105, 99, 101, 83, 112, 97, 99, - 101, 84, 111, 85, 115, 101, 114, 83, 112, 97, 99, 101, 0, 171, 3, - 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 100, 105, 109, 101, 110, 115, 105, 111, 110, 115, 0, 171, 1, 0, 3, - 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, - 102, 102, 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 99, 101, 110, 116, 101, 114, 49, 0, - 65, 0, 171, 171, 0, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 114, 97, 100, 105, 117, 115, 49, 0, 115, 113, - 95, 114, 97, 100, 105, 117, 115, 49, 0, 77, 105, 99, 114, 111, 115, - 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, - 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, - 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 171, - 171, 171, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, - 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 7, 3, 0, 0, 80, 79, 83, - 73, 84, 73, 79, 78, 0, 171, 171, 171, 79, 83, 71, 78, 104, 0, - 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 12, 0, 0, 92, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, - 0, 0, 0, 12, 3, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, - 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, - 171, 225, 111, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 192, 7, 0, 0, 68, 88, 66, 67, 73, - 174, 125, 52, 147, 212, 172, 159, 223, 39, 1, 144, 137, 10, 201, 206, - 1, 0, 0, 0, 192, 7, 0, 0, 6, 0, 0, 0, 56, 0, 0, - 0, 196, 1, 0, 0, 56, 4, 0, 0, 180, 4, 0, 0, 28, 7, - 0, 0, 140, 7, 0, 0, 65, 111, 110, 57, 132, 1, 0, 0, 132, - 1, 0, 0, 0, 2, 255, 255, 76, 1, 0, 0, 56, 0, 0, 0, - 1, 0, 44, 0, 0, 0, 56, 0, 0, 0, 56, 0, 2, 0, 36, - 0, 0, 0, 56, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, - 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 2, 255, 255, 81, - 0, 0, 5, 2, 0, 15, 160, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 2, 0, 0, 0, - 128, 0, 0, 15, 176, 31, 0, 0, 2, 0, 0, 0, 144, 0, 8, - 15, 160, 31, 0, 0, 2, 0, 0, 0, 144, 1, 8, 15, 160, 5, - 0, 0, 3, 0, 0, 8, 128, 1, 0, 255, 160, 1, 0, 255, 160, - 2, 0, 0, 3, 0, 0, 3, 128, 0, 0, 235, 176, 1, 0, 228, - 161, 90, 0, 0, 4, 0, 0, 8, 128, 0, 0, 228, 128, 0, 0, - 228, 128, 0, 0, 255, 129, 5, 0, 0, 3, 0, 0, 8, 128, 0, - 0, 255, 128, 2, 0, 0, 160, 1, 0, 0, 2, 0, 0, 4, 128, - 1, 0, 255, 160, 8, 0, 0, 3, 0, 0, 1, 128, 0, 0, 228, - 128, 0, 0, 228, 160, 6, 0, 0, 2, 0, 0, 1, 128, 0, 0, - 0, 128, 5, 0, 0, 3, 0, 0, 1, 128, 0, 0, 0, 128, 0, - 0, 255, 128, 1, 0, 0, 2, 0, 0, 2, 128, 2, 0, 0, 160, - 66, 0, 0, 3, 1, 0, 15, 128, 0, 0, 228, 176, 1, 8, 228, - 160, 66, 0, 0, 3, 2, 0, 15, 128, 0, 0, 228, 128, 0, 8, - 228, 160, 1, 0, 0, 2, 0, 0, 8, 128, 1, 0, 255, 160, 4, - 0, 0, 4, 0, 0, 1, 128, 0, 0, 0, 128, 0, 0, 170, 161, - 0, 0, 255, 129, 5, 0, 0, 3, 2, 0, 7, 128, 2, 0, 255, - 128, 2, 0, 228, 128, 5, 0, 0, 3, 1, 0, 15, 128, 1, 0, - 255, 128, 2, 0, 228, 128, 88, 0, 0, 4, 0, 0, 15, 128, 0, - 0, 0, 128, 2, 0, 85, 160, 1, 0, 228, 128, 1, 0, 0, 2, - 0, 8, 15, 128, 0, 0, 228, 128, 255, 255, 0, 0, 83, 72, 68, - 82, 108, 2, 0, 0, 64, 0, 0, 0, 155, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 6, 0, 0, 0, 90, - 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, 0, 90, 0, 0, 3, - 0, 96, 16, 0, 1, 0, 0, 0, 88, 24, 0, 4, 0, 112, 16, - 0, 0, 0, 0, 0, 85, 85, 0, 0, 88, 24, 0, 4, 0, 112, - 16, 0, 1, 0, 0, 0, 85, 85, 0, 0, 98, 16, 0, 3, 50, - 16, 16, 0, 1, 0, 0, 0, 98, 16, 0, 3, 194, 16, 16, 0, - 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, 0, 0, 0, 0, - 0, 104, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 9, 50, 0, - 16, 0, 0, 0, 0, 0, 230, 26, 16, 0, 1, 0, 0, 0, 70, - 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, - 54, 0, 0, 6, 66, 0, 16, 0, 0, 0, 0, 0, 58, 128, 32, - 0, 0, 0, 0, 0, 5, 0, 0, 0, 16, 0, 0, 8, 66, 0, - 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 70, - 130, 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, 15, 0, 0, 7, - 18, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, - 0, 70, 0, 16, 0, 0, 0, 0, 0, 50, 0, 0, 12, 18, 0, - 16, 0, 0, 0, 0, 0, 58, 128, 32, 128, 65, 0, 0, 0, 0, - 0, 0, 0, 5, 0, 0, 0, 58, 128, 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 56, 0, 0, - 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, 0, 0, 0, 63, 14, 0, 0, 7, 18, - 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, 0, 0, 56, 0, 0, 8, 66, 0, 16, - 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 42, 128, - 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, 29, 0, 0, 9, 66, - 0, 16, 0, 0, 0, 0, 0, 58, 128, 32, 128, 65, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, - 0, 54, 0, 0, 5, 34, 0, 16, 0, 0, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 63, 69, 0, 0, 9, 242, 0, 16, 0, 1, - 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 70, 126, 16, 0, - 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 31, 0, 4, - 3, 42, 0, 16, 0, 0, 0, 0, 0, 54, 0, 0, 8, 242, 32, - 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 1, - 21, 0, 0, 1, 56, 0, 0, 7, 114, 0, 16, 0, 1, 0, 0, - 0, 246, 15, 16, 0, 1, 0, 0, 0, 70, 2, 16, 0, 1, 0, - 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, 70, - 16, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 1, 0, 0, 0, - 0, 96, 16, 0, 1, 0, 0, 0, 56, 0, 0, 7, 242, 32, 16, - 0, 0, 0, 0, 0, 246, 15, 16, 0, 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, - 0, 0, 0, 19, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, - 68, 69, 70, 96, 2, 0, 0, 1, 0, 0, 0, 224, 0, 0, 0, - 5, 0, 0, 0, 28, 0, 0, 0, 0, 4, 255, 255, 0, 1, 0, - 0, 43, 2, 0, 0, 188, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 210, 0, 0, 0, 2, 0, - 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, - 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 214, 0, 0, 0, - 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, - 255, 1, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 219, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 115, 83, 97, 109, 112, 108, 101, 114, 0, 115, 77, 97, 115, 107, 83, - 97, 109, 112, 108, 101, 114, 0, 116, 101, 120, 0, 109, 97, 115, 107, - 0, 99, 98, 50, 0, 171, 219, 0, 0, 0, 7, 0, 0, 0, 248, - 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 160, 1, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, - 0, 184, 1, 0, 0, 0, 0, 0, 0, 200, 1, 0, 0, 48, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 212, 1, 0, 0, 0, - 0, 0, 0, 228, 1, 0, 0, 64, 0, 0, 0, 12, 0, 0, 0, - 2, 0, 0, 0, 236, 1, 0, 0, 0, 0, 0, 0, 252, 1, 0, - 0, 80, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 212, 1, - 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 88, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, - 24, 2, 0, 0, 92, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, - 0, 8, 2, 0, 0, 0, 0, 0, 0, 32, 2, 0, 0, 96, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, - 0, 0, 0, 68, 101, 118, 105, 99, 101, 83, 112, 97, 99, 101, 84, - 111, 85, 115, 101, 114, 83, 112, 97, 99, 101, 0, 171, 3, 0, 3, - 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, - 109, 101, 110, 115, 105, 111, 110, 115, 0, 171, 1, 0, 3, 0, 1, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, 102, 102, - 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 99, 101, 110, 116, 101, 114, 49, 0, 65, 0, - 171, 171, 0, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 114, 97, 100, 105, 117, 115, 49, 0, 115, 113, 95, 114, - 97, 100, 105, 117, 115, 49, 0, 77, 105, 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, - 46, 57, 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 171, 171, 171, - 73, 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, - 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, - 3, 3, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, 12, 0, 0, 83, 86, - 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, 171, 79, 83, 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, - 0, 0, 83, 86, 95, 84, 97, 114, 103, 101, 116, 0, 171, 171, 37, - 119, 0, 0, 0, 0, 0, 0, 65, 80, 111, 115, 87, 114, 97, 112, - 0, 44, 7, 0, 0, 68, 88, 66, 67, 172, 27, 205, 113, 176, 254, - 27, 44, 22, 107, 179, 112, 127, 38, 148, 161, 1, 0, 0, 0, 44, - 7, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 148, 1, 0, 0, - 104, 3, 0, 0, 228, 3, 0, 0, 136, 6, 0, 0, 188, 6, 0, - 0, 65, 111, 110, 57, 84, 1, 0, 0, 84, 1, 0, 0, 0, 2, - 254, 255, 252, 0, 0, 0, 88, 0, 0, 0, 4, 0, 36, 0, 0, - 0, 84, 0, 0, 0, 84, 0, 0, 0, 36, 0, 1, 0, 84, 0, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, - 3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 1, 0, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 2, 254, 255, 81, 0, 0, 5, - 6, 0, 15, 160, 0, 0, 128, 63, 0, 0, 0, 63, 0, 0, 0, - 0, 0, 0, 0, 0, 31, 0, 0, 2, 5, 0, 0, 128, 0, 0, - 15, 144, 4, 0, 0, 4, 0, 0, 3, 224, 0, 0, 228, 144, 2, - 0, 238, 160, 2, 0, 228, 160, 4, 0, 0, 4, 0, 0, 3, 128, - 0, 0, 228, 144, 1, 0, 238, 160, 1, 0, 228, 160, 2, 0, 0, - 3, 0, 0, 4, 128, 0, 0, 0, 128, 6, 0, 0, 160, 5, 0, - 0, 3, 0, 0, 4, 128, 0, 0, 170, 128, 5, 0, 0, 160, 5, - 0, 0, 3, 1, 0, 1, 128, 0, 0, 170, 128, 6, 0, 85, 160, - 2, 0, 0, 3, 0, 0, 4, 128, 0, 0, 85, 129, 6, 0, 0, - 160, 2, 0, 0, 3, 0, 0, 3, 192, 0, 0, 228, 128, 0, 0, - 228, 160, 5, 0, 0, 3, 0, 0, 1, 128, 0, 0, 170, 128, 5, - 0, 85, 160, 5, 0, 0, 3, 1, 0, 2, 128, 0, 0, 0, 128, - 6, 0, 85, 160, 1, 0, 0, 2, 1, 0, 4, 128, 6, 0, 0, - 160, 8, 0, 0, 3, 0, 0, 8, 224, 1, 0, 228, 128, 3, 0, - 228, 160, 8, 0, 0, 3, 0, 0, 4, 224, 1, 0, 228, 128, 4, - 0, 228, 160, 1, 0, 0, 2, 0, 0, 12, 192, 6, 0, 36, 160, - 255, 255, 0, 0, 83, 72, 68, 82, 204, 1, 0, 0, 64, 0, 1, - 0, 115, 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 1, - 0, 0, 0, 4, 0, 0, 0, 95, 0, 0, 3, 50, 16, 16, 0, - 0, 0, 0, 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 101, 0, 0, 3, 50, 32, 16, 0, 1, 0, - 0, 0, 101, 0, 0, 3, 194, 32, 16, 0, 1, 0, 0, 0, 104, - 0, 0, 2, 2, 0, 0, 0, 54, 0, 0, 8, 194, 32, 16, 0, - 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 128, 63, 50, 0, 0, 11, 50, 0, - 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, - 138, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, 32, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 5, 50, 32, 16, - 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, - 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 0, 0, 0, 8, - 34, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 56, 0, - 0, 8, 50, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, - 0, 0, 0, 70, 128, 32, 0, 1, 0, 0, 0, 3, 0, 0, 0, - 56, 0, 0, 10, 50, 0, 16, 0, 1, 0, 0, 0, 70, 0, 16, - 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 63, 0, 0, - 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 5, 66, - 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, - 16, 0, 0, 8, 66, 32, 16, 0, 1, 0, 0, 0, 70, 2, 16, - 0, 1, 0, 0, 0, 70, 130, 32, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 8, 130, 32, 16, 0, 1, 0, 0, 0, 70, - 2, 16, 0, 1, 0, 0, 0, 70, 130, 32, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 50, 0, 0, 11, 50, 32, 16, 0, 1, 0, 0, - 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, 0, 0, - 12, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, - 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, 69, 70, - 156, 2, 0, 0, 2, 0, 0, 0, 100, 0, 0, 0, 2, 0, 0, - 0, 28, 0, 0, 0, 0, 4, 254, 255, 0, 1, 0, 0, 103, 2, - 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 99, 98, 48, 0, 99, 98, 50, 0, 92, - 0, 0, 0, 4, 0, 0, 0, 148, 0, 0, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 7, 0, 0, - 0, 52, 1, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 2, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 16, 1, 0, 0, - 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 26, 1, 0, 0, 32, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 40, - 1, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 81, 117, 97, 100, 68, 101, 115, - 99, 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 84, 101, 120, 67, 111, 111, 114, 100, 115, - 0, 77, 97, 115, 107, 84, 101, 120, 67, 111, 111, 114, 100, 115, 0, - 84, 101, 120, 116, 67, 111, 108, 111, 114, 0, 171, 171, 220, 1, 0, - 0, 0, 0, 0, 0, 44, 0, 0, 0, 2, 0, 0, 0, 244, 1, - 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 48, 0, 0, 0, 8, - 0, 0, 0, 2, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, - 32, 2, 0, 0, 64, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, - 0, 40, 2, 0, 0, 0, 0, 0, 0, 56, 2, 0, 0, 80, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, - 0, 0, 0, 64, 2, 0, 0, 88, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 68, 2, 0, 0, 0, 0, 0, 0, 84, 2, 0, - 0, 92, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 68, 2, - 0, 0, 0, 0, 0, 0, 92, 2, 0, 0, 96, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 68, 2, 0, 0, 0, 0, 0, 0, - 68, 101, 118, 105, 99, 101, 83, 112, 97, 99, 101, 84, 111, 85, 115, - 101, 114, 83, 112, 97, 99, 101, 0, 171, 3, 0, 3, 0, 3, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, 109, 101, 110, - 115, 105, 111, 110, 115, 0, 171, 1, 0, 3, 0, 1, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, 102, 102, 0, 171, 171, - 171, 1, 0, 3, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 99, 101, 110, 116, 101, 114, 49, 0, 65, 0, 171, 171, 0, - 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 114, 97, 100, 105, 117, 115, 49, 0, 115, 113, 95, 114, 97, 100, 105, - 117, 115, 49, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, - 48, 48, 46, 49, 54, 51, 56, 52, 0, 171, 171, 171, 73, 83, 71, - 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 7, 3, 0, 0, 80, 79, 83, 73, 84, 73, 79, 78, - 0, 171, 171, 171, 79, 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, - 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 3, 12, 0, 0, 92, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, 3, - 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, - 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 250, 126, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 228, 9, 0, 0, 68, 88, 66, 67, 193, 68, 83, 4, 120, 206, - 206, 65, 213, 56, 189, 186, 120, 85, 235, 59, 1, 0, 0, 0, 228, - 9, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 128, 2, 0, 0, - 88, 6, 0, 0, 212, 6, 0, 0, 64, 9, 0, 0, 176, 9, 0, - 0, 65, 111, 110, 57, 64, 2, 0, 0, 64, 2, 0, 0, 0, 2, - 255, 255, 8, 2, 0, 0, 56, 0, 0, 0, 1, 0, 44, 0, 0, - 0, 56, 0, 0, 0, 56, 0, 2, 0, 36, 0, 0, 0, 56, 0, - 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 4, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 255, 255, 81, 0, 0, 5, 3, 0, - 15, 160, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 81, 0, 0, 5, 4, 0, 15, 160, 0, 0, 128, 63, - 0, 0, 128, 191, 0, 0, 0, 0, 0, 0, 0, 128, 31, 0, 0, - 2, 0, 0, 0, 128, 0, 0, 15, 176, 31, 0, 0, 2, 0, 0, - 0, 144, 0, 8, 15, 160, 31, 0, 0, 2, 0, 0, 0, 144, 1, - 8, 15, 160, 2, 0, 0, 3, 0, 0, 3, 128, 0, 0, 235, 176, - 1, 0, 228, 161, 90, 0, 0, 4, 0, 0, 8, 128, 0, 0, 228, - 128, 0, 0, 228, 128, 2, 0, 0, 161, 5, 0, 0, 3, 0, 0, - 8, 128, 0, 0, 255, 128, 1, 0, 170, 160, 1, 0, 0, 2, 0, - 0, 4, 128, 1, 0, 255, 160, 8, 0, 0, 3, 0, 0, 1, 128, - 0, 0, 228, 128, 0, 0, 228, 160, 4, 0, 0, 4, 0, 0, 2, - 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 255, 129, 35, 0, - 0, 2, 0, 0, 4, 128, 0, 0, 85, 128, 7, 0, 0, 2, 0, - 0, 4, 128, 0, 0, 170, 128, 6, 0, 0, 2, 1, 0, 1, 128, - 0, 0, 170, 128, 1, 0, 0, 2, 1, 0, 6, 128, 1, 0, 0, - 129, 2, 0, 0, 3, 0, 0, 13, 128, 0, 0, 0, 128, 1, 0, - 148, 128, 6, 0, 0, 2, 1, 0, 1, 128, 1, 0, 170, 160, 5, - 0, 0, 3, 0, 0, 13, 128, 0, 0, 228, 128, 1, 0, 0, 128, - 1, 0, 0, 2, 1, 0, 8, 128, 1, 0, 255, 160, 4, 0, 0, - 4, 1, 0, 7, 128, 0, 0, 248, 128, 0, 0, 170, 160, 1, 0, - 255, 128, 88, 0, 0, 4, 2, 0, 1, 128, 1, 0, 0, 128, 0, - 0, 0, 128, 0, 0, 255, 128, 88, 0, 0, 4, 0, 0, 13, 128, - 1, 0, 148, 128, 4, 0, 68, 160, 4, 0, 230, 160, 1, 0, 0, - 2, 2, 0, 2, 128, 3, 0, 0, 160, 66, 0, 0, 3, 1, 0, - 15, 128, 0, 0, 228, 176, 1, 8, 228, 160, 66, 0, 0, 3, 2, - 0, 15, 128, 2, 0, 228, 128, 0, 8, 228, 160, 5, 0, 0, 3, - 2, 0, 7, 128, 2, 0, 255, 128, 2, 0, 228, 128, 5, 0, 0, - 3, 1, 0, 15, 128, 1, 0, 255, 128, 2, 0, 228, 128, 2, 0, - 0, 3, 0, 0, 8, 128, 0, 0, 255, 128, 0, 0, 0, 128, 88, - 0, 0, 4, 0, 0, 1, 128, 0, 0, 255, 128, 0, 0, 0, 128, - 0, 0, 170, 128, 88, 0, 0, 4, 1, 0, 15, 128, 0, 0, 0, - 129, 4, 0, 170, 160, 1, 0, 228, 128, 88, 0, 0, 4, 0, 0, - 15, 128, 0, 0, 85, 128, 1, 0, 228, 128, 4, 0, 170, 160, 1, - 0, 0, 2, 0, 8, 15, 128, 0, 0, 228, 128, 255, 255, 0, 0, - 83, 72, 68, 82, 208, 3, 0, 0, 64, 0, 0, 0, 244, 0, 0, - 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 7, 0, - 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, 0, 90, - 0, 0, 3, 0, 96, 16, 0, 1, 0, 0, 0, 88, 24, 0, 4, - 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, 0, 0, 88, 24, 0, - 4, 0, 112, 16, 0, 1, 0, 0, 0, 85, 85, 0, 0, 98, 16, - 0, 3, 50, 16, 16, 0, 1, 0, 0, 0, 98, 16, 0, 3, 194, - 16, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, 0, - 0, 0, 0, 0, 104, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, - 9, 50, 0, 16, 0, 0, 0, 0, 0, 230, 26, 16, 0, 1, 0, - 0, 0, 70, 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 5, - 0, 0, 0, 54, 0, 0, 6, 66, 0, 16, 0, 0, 0, 0, 0, - 58, 128, 32, 0, 0, 0, 0, 0, 5, 0, 0, 0, 16, 0, 0, - 8, 66, 0, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 0, 0, - 0, 0, 70, 130, 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, 15, - 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, - 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, - 0, 0, 10, 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 56, 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 42, 128, 32, 0, 0, 0, 0, - 0, 5, 0, 0, 0, 50, 0, 0, 10, 18, 0, 16, 0, 0, 0, - 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, - 0, 0, 0, 10, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, - 49, 0, 0, 7, 34, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, - 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 75, 0, - 0, 6, 18, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 128, 129, - 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 6, 34, 0, 16, 0, - 1, 0, 0, 0, 10, 0, 16, 128, 65, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 7, 82, 0, 16, 0, 0, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, 6, 1, 16, 0, 1, 0, 0, 0, 14, - 0, 0, 8, 82, 0, 16, 0, 0, 0, 0, 0, 6, 2, 16, 0, - 0, 0, 0, 0, 166, 138, 32, 0, 0, 0, 0, 0, 5, 0, 0, - 0, 56, 0, 0, 8, 50, 0, 16, 0, 1, 0, 0, 0, 134, 0, - 16, 0, 0, 0, 0, 0, 166, 138, 32, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 29, 0, 0, 9, 50, 0, 16, 0, 1, 0, 0, 0, - 70, 0, 16, 0, 1, 0, 0, 0, 246, 143, 32, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 10, 50, 0, - 16, 0, 1, 0, 0, 0, 70, 0, 16, 0, 1, 0, 0, 0, 2, - 64, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, - 0, 42, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, 50, 0, 0, 9, 18, 0, 16, 0, 2, - 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 54, 0, 0, - 5, 34, 0, 16, 0, 2, 0, 0, 0, 1, 64, 0, 0, 0, 0, - 0, 63, 69, 0, 0, 9, 242, 0, 16, 0, 2, 0, 0, 0, 70, - 0, 16, 0, 2, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, - 0, 96, 16, 0, 0, 0, 0, 0, 31, 0, 4, 3, 26, 0, 16, - 0, 0, 0, 0, 0, 54, 0, 0, 8, 242, 32, 16, 0, 0, 0, - 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 1, 21, 0, 0, 1, - 52, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, - 0, 1, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 29, 0, - 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, - 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 31, 0, 4, 3, - 10, 0, 16, 0, 0, 0, 0, 0, 54, 0, 0, 8, 242, 32, 16, - 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 1, 21, - 0, 0, 1, 56, 0, 0, 7, 114, 0, 16, 0, 2, 0, 0, 0, - 246, 15, 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 2, 0, 0, - 0, 69, 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, 70, 16, - 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 1, 0, 0, 0, 0, - 96, 16, 0, 1, 0, 0, 0, 56, 0, 0, 7, 242, 32, 16, 0, - 0, 0, 0, 0, 246, 15, 16, 0, 0, 0, 0, 0, 70, 14, 16, - 0, 2, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, - 0, 0, 33, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, - 69, 70, 100, 2, 0, 0, 1, 0, 0, 0, 228, 0, 0, 0, 5, - 0, 0, 0, 28, 0, 0, 0, 0, 4, 255, 255, 0, 1, 0, 0, - 47, 2, 0, 0, 188, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 201, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 214, 0, 0, 0, 2, 0, 0, - 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 218, 0, 0, 0, 2, - 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, - 1, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 223, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 115, - 87, 114, 97, 112, 83, 97, 109, 112, 108, 101, 114, 0, 115, 77, 97, - 115, 107, 83, 97, 109, 112, 108, 101, 114, 0, 116, 101, 120, 0, 109, - 97, 115, 107, 0, 99, 98, 50, 0, 171, 223, 0, 0, 0, 7, 0, - 0, 0, 252, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 164, 1, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, - 0, 0, 0, 0, 188, 1, 0, 0, 0, 0, 0, 0, 204, 1, 0, - 0, 48, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 216, 1, - 0, 0, 0, 0, 0, 0, 232, 1, 0, 0, 64, 0, 0, 0, 12, - 0, 0, 0, 2, 0, 0, 0, 240, 1, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 80, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, - 0, 216, 1, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 88, 0, - 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 12, 2, 0, 0, 0, - 0, 0, 0, 28, 2, 0, 0, 92, 0, 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 12, 2, 0, 0, 0, 0, 0, 0, 36, 2, 0, - 0, 96, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 12, 2, - 0, 0, 0, 0, 0, 0, 68, 101, 118, 105, 99, 101, 83, 112, 97, - 99, 101, 84, 111, 85, 115, 101, 114, 83, 112, 97, 99, 101, 0, 171, - 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 100, 105, 109, 101, 110, 115, 105, 111, 110, 115, 0, 171, 1, 0, - 3, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, - 105, 102, 102, 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 99, 101, 110, 116, 101, 114, 49, - 0, 65, 0, 171, 171, 0, 0, 3, 0, 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 114, 97, 100, 105, 117, 115, 49, 0, 115, - 113, 95, 114, 97, 100, 105, 117, 115, 49, 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, - 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, - 171, 171, 171, 73, 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, - 0, 0, 0, 3, 3, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, 12, 0, - 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, - 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 79, 83, 71, 78, 44, - 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 83, 86, 95, 84, 97, 114, 103, 101, 116, 0, - 171, 171, 62, 134, 0, 0, 0, 0, 0, 0, 65, 48, 87, 114, 97, - 112, 0, 44, 7, 0, 0, 68, 88, 66, 67, 172, 27, 205, 113, 176, - 254, 27, 44, 22, 107, 179, 112, 127, 38, 148, 161, 1, 0, 0, 0, - 44, 7, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 148, 1, 0, - 0, 104, 3, 0, 0, 228, 3, 0, 0, 136, 6, 0, 0, 188, 6, - 0, 0, 65, 111, 110, 57, 84, 1, 0, 0, 84, 1, 0, 0, 0, - 2, 254, 255, 252, 0, 0, 0, 88, 0, 0, 0, 4, 0, 36, 0, - 0, 0, 84, 0, 0, 0, 84, 0, 0, 0, 36, 0, 1, 0, 84, - 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, - 0, 3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 1, 0, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 254, 255, 81, 0, 0, - 5, 6, 0, 15, 160, 0, 0, 128, 63, 0, 0, 0, 63, 0, 0, - 0, 0, 0, 0, 0, 0, 31, 0, 0, 2, 5, 0, 0, 128, 0, - 0, 15, 144, 4, 0, 0, 4, 0, 0, 3, 224, 0, 0, 228, 144, - 2, 0, 238, 160, 2, 0, 228, 160, 4, 0, 0, 4, 0, 0, 3, - 128, 0, 0, 228, 144, 1, 0, 238, 160, 1, 0, 228, 160, 2, 0, - 0, 3, 0, 0, 4, 128, 0, 0, 0, 128, 6, 0, 0, 160, 5, - 0, 0, 3, 0, 0, 4, 128, 0, 0, 170, 128, 5, 0, 0, 160, - 5, 0, 0, 3, 1, 0, 1, 128, 0, 0, 170, 128, 6, 0, 85, - 160, 2, 0, 0, 3, 0, 0, 4, 128, 0, 0, 85, 129, 6, 0, - 0, 160, 2, 0, 0, 3, 0, 0, 3, 192, 0, 0, 228, 128, 0, - 0, 228, 160, 5, 0, 0, 3, 0, 0, 1, 128, 0, 0, 170, 128, - 5, 0, 85, 160, 5, 0, 0, 3, 1, 0, 2, 128, 0, 0, 0, - 128, 6, 0, 85, 160, 1, 0, 0, 2, 1, 0, 4, 128, 6, 0, - 0, 160, 8, 0, 0, 3, 0, 0, 8, 224, 1, 0, 228, 128, 3, - 0, 228, 160, 8, 0, 0, 3, 0, 0, 4, 224, 1, 0, 228, 128, - 4, 0, 228, 160, 1, 0, 0, 2, 0, 0, 12, 192, 6, 0, 36, - 160, 255, 255, 0, 0, 83, 72, 68, 82, 204, 1, 0, 0, 64, 0, - 1, 0, 115, 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, - 1, 0, 0, 0, 4, 0, 0, 0, 95, 0, 0, 3, 50, 16, 16, - 0, 0, 0, 0, 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 101, 0, 0, 3, 50, 32, 16, 0, 1, - 0, 0, 0, 101, 0, 0, 3, 194, 32, 16, 0, 1, 0, 0, 0, - 104, 0, 0, 2, 2, 0, 0, 0, 54, 0, 0, 8, 194, 32, 16, - 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 128, 63, 50, 0, 0, 11, 50, - 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, - 230, 138, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, 32, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 5, 50, 32, - 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 0, 0, 0, - 8, 34, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 128, 65, 0, - 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 56, - 0, 0, 8, 50, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, - 0, 0, 0, 0, 70, 128, 32, 0, 1, 0, 0, 0, 3, 0, 0, - 0, 56, 0, 0, 10, 50, 0, 16, 0, 1, 0, 0, 0, 70, 0, - 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 63, 0, - 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 5, - 66, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, - 63, 16, 0, 0, 8, 66, 32, 16, 0, 1, 0, 0, 0, 70, 2, - 16, 0, 1, 0, 0, 0, 70, 130, 32, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 8, 130, 32, 16, 0, 1, 0, 0, 0, - 70, 2, 16, 0, 1, 0, 0, 0, 70, 130, 32, 0, 1, 0, 0, - 0, 1, 0, 0, 0, 50, 0, 0, 11, 50, 32, 16, 0, 1, 0, - 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, 0, - 0, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, 69, - 70, 156, 2, 0, 0, 2, 0, 0, 0, 100, 0, 0, 0, 2, 0, - 0, 0, 28, 0, 0, 0, 0, 4, 254, 255, 0, 1, 0, 0, 103, - 2, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 99, 98, 48, 0, 99, 98, 50, 0, - 92, 0, 0, 0, 4, 0, 0, 0, 148, 0, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 7, 0, - 0, 0, 52, 1, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 16, 1, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 26, 1, 0, 0, 32, 0, 0, 0, 16, - 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 40, 1, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 81, 117, 97, 100, 68, 101, - 115, 99, 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 84, 101, 120, 67, 111, 111, 114, 100, - 115, 0, 77, 97, 115, 107, 84, 101, 120, 67, 111, 111, 114, 100, 115, - 0, 84, 101, 120, 116, 67, 111, 108, 111, 114, 0, 171, 171, 220, 1, - 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 2, 0, 0, 0, 244, - 1, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 48, 0, 0, 0, - 8, 0, 0, 0, 2, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, - 0, 32, 2, 0, 0, 64, 0, 0, 0, 12, 0, 0, 0, 0, 0, - 0, 0, 40, 2, 0, 0, 0, 0, 0, 0, 56, 2, 0, 0, 80, - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, - 0, 0, 0, 0, 64, 2, 0, 0, 88, 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 68, 2, 0, 0, 0, 0, 0, 0, 84, 2, - 0, 0, 92, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 68, - 2, 0, 0, 0, 0, 0, 0, 92, 2, 0, 0, 96, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 68, 2, 0, 0, 0, 0, 0, - 0, 68, 101, 118, 105, 99, 101, 83, 112, 97, 99, 101, 84, 111, 85, - 115, 101, 114, 83, 112, 97, 99, 101, 0, 171, 3, 0, 3, 0, 3, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, 109, 101, - 110, 115, 105, 111, 110, 115, 0, 171, 1, 0, 3, 0, 1, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, 102, 102, 0, 171, - 171, 171, 1, 0, 3, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 99, 101, 110, 116, 101, 114, 49, 0, 65, 0, 171, 171, - 0, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 114, 97, 100, 105, 117, 115, 49, 0, 115, 113, 95, 114, 97, 100, - 105, 117, 115, 49, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, - 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 171, 171, 171, 73, 83, - 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 7, 3, 0, 0, 80, 79, 83, 73, 84, 73, 79, - 78, 0, 171, 171, 171, 79, 83, 71, 78, 104, 0, 0, 0, 3, 0, - 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 3, 12, 0, 0, 92, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, - 3, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, - 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 53, 144, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 196, 7, 0, 0, 68, 88, 66, 67, 223, 174, 80, 104, 241, - 52, 44, 173, 100, 134, 52, 219, 15, 210, 214, 245, 1, 0, 0, 0, - 196, 7, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 196, 1, 0, - 0, 56, 4, 0, 0, 180, 4, 0, 0, 32, 7, 0, 0, 144, 7, - 0, 0, 65, 111, 110, 57, 132, 1, 0, 0, 132, 1, 0, 0, 0, - 2, 255, 255, 76, 1, 0, 0, 56, 0, 0, 0, 1, 0, 44, 0, - 0, 0, 56, 0, 0, 0, 56, 0, 2, 0, 36, 0, 0, 0, 56, - 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 4, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 1, 2, 255, 255, 81, 0, 0, 5, 2, - 0, 15, 160, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 0, 0, 2, 0, 0, 0, 128, 0, 0, 15, - 176, 31, 0, 0, 2, 0, 0, 0, 144, 0, 8, 15, 160, 31, 0, - 0, 2, 0, 0, 0, 144, 1, 8, 15, 160, 5, 0, 0, 3, 0, - 0, 8, 128, 1, 0, 255, 160, 1, 0, 255, 160, 2, 0, 0, 3, - 0, 0, 3, 128, 0, 0, 235, 176, 1, 0, 228, 161, 90, 0, 0, - 4, 0, 0, 8, 128, 0, 0, 228, 128, 0, 0, 228, 128, 0, 0, - 255, 129, 5, 0, 0, 3, 0, 0, 8, 128, 0, 0, 255, 128, 2, - 0, 0, 160, 1, 0, 0, 2, 0, 0, 4, 128, 1, 0, 255, 160, - 8, 0, 0, 3, 0, 0, 1, 128, 0, 0, 228, 128, 0, 0, 228, - 160, 6, 0, 0, 2, 0, 0, 1, 128, 0, 0, 0, 128, 5, 0, - 0, 3, 0, 0, 1, 128, 0, 0, 0, 128, 0, 0, 255, 128, 1, - 0, 0, 2, 0, 0, 2, 128, 2, 0, 0, 160, 66, 0, 0, 3, - 1, 0, 15, 128, 0, 0, 228, 176, 1, 8, 228, 160, 66, 0, 0, - 3, 2, 0, 15, 128, 0, 0, 228, 128, 0, 8, 228, 160, 1, 0, - 0, 2, 0, 0, 8, 128, 1, 0, 255, 160, 4, 0, 0, 4, 0, - 0, 1, 128, 0, 0, 0, 128, 0, 0, 170, 161, 0, 0, 255, 129, - 5, 0, 0, 3, 2, 0, 7, 128, 2, 0, 255, 128, 2, 0, 228, - 128, 5, 0, 0, 3, 1, 0, 15, 128, 1, 0, 255, 128, 2, 0, - 228, 128, 88, 0, 0, 4, 0, 0, 15, 128, 0, 0, 0, 128, 2, - 0, 85, 160, 1, 0, 228, 128, 1, 0, 0, 2, 0, 8, 15, 128, - 0, 0, 228, 128, 255, 255, 0, 0, 83, 72, 68, 82, 108, 2, 0, - 0, 64, 0, 0, 0, 155, 0, 0, 0, 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, 6, 0, 0, 0, 90, 0, 0, 3, 0, - 96, 16, 0, 0, 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, - 1, 0, 0, 0, 88, 24, 0, 4, 0, 112, 16, 0, 0, 0, 0, - 0, 85, 85, 0, 0, 88, 24, 0, 4, 0, 112, 16, 0, 1, 0, - 0, 0, 85, 85, 0, 0, 98, 16, 0, 3, 50, 16, 16, 0, 1, - 0, 0, 0, 98, 16, 0, 3, 194, 16, 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 242, 32, 16, 0, 0, 0, 0, 0, 104, 0, 0, - 2, 2, 0, 0, 0, 0, 0, 0, 9, 50, 0, 16, 0, 0, 0, - 0, 0, 230, 26, 16, 0, 1, 0, 0, 0, 70, 128, 32, 128, 65, - 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 54, 0, 0, 6, - 66, 0, 16, 0, 0, 0, 0, 0, 58, 128, 32, 0, 0, 0, 0, - 0, 5, 0, 0, 0, 16, 0, 0, 8, 66, 0, 16, 0, 0, 0, - 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 70, 130, 32, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 15, 0, 0, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, - 0, 0, 0, 0, 0, 50, 0, 0, 12, 18, 0, 16, 0, 0, 0, - 0, 0, 58, 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 5, - 0, 0, 0, 58, 128, 32, 0, 0, 0, 0, 0, 5, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 56, 0, 0, 7, 18, 0, 16, - 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 63, 14, 0, 0, 7, 18, 0, 16, 0, 0, - 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 42, 0, 16, 0, - 0, 0, 0, 0, 56, 0, 0, 8, 66, 0, 16, 0, 0, 0, 0, - 0, 10, 0, 16, 0, 0, 0, 0, 0, 42, 128, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 29, 0, 0, 9, 66, 0, 16, 0, 0, - 0, 0, 0, 58, 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 54, 0, 0, - 5, 34, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, - 0, 63, 69, 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 70, - 0, 16, 0, 0, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, - 0, 96, 16, 0, 0, 0, 0, 0, 31, 0, 4, 3, 42, 0, 16, - 0, 0, 0, 0, 0, 54, 0, 0, 8, 242, 32, 16, 0, 0, 0, - 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 1, 21, 0, 0, 1, - 56, 0, 0, 7, 114, 0, 16, 0, 1, 0, 0, 0, 246, 15, 16, - 0, 1, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 69, 0, - 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 1, - 0, 0, 0, 70, 126, 16, 0, 1, 0, 0, 0, 0, 96, 16, 0, - 1, 0, 0, 0, 56, 0, 0, 7, 242, 32, 16, 0, 0, 0, 0, - 0, 246, 15, 16, 0, 0, 0, 0, 0, 70, 14, 16, 0, 1, 0, - 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, 0, 0, 19, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, 69, 70, 100, - 2, 0, 0, 1, 0, 0, 0, 228, 0, 0, 0, 5, 0, 0, 0, - 28, 0, 0, 0, 0, 4, 255, 255, 0, 1, 0, 0, 47, 2, 0, - 0, 188, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 201, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 214, 0, 0, 0, 2, 0, 0, 0, 5, 0, - 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 1, - 0, 0, 0, 12, 0, 0, 0, 218, 0, 0, 0, 2, 0, 0, 0, - 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 1, 0, 0, - 0, 1, 0, 0, 0, 12, 0, 0, 0, 223, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 115, 87, 114, 97, - 112, 83, 97, 109, 112, 108, 101, 114, 0, 115, 77, 97, 115, 107, 83, - 97, 109, 112, 108, 101, 114, 0, 116, 101, 120, 0, 109, 97, 115, 107, - 0, 99, 98, 50, 0, 171, 223, 0, 0, 0, 7, 0, 0, 0, 252, - 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 164, 1, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, - 0, 188, 1, 0, 0, 0, 0, 0, 0, 204, 1, 0, 0, 48, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 216, 1, 0, 0, 0, - 0, 0, 0, 232, 1, 0, 0, 64, 0, 0, 0, 12, 0, 0, 0, - 2, 0, 0, 0, 240, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 80, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 216, 1, - 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 88, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 12, 2, 0, 0, 0, 0, 0, 0, - 28, 2, 0, 0, 92, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, - 0, 12, 2, 0, 0, 0, 0, 0, 0, 36, 2, 0, 0, 96, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12, 2, 0, 0, 0, - 0, 0, 0, 68, 101, 118, 105, 99, 101, 83, 112, 97, 99, 101, 84, - 111, 85, 115, 101, 114, 83, 112, 97, 99, 101, 0, 171, 3, 0, 3, - 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, - 109, 101, 110, 115, 105, 111, 110, 115, 0, 171, 1, 0, 3, 0, 1, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, 102, 102, - 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 99, 101, 110, 116, 101, 114, 49, 0, 65, 0, - 171, 171, 0, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 114, 97, 100, 105, 117, 115, 49, 0, 115, 113, 95, 114, - 97, 100, 105, 117, 115, 49, 0, 77, 105, 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, - 46, 57, 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 171, 171, 171, - 73, 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, - 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, - 3, 3, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, 12, 0, 0, 83, 86, - 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, 171, 79, 83, 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, - 0, 0, 83, 86, 95, 84, 97, 114, 103, 101, 116, 0, 171, 171, 121, - 151, 0, 0, 0, 0, 0, 0, 65, 80, 111, 115, 77, 105, 114, 114, - 111, 114, 0, 44, 7, 0, 0, 68, 88, 66, 67, 172, 27, 205, 113, - 176, 254, 27, 44, 22, 107, 179, 112, 127, 38, 148, 161, 1, 0, 0, - 0, 44, 7, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 148, 1, - 0, 0, 104, 3, 0, 0, 228, 3, 0, 0, 136, 6, 0, 0, 188, - 6, 0, 0, 65, 111, 110, 57, 84, 1, 0, 0, 84, 1, 0, 0, - 0, 2, 254, 255, 252, 0, 0, 0, 88, 0, 0, 0, 4, 0, 36, - 0, 0, 0, 84, 0, 0, 0, 84, 0, 0, 0, 36, 0, 1, 0, - 84, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 2, 0, 3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 1, 0, 5, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 254, 255, 81, 0, - 0, 5, 6, 0, 15, 160, 0, 0, 128, 63, 0, 0, 0, 63, 0, - 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 2, 5, 0, 0, 128, - 0, 0, 15, 144, 4, 0, 0, 4, 0, 0, 3, 224, 0, 0, 228, - 144, 2, 0, 238, 160, 2, 0, 228, 160, 4, 0, 0, 4, 0, 0, - 3, 128, 0, 0, 228, 144, 1, 0, 238, 160, 1, 0, 228, 160, 2, - 0, 0, 3, 0, 0, 4, 128, 0, 0, 0, 128, 6, 0, 0, 160, - 5, 0, 0, 3, 0, 0, 4, 128, 0, 0, 170, 128, 5, 0, 0, - 160, 5, 0, 0, 3, 1, 0, 1, 128, 0, 0, 170, 128, 6, 0, - 85, 160, 2, 0, 0, 3, 0, 0, 4, 128, 0, 0, 85, 129, 6, - 0, 0, 160, 2, 0, 0, 3, 0, 0, 3, 192, 0, 0, 228, 128, - 0, 0, 228, 160, 5, 0, 0, 3, 0, 0, 1, 128, 0, 0, 170, - 128, 5, 0, 85, 160, 5, 0, 0, 3, 1, 0, 2, 128, 0, 0, - 0, 128, 6, 0, 85, 160, 1, 0, 0, 2, 1, 0, 4, 128, 6, - 0, 0, 160, 8, 0, 0, 3, 0, 0, 8, 224, 1, 0, 228, 128, - 3, 0, 228, 160, 8, 0, 0, 3, 0, 0, 4, 224, 1, 0, 228, - 128, 4, 0, 228, 160, 1, 0, 0, 2, 0, 0, 12, 192, 6, 0, - 36, 160, 255, 255, 0, 0, 83, 72, 68, 82, 204, 1, 0, 0, 64, - 0, 1, 0, 115, 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, - 0, 1, 0, 0, 0, 4, 0, 0, 0, 95, 0, 0, 3, 50, 16, - 16, 0, 0, 0, 0, 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 101, 0, 0, 3, 50, 32, 16, 0, - 1, 0, 0, 0, 101, 0, 0, 3, 194, 32, 16, 0, 1, 0, 0, - 0, 104, 0, 0, 2, 2, 0, 0, 0, 54, 0, 0, 8, 194, 32, - 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 63, 50, 0, 0, 11, - 50, 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 5, 50, - 32, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, - 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 0, 0, - 0, 8, 34, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 128, 65, - 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, - 56, 0, 0, 8, 50, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, - 0, 0, 0, 0, 0, 70, 128, 32, 0, 1, 0, 0, 0, 3, 0, - 0, 0, 56, 0, 0, 10, 50, 0, 16, 0, 1, 0, 0, 0, 70, - 0, 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, - 5, 66, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, - 128, 63, 16, 0, 0, 8, 66, 32, 16, 0, 1, 0, 0, 0, 70, - 2, 16, 0, 1, 0, 0, 0, 70, 130, 32, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 8, 130, 32, 16, 0, 1, 0, 0, - 0, 70, 2, 16, 0, 1, 0, 0, 0, 70, 130, 32, 0, 1, 0, - 0, 0, 1, 0, 0, 0, 50, 0, 0, 11, 50, 32, 16, 0, 1, - 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, - 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, - 69, 70, 156, 2, 0, 0, 2, 0, 0, 0, 100, 0, 0, 0, 2, - 0, 0, 0, 28, 0, 0, 0, 0, 4, 254, 255, 0, 1, 0, 0, - 103, 2, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 99, 98, 48, 0, 99, 98, 50, - 0, 92, 0, 0, 0, 4, 0, 0, 0, 148, 0, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 7, - 0, 0, 0, 52, 1, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 16, 1, - 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 26, 1, 0, 0, 32, 0, 0, 0, - 16, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 40, 1, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 81, 117, 97, 100, 68, - 101, 115, 99, 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84, 101, 120, 67, 111, 111, 114, - 100, 115, 0, 77, 97, 115, 107, 84, 101, 120, 67, 111, 111, 114, 100, - 115, 0, 84, 101, 120, 116, 67, 111, 108, 111, 114, 0, 171, 171, 220, - 1, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 2, 0, 0, 0, - 244, 1, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 48, 0, 0, - 0, 8, 0, 0, 0, 2, 0, 0, 0, 16, 2, 0, 0, 0, 0, - 0, 0, 32, 2, 0, 0, 64, 0, 0, 0, 12, 0, 0, 0, 0, - 0, 0, 0, 40, 2, 0, 0, 0, 0, 0, 0, 56, 2, 0, 0, - 80, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 16, 2, 0, - 0, 0, 0, 0, 0, 64, 2, 0, 0, 88, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 68, 2, 0, 0, 0, 0, 0, 0, 84, - 2, 0, 0, 92, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 68, 2, 0, 0, 0, 0, 0, 0, 92, 2, 0, 0, 96, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 68, 2, 0, 0, 0, 0, - 0, 0, 68, 101, 118, 105, 99, 101, 83, 112, 97, 99, 101, 84, 111, - 85, 115, 101, 114, 83, 112, 97, 99, 101, 0, 171, 3, 0, 3, 0, - 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, 109, - 101, 110, 115, 105, 111, 110, 115, 0, 171, 1, 0, 3, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, 102, 102, 0, - 171, 171, 171, 1, 0, 3, 0, 1, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 99, 101, 110, 116, 101, 114, 49, 0, 65, 0, 171, - 171, 0, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 114, 97, 100, 105, 117, 115, 49, 0, 115, 113, 95, 114, 97, - 100, 105, 117, 115, 49, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, - 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, - 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, - 57, 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 171, 171, 171, 73, - 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 7, 3, 0, 0, 80, 79, 83, 73, 84, 73, - 79, 78, 0, 171, 171, 171, 79, 83, 71, 78, 104, 0, 0, 0, 3, - 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, 3, 12, 0, 0, 92, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, - 12, 3, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, - 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 84, 159, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 232, 9, 0, 0, 68, 88, 66, 67, 48, 133, 157, 76, - 135, 209, 82, 153, 49, 138, 172, 57, 31, 63, 161, 231, 1, 0, 0, - 0, 232, 9, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 128, 2, - 0, 0, 88, 6, 0, 0, 212, 6, 0, 0, 68, 9, 0, 0, 180, - 9, 0, 0, 65, 111, 110, 57, 64, 2, 0, 0, 64, 2, 0, 0, - 0, 2, 255, 255, 8, 2, 0, 0, 56, 0, 0, 0, 1, 0, 44, - 0, 0, 0, 56, 0, 0, 0, 56, 0, 2, 0, 36, 0, 0, 0, - 56, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 4, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 1, 2, 255, 255, 81, 0, 0, 5, - 3, 0, 15, 160, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 81, 0, 0, 5, 4, 0, 15, 160, 0, 0, - 128, 63, 0, 0, 128, 191, 0, 0, 0, 0, 0, 0, 0, 128, 31, - 0, 0, 2, 0, 0, 0, 128, 0, 0, 15, 176, 31, 0, 0, 2, - 0, 0, 0, 144, 0, 8, 15, 160, 31, 0, 0, 2, 0, 0, 0, - 144, 1, 8, 15, 160, 2, 0, 0, 3, 0, 0, 3, 128, 0, 0, - 235, 176, 1, 0, 228, 161, 90, 0, 0, 4, 0, 0, 8, 128, 0, - 0, 228, 128, 0, 0, 228, 128, 2, 0, 0, 161, 5, 0, 0, 3, - 0, 0, 8, 128, 0, 0, 255, 128, 1, 0, 170, 160, 1, 0, 0, - 2, 0, 0, 4, 128, 1, 0, 255, 160, 8, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 228, 128, 0, 0, 228, 160, 4, 0, 0, 4, 0, - 0, 2, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 255, 129, - 35, 0, 0, 2, 0, 0, 4, 128, 0, 0, 85, 128, 7, 0, 0, - 2, 0, 0, 4, 128, 0, 0, 170, 128, 6, 0, 0, 2, 1, 0, - 1, 128, 0, 0, 170, 128, 1, 0, 0, 2, 1, 0, 6, 128, 1, - 0, 0, 129, 2, 0, 0, 3, 0, 0, 13, 128, 0, 0, 0, 128, - 1, 0, 148, 128, 6, 0, 0, 2, 1, 0, 1, 128, 1, 0, 170, - 160, 5, 0, 0, 3, 0, 0, 13, 128, 0, 0, 228, 128, 1, 0, - 0, 128, 1, 0, 0, 2, 1, 0, 8, 128, 1, 0, 255, 160, 4, - 0, 0, 4, 1, 0, 7, 128, 0, 0, 248, 128, 0, 0, 170, 160, - 1, 0, 255, 128, 88, 0, 0, 4, 2, 0, 1, 128, 1, 0, 0, - 128, 0, 0, 0, 128, 0, 0, 255, 128, 88, 0, 0, 4, 0, 0, - 13, 128, 1, 0, 148, 128, 4, 0, 68, 160, 4, 0, 230, 160, 1, - 0, 0, 2, 2, 0, 2, 128, 3, 0, 0, 160, 66, 0, 0, 3, - 1, 0, 15, 128, 0, 0, 228, 176, 1, 8, 228, 160, 66, 0, 0, - 3, 2, 0, 15, 128, 2, 0, 228, 128, 0, 8, 228, 160, 5, 0, - 0, 3, 2, 0, 7, 128, 2, 0, 255, 128, 2, 0, 228, 128, 5, - 0, 0, 3, 1, 0, 15, 128, 1, 0, 255, 128, 2, 0, 228, 128, - 2, 0, 0, 3, 0, 0, 8, 128, 0, 0, 255, 128, 0, 0, 0, - 128, 88, 0, 0, 4, 0, 0, 1, 128, 0, 0, 255, 128, 0, 0, - 0, 128, 0, 0, 170, 128, 88, 0, 0, 4, 1, 0, 15, 128, 0, - 0, 0, 129, 4, 0, 170, 160, 1, 0, 228, 128, 88, 0, 0, 4, - 0, 0, 15, 128, 0, 0, 85, 128, 1, 0, 228, 128, 4, 0, 170, - 160, 1, 0, 0, 2, 0, 8, 15, 128, 0, 0, 228, 128, 255, 255, - 0, 0, 83, 72, 68, 82, 208, 3, 0, 0, 64, 0, 0, 0, 244, - 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, - 0, 90, 0, 0, 3, 0, 96, 16, 0, 1, 0, 0, 0, 88, 24, - 0, 4, 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, 0, 0, 88, - 24, 0, 4, 0, 112, 16, 0, 1, 0, 0, 0, 85, 85, 0, 0, - 98, 16, 0, 3, 50, 16, 16, 0, 1, 0, 0, 0, 98, 16, 0, - 3, 194, 16, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, - 16, 0, 0, 0, 0, 0, 104, 0, 0, 2, 3, 0, 0, 0, 0, - 0, 0, 9, 50, 0, 16, 0, 0, 0, 0, 0, 230, 26, 16, 0, - 1, 0, 0, 0, 70, 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, - 0, 5, 0, 0, 0, 54, 0, 0, 6, 66, 0, 16, 0, 0, 0, - 0, 0, 58, 128, 32, 0, 0, 0, 0, 0, 5, 0, 0, 0, 16, - 0, 0, 8, 66, 0, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, - 0, 0, 0, 0, 70, 130, 32, 0, 0, 0, 0, 0, 4, 0, 0, - 0, 15, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 70, 0, - 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 10, 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 56, 0, 0, 8, 18, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 42, 128, 32, 0, 0, - 0, 0, 0, 5, 0, 0, 0, 50, 0, 0, 10, 18, 0, 16, 0, - 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 42, 0, 16, - 0, 0, 0, 0, 0, 10, 0, 16, 128, 65, 0, 0, 0, 0, 0, - 0, 0, 49, 0, 0, 7, 34, 0, 16, 0, 0, 0, 0, 0, 10, - 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, - 75, 0, 0, 6, 18, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, - 128, 129, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 6, 34, 0, - 16, 0, 1, 0, 0, 0, 10, 0, 16, 128, 65, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 7, 82, 0, 16, 0, 0, 0, 0, 0, - 166, 10, 16, 0, 0, 0, 0, 0, 6, 1, 16, 0, 1, 0, 0, - 0, 14, 0, 0, 8, 82, 0, 16, 0, 0, 0, 0, 0, 6, 2, - 16, 0, 0, 0, 0, 0, 166, 138, 32, 0, 0, 0, 0, 0, 5, - 0, 0, 0, 56, 0, 0, 8, 50, 0, 16, 0, 1, 0, 0, 0, - 134, 0, 16, 0, 0, 0, 0, 0, 166, 138, 32, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 29, 0, 0, 9, 50, 0, 16, 0, 1, 0, - 0, 0, 70, 0, 16, 0, 1, 0, 0, 0, 246, 143, 32, 128, 65, - 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 10, - 50, 0, 16, 0, 1, 0, 0, 0, 70, 0, 16, 0, 1, 0, 0, - 0, 2, 64, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 18, 0, 16, 0, 0, - 0, 0, 0, 42, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 50, 0, 0, 9, 18, 0, 16, - 0, 2, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 54, - 0, 0, 5, 34, 0, 16, 0, 2, 0, 0, 0, 1, 64, 0, 0, - 0, 0, 0, 63, 69, 0, 0, 9, 242, 0, 16, 0, 2, 0, 0, - 0, 70, 0, 16, 0, 2, 0, 0, 0, 70, 126, 16, 0, 0, 0, - 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 31, 0, 4, 3, 26, - 0, 16, 0, 0, 0, 0, 0, 54, 0, 0, 8, 242, 32, 16, 0, - 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 1, 21, 0, - 0, 1, 52, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 26, - 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, - 29, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, - 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 31, 0, - 4, 3, 10, 0, 16, 0, 0, 0, 0, 0, 54, 0, 0, 8, 242, - 32, 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, - 1, 21, 0, 0, 1, 56, 0, 0, 7, 114, 0, 16, 0, 2, 0, - 0, 0, 246, 15, 16, 0, 2, 0, 0, 0, 70, 2, 16, 0, 2, - 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, - 70, 16, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 1, 0, 0, - 0, 0, 96, 16, 0, 1, 0, 0, 0, 56, 0, 0, 7, 242, 32, - 16, 0, 0, 0, 0, 0, 246, 15, 16, 0, 0, 0, 0, 0, 70, - 14, 16, 0, 2, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, - 116, 0, 0, 0, 33, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 68, 69, 70, 104, 2, 0, 0, 1, 0, 0, 0, 232, 0, 0, - 0, 5, 0, 0, 0, 28, 0, 0, 0, 0, 4, 255, 255, 0, 1, - 0, 0, 51, 2, 0, 0, 188, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 2, - 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, - 0, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 220, 0, 0, - 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, - 255, 255, 1, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 225, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 115, 77, 105, 114, 114, 111, 114, 83, 97, 109, 112, 108, 101, 114, - 0, 115, 77, 97, 115, 107, 83, 97, 109, 112, 108, 101, 114, 0, 116, - 101, 120, 0, 109, 97, 115, 107, 0, 99, 98, 50, 0, 171, 171, 171, - 225, 0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 112, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 1, 0, 0, 0, 0, - 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 192, 1, 0, 0, 0, - 0, 0, 0, 208, 1, 0, 0, 48, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 220, 1, 0, 0, 0, 0, 0, 0, 236, 1, 0, - 0, 64, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 244, 1, - 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 80, 0, 0, 0, 8, - 0, 0, 0, 2, 0, 0, 0, 220, 1, 0, 0, 0, 0, 0, 0, - 12, 2, 0, 0, 88, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, - 0, 16, 2, 0, 0, 0, 0, 0, 0, 32, 2, 0, 0, 92, 0, - 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 16, 2, 0, 0, 0, - 0, 0, 0, 40, 2, 0, 0, 96, 0, 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, 68, 101, 118, - 105, 99, 101, 83, 112, 97, 99, 101, 84, 111, 85, 115, 101, 114, 83, - 112, 97, 99, 101, 0, 171, 3, 0, 3, 0, 3, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 100, 105, 109, 101, 110, 115, 105, 111, - 110, 115, 0, 171, 1, 0, 3, 0, 1, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 100, 105, 102, 102, 0, 171, 171, 171, 1, 0, - 3, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, - 101, 110, 116, 101, 114, 49, 0, 65, 0, 171, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 97, 100, - 105, 117, 115, 49, 0, 115, 113, 95, 114, 97, 100, 105, 117, 115, 49, - 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, 171, 171, 171, 73, 83, 71, 78, 104, 0, - 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, 92, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, - 0, 0, 0, 12, 12, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, - 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, - 171, 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, - 97, 114, 103, 101, 116, 0, 171, 171, 152, 166, 0, 0, 0, 0, 0, - 0, 65, 48, 77, 105, 114, 114, 111, 114, 0, 44, 7, 0, 0, 68, - 88, 66, 67, 172, 27, 205, 113, 176, 254, 27, 44, 22, 107, 179, 112, - 127, 38, 148, 161, 1, 0, 0, 0, 44, 7, 0, 0, 6, 0, 0, - 0, 56, 0, 0, 0, 148, 1, 0, 0, 104, 3, 0, 0, 228, 3, - 0, 0, 136, 6, 0, 0, 188, 6, 0, 0, 65, 111, 110, 57, 84, - 1, 0, 0, 84, 1, 0, 0, 0, 2, 254, 255, 252, 0, 0, 0, - 88, 0, 0, 0, 4, 0, 36, 0, 0, 0, 84, 0, 0, 0, 84, - 0, 0, 0, 36, 0, 1, 0, 84, 0, 0, 0, 0, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 2, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, - 1, 0, 3, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 254, 255, 81, 0, 0, 5, 6, 0, 15, 160, 0, 0, - 128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 31, - 0, 0, 2, 5, 0, 0, 128, 0, 0, 15, 144, 4, 0, 0, 4, - 0, 0, 3, 224, 0, 0, 228, 144, 2, 0, 238, 160, 2, 0, 228, - 160, 4, 0, 0, 4, 0, 0, 3, 128, 0, 0, 228, 144, 1, 0, - 238, 160, 1, 0, 228, 160, 2, 0, 0, 3, 0, 0, 4, 128, 0, - 0, 0, 128, 6, 0, 0, 160, 5, 0, 0, 3, 0, 0, 4, 128, - 0, 0, 170, 128, 5, 0, 0, 160, 5, 0, 0, 3, 1, 0, 1, - 128, 0, 0, 170, 128, 6, 0, 85, 160, 2, 0, 0, 3, 0, 0, - 4, 128, 0, 0, 85, 129, 6, 0, 0, 160, 2, 0, 0, 3, 0, - 0, 3, 192, 0, 0, 228, 128, 0, 0, 228, 160, 5, 0, 0, 3, - 0, 0, 1, 128, 0, 0, 170, 128, 5, 0, 85, 160, 5, 0, 0, - 3, 1, 0, 2, 128, 0, 0, 0, 128, 6, 0, 85, 160, 1, 0, - 0, 2, 1, 0, 4, 128, 6, 0, 0, 160, 8, 0, 0, 3, 0, - 0, 8, 224, 1, 0, 228, 128, 3, 0, 228, 160, 8, 0, 0, 3, - 0, 0, 4, 224, 1, 0, 228, 128, 4, 0, 228, 160, 1, 0, 0, - 2, 0, 0, 12, 192, 6, 0, 36, 160, 255, 255, 0, 0, 83, 72, - 68, 82, 204, 1, 0, 0, 64, 0, 1, 0, 115, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 89, 0, 0, 4, 70, 142, 32, 0, 1, 0, 0, 0, 4, 0, 0, - 0, 95, 0, 0, 3, 50, 16, 16, 0, 0, 0, 0, 0, 103, 0, - 0, 4, 242, 32, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 101, - 0, 0, 3, 50, 32, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, - 194, 32, 16, 0, 1, 0, 0, 0, 104, 0, 0, 2, 2, 0, 0, - 0, 54, 0, 0, 8, 194, 32, 16, 0, 0, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 63, 50, 0, 0, 11, 50, 0, 16, 0, 0, 0, 0, 0, - 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 5, 50, 32, 16, 0, 0, 0, 0, 0, 70, - 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, - 0, 0, 0, 128, 63, 0, 0, 0, 8, 34, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 1, - 64, 0, 0, 0, 0, 128, 63, 56, 0, 0, 8, 50, 0, 16, 0, - 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 70, 128, 32, - 0, 1, 0, 0, 0, 3, 0, 0, 0, 56, 0, 0, 10, 50, 0, - 16, 0, 1, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 2, - 64, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, 0, 5, 66, 0, 16, 0, 1, 0, 0, - 0, 1, 64, 0, 0, 0, 0, 128, 63, 16, 0, 0, 8, 66, 32, - 16, 0, 1, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 70, - 130, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, - 130, 32, 16, 0, 1, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, - 0, 70, 130, 32, 0, 1, 0, 0, 0, 1, 0, 0, 0, 50, 0, - 0, 11, 50, 32, 16, 0, 1, 0, 0, 0, 70, 16, 16, 0, 0, - 0, 0, 0, 230, 138, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 70, 128, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 62, 0, 0, - 1, 83, 84, 65, 84, 116, 0, 0, 0, 12, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 82, 68, 69, 70, 156, 2, 0, 0, 2, 0, - 0, 0, 100, 0, 0, 0, 2, 0, 0, 0, 28, 0, 0, 0, 0, - 4, 254, 255, 0, 1, 0, 0, 103, 2, 0, 0, 92, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 99, 98, 48, 0, 99, 98, 50, 0, 92, 0, 0, 0, 4, 0, 0, - 0, 148, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 96, 0, 0, 0, 7, 0, 0, 0, 52, 1, 0, 0, 112, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 16, 1, 0, 0, 16, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 26, - 1, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 40, 1, 0, 0, 48, 0, 0, - 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 81, 117, 97, 100, 68, 101, 115, 99, 0, 171, 171, 171, 1, - 0, 3, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 84, 101, 120, 67, 111, 111, 114, 100, 115, 0, 77, 97, 115, 107, 84, - 101, 120, 67, 111, 111, 114, 100, 115, 0, 84, 101, 120, 116, 67, 111, - 108, 111, 114, 0, 171, 171, 220, 1, 0, 0, 0, 0, 0, 0, 44, - 0, 0, 0, 2, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0, - 4, 2, 0, 0, 48, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, - 0, 16, 2, 0, 0, 0, 0, 0, 0, 32, 2, 0, 0, 64, 0, - 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 40, 2, 0, 0, 0, - 0, 0, 0, 56, 2, 0, 0, 80, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, 64, 2, 0, - 0, 88, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 68, 2, - 0, 0, 0, 0, 0, 0, 84, 2, 0, 0, 92, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 68, 2, 0, 0, 0, 0, 0, 0, - 92, 2, 0, 0, 96, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, - 0, 68, 2, 0, 0, 0, 0, 0, 0, 68, 101, 118, 105, 99, 101, - 83, 112, 97, 99, 101, 84, 111, 85, 115, 101, 114, 83, 112, 97, 99, - 101, 0, 171, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 100, 105, 109, 101, 110, 115, 105, 111, 110, 115, 0, - 171, 1, 0, 3, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 100, 105, 102, 102, 0, 171, 171, 171, 1, 0, 3, 0, 1, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 101, 110, 116, - 101, 114, 49, 0, 65, 0, 171, 171, 0, 0, 3, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 97, 100, 105, 117, 115, - 49, 0, 115, 113, 95, 114, 97, 100, 105, 117, 115, 49, 0, 77, 105, - 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, - 56, 52, 0, 171, 171, 171, 73, 83, 71, 78, 44, 0, 0, 0, 1, - 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 7, 3, 0, - 0, 80, 79, 83, 73, 84, 73, 79, 78, 0, 171, 171, 171, 79, 83, - 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 12, - 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, 0, 12, 3, 0, 0, 83, 86, 95, 80, - 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, - 68, 0, 171, 171, 171, 149, 176, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 200, 7, 0, 0, 68, - 88, 66, 67, 238, 212, 160, 43, 129, 11, 44, 225, 62, 162, 102, 35, - 9, 220, 80, 177, 1, 0, 0, 0, 200, 7, 0, 0, 6, 0, 0, - 0, 56, 0, 0, 0, 196, 1, 0, 0, 56, 4, 0, 0, 180, 4, - 0, 0, 36, 7, 0, 0, 148, 7, 0, 0, 65, 111, 110, 57, 132, - 1, 0, 0, 132, 1, 0, 0, 0, 2, 255, 255, 76, 1, 0, 0, - 56, 0, 0, 0, 1, 0, 44, 0, 0, 0, 56, 0, 0, 0, 56, - 0, 2, 0, 36, 0, 0, 0, 56, 0, 0, 0, 0, 0, 1, 1, - 1, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, - 2, 255, 255, 81, 0, 0, 5, 2, 0, 15, 160, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, - 2, 0, 0, 0, 128, 0, 0, 15, 176, 31, 0, 0, 2, 0, 0, - 0, 144, 0, 8, 15, 160, 31, 0, 0, 2, 0, 0, 0, 144, 1, - 8, 15, 160, 5, 0, 0, 3, 0, 0, 8, 128, 1, 0, 255, 160, - 1, 0, 255, 160, 2, 0, 0, 3, 0, 0, 3, 128, 0, 0, 235, - 176, 1, 0, 228, 161, 90, 0, 0, 4, 0, 0, 8, 128, 0, 0, - 228, 128, 0, 0, 228, 128, 0, 0, 255, 129, 5, 0, 0, 3, 0, - 0, 8, 128, 0, 0, 255, 128, 2, 0, 0, 160, 1, 0, 0, 2, - 0, 0, 4, 128, 1, 0, 255, 160, 8, 0, 0, 3, 0, 0, 1, - 128, 0, 0, 228, 128, 0, 0, 228, 160, 6, 0, 0, 2, 0, 0, - 1, 128, 0, 0, 0, 128, 5, 0, 0, 3, 0, 0, 1, 128, 0, - 0, 0, 128, 0, 0, 255, 128, 1, 0, 0, 2, 0, 0, 2, 128, - 2, 0, 0, 160, 66, 0, 0, 3, 1, 0, 15, 128, 0, 0, 228, - 176, 1, 8, 228, 160, 66, 0, 0, 3, 2, 0, 15, 128, 0, 0, - 228, 128, 0, 8, 228, 160, 1, 0, 0, 2, 0, 0, 8, 128, 1, - 0, 255, 160, 4, 0, 0, 4, 0, 0, 1, 128, 0, 0, 0, 128, - 0, 0, 170, 161, 0, 0, 255, 129, 5, 0, 0, 3, 2, 0, 7, - 128, 2, 0, 255, 128, 2, 0, 228, 128, 5, 0, 0, 3, 1, 0, - 15, 128, 1, 0, 255, 128, 2, 0, 228, 128, 88, 0, 0, 4, 0, - 0, 15, 128, 0, 0, 0, 128, 2, 0, 85, 160, 1, 0, 228, 128, - 1, 0, 0, 2, 0, 8, 15, 128, 0, 0, 228, 128, 255, 255, 0, - 0, 83, 72, 68, 82, 108, 2, 0, 0, 64, 0, 0, 0, 155, 0, - 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 6, - 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, 0, - 90, 0, 0, 3, 0, 96, 16, 0, 1, 0, 0, 0, 88, 24, 0, - 4, 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, 0, 0, 88, 24, - 0, 4, 0, 112, 16, 0, 1, 0, 0, 0, 85, 85, 0, 0, 98, - 16, 0, 3, 50, 16, 16, 0, 1, 0, 0, 0, 98, 16, 0, 3, - 194, 16, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, - 0, 0, 0, 0, 0, 104, 0, 0, 2, 2, 0, 0, 0, 0, 0, - 0, 9, 50, 0, 16, 0, 0, 0, 0, 0, 230, 26, 16, 0, 1, - 0, 0, 0, 70, 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 54, 0, 0, 6, 66, 0, 16, 0, 0, 0, 0, - 0, 58, 128, 32, 0, 0, 0, 0, 0, 5, 0, 0, 0, 16, 0, - 0, 8, 66, 0, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 0, - 0, 0, 0, 70, 130, 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 15, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, - 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 50, 0, - 0, 12, 18, 0, 16, 0, 0, 0, 0, 0, 58, 128, 32, 128, 65, - 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 58, 128, 32, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, - 0, 56, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 63, 14, - 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 56, 0, 0, - 8, 66, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, - 0, 0, 42, 128, 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, 29, - 0, 0, 9, 66, 0, 16, 0, 0, 0, 0, 0, 58, 128, 32, 128, - 65, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 42, 0, 16, - 0, 0, 0, 0, 0, 54, 0, 0, 5, 34, 0, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, 0, 0, 0, 63, 69, 0, 0, 9, 242, - 0, 16, 0, 1, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, - 0, 31, 0, 4, 3, 42, 0, 16, 0, 0, 0, 0, 0, 54, 0, - 0, 8, 242, 32, 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 62, 0, 0, 1, 21, 0, 0, 1, 56, 0, 0, 7, 114, 0, 16, - 0, 1, 0, 0, 0, 246, 15, 16, 0, 1, 0, 0, 0, 70, 2, - 16, 0, 1, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 16, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, - 1, 0, 0, 0, 0, 96, 16, 0, 1, 0, 0, 0, 56, 0, 0, - 7, 242, 32, 16, 0, 0, 0, 0, 0, 246, 15, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 62, 0, 0, 1, 83, - 84, 65, 84, 116, 0, 0, 0, 19, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 68, 69, 70, 104, 2, 0, 0, 1, 0, 0, 0, - 232, 0, 0, 0, 5, 0, 0, 0, 28, 0, 0, 0, 0, 4, 255, - 255, 0, 1, 0, 0, 51, 2, 0, 0, 188, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 216, 0, - 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, - 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, - 220, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, - 0, 255, 255, 255, 255, 1, 0, 0, 0, 1, 0, 0, 0, 12, 0, - 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 115, 77, 105, 114, 114, 111, 114, 83, 97, 109, 112, - 108, 101, 114, 0, 115, 77, 97, 115, 107, 83, 97, 109, 112, 108, 101, - 114, 0, 116, 101, 120, 0, 109, 97, 115, 107, 0, 99, 98, 50, 0, - 171, 171, 171, 225, 0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, - 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 1, 0, - 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 192, 1, - 0, 0, 0, 0, 0, 0, 208, 1, 0, 0, 48, 0, 0, 0, 8, - 0, 0, 0, 0, 0, 0, 0, 220, 1, 0, 0, 0, 0, 0, 0, - 236, 1, 0, 0, 64, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, - 0, 244, 1, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 80, 0, - 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 220, 1, 0, 0, 0, - 0, 0, 0, 12, 2, 0, 0, 88, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, 32, 2, 0, - 0, 92, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 16, 2, - 0, 0, 0, 0, 0, 0, 40, 2, 0, 0, 96, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, - 68, 101, 118, 105, 99, 101, 83, 112, 97, 99, 101, 84, 111, 85, 115, - 101, 114, 83, 112, 97, 99, 101, 0, 171, 3, 0, 3, 0, 3, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, 109, 101, 110, - 115, 105, 111, 110, 115, 0, 171, 1, 0, 3, 0, 1, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, 102, 102, 0, 171, 171, - 171, 1, 0, 3, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 99, 101, 110, 116, 101, 114, 49, 0, 65, 0, 171, 171, 0, - 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 114, 97, 100, 105, 117, 115, 49, 0, 115, 113, 95, 114, 97, 100, 105, - 117, 115, 49, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, - 48, 48, 46, 49, 54, 51, 56, 52, 0, 171, 171, 171, 73, 83, 71, - 78, 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, - 0, 92, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, 12, 12, 0, 0, 83, 86, 95, 80, 111, - 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, - 0, 171, 171, 171, 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, - 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, - 86, 95, 84, 97, 114, 103, 101, 116, 0, 171, 171, 217, 183, 0, 0, - 0, 0, 0, 0, 83, 97, 109, 112, 108, 101, 67, 111, 110, 105, 99, - 71, 114, 97, 100, 105, 101, 110, 116, 0, 12, 7, 0, 0, 68, 88, - 66, 67, 139, 251, 38, 36, 124, 246, 203, 168, 214, 67, 77, 25, 142, - 114, 138, 15, 1, 0, 0, 0, 12, 7, 0, 0, 6, 0, 0, 0, - 56, 0, 0, 0, 148, 1, 0, 0, 104, 3, 0, 0, 228, 3, 0, - 0, 104, 6, 0, 0, 156, 6, 0, 0, 65, 111, 110, 57, 84, 1, - 0, 0, 84, 1, 0, 0, 0, 2, 254, 255, 252, 0, 0, 0, 88, - 0, 0, 0, 4, 0, 36, 0, 0, 0, 84, 0, 0, 0, 84, 0, - 0, 0, 36, 0, 1, 0, 84, 0, 0, 0, 0, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 1, - 0, 3, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 254, 255, 81, 0, 0, 5, 6, 0, 15, 160, 0, 0, 128, - 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, - 0, 2, 5, 0, 0, 128, 0, 0, 15, 144, 4, 0, 0, 4, 0, - 0, 3, 224, 0, 0, 228, 144, 2, 0, 238, 160, 2, 0, 228, 160, - 4, 0, 0, 4, 0, 0, 3, 128, 0, 0, 228, 144, 1, 0, 238, - 160, 1, 0, 228, 160, 2, 0, 0, 3, 0, 0, 4, 128, 0, 0, - 0, 128, 6, 0, 0, 160, 5, 0, 0, 3, 0, 0, 4, 128, 0, - 0, 170, 128, 5, 0, 0, 160, 5, 0, 0, 3, 1, 0, 1, 128, - 0, 0, 170, 128, 6, 0, 85, 160, 2, 0, 0, 3, 0, 0, 4, - 128, 0, 0, 85, 129, 6, 0, 0, 160, 2, 0, 0, 3, 0, 0, - 3, 192, 0, 0, 228, 128, 0, 0, 228, 160, 5, 0, 0, 3, 0, - 0, 1, 128, 0, 0, 170, 128, 5, 0, 85, 160, 5, 0, 0, 3, - 1, 0, 2, 128, 0, 0, 0, 128, 6, 0, 85, 160, 1, 0, 0, - 2, 1, 0, 4, 128, 6, 0, 0, 160, 8, 0, 0, 3, 0, 0, - 8, 224, 1, 0, 228, 128, 3, 0, 228, 160, 8, 0, 0, 3, 0, - 0, 4, 224, 1, 0, 228, 128, 4, 0, 228, 160, 1, 0, 0, 2, - 0, 0, 12, 192, 6, 0, 36, 160, 255, 255, 0, 0, 83, 72, 68, - 82, 204, 1, 0, 0, 64, 0, 1, 0, 115, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, 0, 1, 0, 0, 0, 4, 0, 0, 0, - 95, 0, 0, 3, 50, 16, 16, 0, 0, 0, 0, 0, 103, 0, 0, - 4, 242, 32, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 101, 0, - 0, 3, 50, 32, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 194, - 32, 16, 0, 1, 0, 0, 0, 104, 0, 0, 2, 2, 0, 0, 0, - 54, 0, 0, 8, 194, 32, 16, 0, 0, 0, 0, 0, 2, 64, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 128, 63, 50, 0, 0, 11, 50, 0, 16, 0, 0, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 54, 0, 0, 5, 50, 32, 16, 0, 0, 0, 0, 0, 70, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 7, 18, 0, 16, 0, 0, - 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, - 0, 0, 128, 63, 0, 0, 0, 8, 34, 0, 16, 0, 0, 0, 0, - 0, 26, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 128, 63, 56, 0, 0, 8, 50, 0, 16, 0, 0, - 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 70, 128, 32, 0, - 1, 0, 0, 0, 3, 0, 0, 0, 56, 0, 0, 10, 50, 0, 16, - 0, 1, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 2, 64, - 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, - 0, 0, 0, 54, 0, 0, 5, 66, 0, 16, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 0, 0, 128, 63, 16, 0, 0, 8, 66, 32, 16, - 0, 1, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 70, 130, - 32, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 130, - 32, 16, 0, 1, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, - 70, 130, 32, 0, 1, 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, - 11, 50, 32, 16, 0, 1, 0, 0, 0, 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 70, - 128, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, 69, 70, 124, 2, 0, 0, 2, 0, 0, - 0, 100, 0, 0, 0, 2, 0, 0, 0, 28, 0, 0, 0, 0, 4, - 254, 255, 0, 1, 0, 0, 72, 2, 0, 0, 92, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 99, - 98, 48, 0, 99, 98, 51, 0, 92, 0, 0, 0, 4, 0, 0, 0, - 148, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 96, 0, 0, 0, 6, 0, 0, 0, 52, 1, 0, 0, 80, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 16, 1, 0, 0, 16, 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 26, 1, - 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 40, 1, 0, 0, 48, 0, 0, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 81, 117, 97, 100, 68, 101, 115, 99, 0, 171, 171, 171, 1, 0, - 3, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, - 101, 120, 67, 111, 111, 114, 100, 115, 0, 77, 97, 115, 107, 84, 101, - 120, 67, 111, 111, 114, 100, 115, 0, 84, 101, 120, 116, 67, 111, 108, - 111, 114, 0, 171, 171, 196, 1, 0, 0, 0, 0, 0, 0, 44, 0, - 0, 0, 2, 0, 0, 0, 224, 1, 0, 0, 0, 0, 0, 0, 240, - 1, 0, 0, 48, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 56, 0, 0, - 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 23, 2, 0, 0, 64, 0, 0, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 32, 2, 0, 0, 0, 0, 0, 0, 48, 2, 0, 0, - 68, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 32, 2, 0, - 0, 0, 0, 0, 0, 61, 2, 0, 0, 72, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 32, 2, 0, 0, 0, 0, 0, 0, 68, - 101, 118, 105, 99, 101, 83, 112, 97, 99, 101, 84, 111, 85, 115, 101, - 114, 83, 112, 97, 99, 101, 95, 99, 98, 51, 0, 171, 3, 0, 3, - 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 105, - 109, 101, 110, 115, 105, 111, 110, 115, 95, 99, 98, 51, 0, 171, 1, - 0, 3, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 101, 110, 116, 101, 114, 0, 97, 110, 103, 108, 101, 0, 171, 171, - 171, 0, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 115, 116, 97, 114, 116, 95, 111, 102, 102, 115, 101, 116, 0, - 101, 110, 100, 95, 111, 102, 102, 115, 101, 116, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, - 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, 56, 52, - 0, 171, 171, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 7, 3, 0, 0, 80, 79, - 83, 73, 84, 73, 79, 78, 0, 171, 171, 171, 79, 83, 71, 78, 104, - 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 12, 0, 0, 92, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 12, 3, 0, 0, 83, 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, - 171, 171, 193, 191, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 76, 12, 0, 0, 68, 88, 66, 67, - 237, 135, 171, 29, 251, 164, 113, 72, 131, 168, 215, 155, 110, 76, 248, - 73, 1, 0, 0, 0, 76, 12, 0, 0, 6, 0, 0, 0, 56, 0, - 0, 0, 144, 3, 0, 0, 228, 8, 0, 0, 96, 9, 0, 0, 168, - 11, 0, 0, 24, 12, 0, 0, 65, 111, 110, 57, 80, 3, 0, 0, - 80, 3, 0, 0, 0, 2, 255, 255, 24, 3, 0, 0, 56, 0, 0, - 0, 1, 0, 44, 0, 0, 0, 56, 0, 0, 0, 56, 0, 2, 0, - 36, 0, 0, 0, 56, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, - 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 2, 255, 255, - 81, 0, 0, 5, 2, 0, 15, 160, 95, 174, 170, 60, 54, 90, 174, - 189, 226, 118, 56, 62, 4, 29, 169, 190, 81, 0, 0, 5, 3, 0, - 15, 160, 56, 247, 127, 63, 0, 0, 0, 0, 0, 0, 128, 63, 219, - 15, 73, 64, 81, 0, 0, 5, 4, 0, 15, 160, 0, 0, 0, 192, - 219, 15, 201, 63, 216, 15, 201, 63, 134, 249, 34, 62, 81, 0, 0, - 5, 5, 0, 15, 160, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 31, 0, 0, 2, 0, 0, 0, 128, 0, - 0, 15, 176, 31, 0, 0, 2, 0, 0, 0, 144, 0, 8, 15, 160, - 31, 0, 0, 2, 0, 0, 0, 144, 1, 8, 15, 160, 2, 0, 0, - 3, 0, 0, 3, 128, 0, 0, 235, 176, 0, 0, 238, 161, 35, 0, - 0, 2, 0, 0, 12, 128, 0, 0, 68, 128, 2, 0, 0, 3, 1, - 0, 3, 128, 0, 0, 238, 129, 0, 0, 235, 128, 88, 0, 0, 4, - 0, 0, 12, 128, 1, 0, 0, 128, 0, 0, 228, 128, 0, 0, 180, - 128, 88, 0, 0, 4, 1, 0, 1, 128, 1, 0, 85, 128, 3, 0, - 85, 160, 3, 0, 170, 160, 6, 0, 0, 2, 0, 0, 8, 128, 0, - 0, 255, 128, 5, 0, 0, 3, 0, 0, 4, 128, 0, 0, 255, 128, - 0, 0, 170, 128, 5, 0, 0, 3, 0, 0, 8, 128, 0, 0, 170, - 128, 0, 0, 170, 128, 4, 0, 0, 4, 1, 0, 2, 128, 0, 0, - 255, 128, 2, 0, 0, 160, 2, 0, 85, 160, 4, 0, 0, 4, 1, - 0, 2, 128, 0, 0, 255, 128, 1, 0, 85, 128, 2, 0, 170, 160, - 4, 0, 0, 4, 1, 0, 2, 128, 0, 0, 255, 128, 1, 0, 85, - 128, 2, 0, 255, 160, 4, 0, 0, 4, 0, 0, 8, 128, 0, 0, - 255, 128, 1, 0, 85, 128, 3, 0, 0, 160, 5, 0, 0, 3, 0, - 0, 4, 128, 0, 0, 255, 128, 0, 0, 170, 128, 4, 0, 0, 4, - 0, 0, 8, 128, 0, 0, 170, 128, 4, 0, 0, 160, 4, 0, 85, - 160, 4, 0, 0, 4, 0, 0, 4, 128, 0, 0, 255, 128, 1, 0, - 0, 128, 0, 0, 170, 128, 88, 0, 0, 4, 0, 0, 8, 128, 0, - 0, 0, 128, 3, 0, 85, 161, 3, 0, 255, 161, 2, 0, 0, 3, - 0, 0, 4, 128, 0, 0, 255, 128, 0, 0, 170, 128, 2, 0, 0, - 3, 0, 0, 8, 128, 0, 0, 170, 128, 0, 0, 170, 128, 2, 0, - 0, 3, 1, 0, 1, 128, 0, 0, 0, 129, 0, 0, 85, 128, 88, - 0, 0, 4, 0, 0, 3, 128, 1, 0, 0, 128, 0, 0, 228, 128, - 0, 0, 225, 128, 88, 0, 0, 4, 0, 0, 2, 128, 0, 0, 85, - 128, 3, 0, 170, 160, 3, 0, 85, 160, 88, 0, 0, 4, 0, 0, - 1, 128, 0, 0, 0, 128, 3, 0, 85, 160, 0, 0, 85, 128, 4, - 0, 0, 4, 0, 0, 1, 128, 0, 0, 0, 128, 0, 0, 255, 129, - 0, 0, 170, 128, 2, 0, 0, 3, 0, 0, 1, 128, 0, 0, 0, - 128, 1, 0, 0, 161, 2, 0, 0, 3, 0, 0, 1, 128, 0, 0, - 0, 128, 4, 0, 170, 160, 5, 0, 0, 3, 0, 0, 2, 128, 0, - 0, 0, 128, 4, 0, 255, 160, 35, 0, 0, 2, 0, 0, 2, 128, - 0, 0, 85, 128, 19, 0, 0, 2, 0, 0, 2, 128, 0, 0, 85, - 128, 88, 0, 0, 4, 0, 0, 1, 128, 0, 0, 0, 128, 0, 0, - 85, 128, 0, 0, 85, 129, 2, 0, 0, 3, 0, 0, 1, 128, 0, - 0, 0, 128, 1, 0, 85, 161, 2, 0, 0, 3, 0, 0, 2, 128, - 1, 0, 85, 161, 1, 0, 170, 160, 6, 0, 0, 2, 0, 0, 2, - 128, 0, 0, 85, 128, 5, 0, 0, 3, 0, 0, 1, 128, 0, 0, - 85, 128, 0, 0, 0, 128, 1, 0, 0, 2, 0, 0, 2, 128, 5, - 0, 0, 160, 66, 0, 0, 3, 1, 0, 15, 128, 0, 0, 228, 176, - 1, 8, 228, 160, 66, 0, 0, 3, 0, 0, 15, 128, 0, 0, 228, - 128, 0, 8, 228, 160, 5, 0, 0, 3, 0, 0, 7, 128, 0, 0, - 255, 128, 0, 0, 228, 128, 5, 0, 0, 3, 0, 0, 15, 128, 1, - 0, 255, 128, 0, 0, 228, 128, 1, 0, 0, 2, 0, 8, 15, 128, - 0, 0, 228, 128, 255, 255, 0, 0, 83, 72, 68, 82, 76, 5, 0, - 0, 64, 0, 0, 0, 83, 1, 0, 0, 89, 0, 0, 4, 70, 142, - 32, 0, 0, 0, 0, 0, 5, 0, 0, 0, 90, 0, 0, 3, 0, - 96, 16, 0, 0, 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, - 1, 0, 0, 0, 88, 24, 0, 4, 0, 112, 16, 0, 0, 0, 0, - 0, 85, 85, 0, 0, 88, 24, 0, 4, 0, 112, 16, 0, 1, 0, - 0, 0, 85, 85, 0, 0, 98, 16, 0, 3, 50, 16, 16, 0, 1, - 0, 0, 0, 98, 16, 0, 3, 194, 16, 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 242, 32, 16, 0, 0, 0, 0, 0, 104, 0, 0, - 2, 2, 0, 0, 0, 0, 0, 0, 9, 50, 0, 16, 0, 0, 0, - 0, 0, 182, 31, 16, 0, 1, 0, 0, 0, 182, 143, 32, 128, 65, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 52, 0, 0, 9, - 66, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 128, 129, 0, 0, - 0, 0, 0, 0, 0, 10, 0, 16, 128, 129, 0, 0, 0, 0, 0, - 0, 0, 14, 0, 0, 10, 66, 0, 16, 0, 0, 0, 0, 0, 2, - 64, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, - 0, 0, 128, 63, 42, 0, 16, 0, 0, 0, 0, 0, 51, 0, 0, - 9, 130, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 128, 129, 0, - 0, 0, 0, 0, 0, 0, 10, 0, 16, 128, 129, 0, 0, 0, 0, - 0, 0, 0, 56, 0, 0, 7, 66, 0, 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, - 0, 56, 0, 0, 7, 130, 0, 16, 0, 0, 0, 0, 0, 42, 0, - 16, 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 50, - 0, 0, 9, 18, 0, 16, 0, 1, 0, 0, 0, 58, 0, 16, 0, - 0, 0, 0, 0, 1, 64, 0, 0, 95, 174, 170, 60, 1, 64, 0, - 0, 54, 90, 174, 189, 50, 0, 0, 9, 18, 0, 16, 0, 1, 0, - 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 1, - 0, 0, 0, 1, 64, 0, 0, 226, 118, 56, 62, 50, 0, 0, 9, - 18, 0, 16, 0, 1, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, - 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 4, 29, - 169, 190, 50, 0, 0, 9, 130, 0, 16, 0, 0, 0, 0, 0, 58, - 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 56, 247, 127, 63, 56, 0, 0, 7, 18, 0, 16, - 0, 1, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 42, 0, - 16, 0, 0, 0, 0, 0, 50, 0, 0, 9, 18, 0, 16, 0, 1, - 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, - 0, 0, 0, 192, 1, 64, 0, 0, 219, 15, 201, 63, 49, 0, 0, - 9, 34, 0, 16, 0, 1, 0, 0, 0, 26, 0, 16, 128, 129, 0, - 0, 0, 0, 0, 0, 0, 10, 0, 16, 128, 129, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 7, 18, 0, 16, 0, 1, 0, 0, 0, - 26, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, - 0, 50, 0, 0, 9, 66, 0, 16, 0, 0, 0, 0, 0, 42, 0, - 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 10, - 0, 16, 0, 1, 0, 0, 0, 49, 0, 0, 8, 130, 0, 16, 0, - 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, - 128, 65, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 7, 130, 0, - 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 1, - 64, 0, 0, 219, 15, 73, 192, 0, 0, 0, 7, 66, 0, 16, 0, - 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 42, 0, 16, - 0, 0, 0, 0, 0, 51, 0, 0, 7, 130, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, - 0, 0, 0, 52, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, - 0, 29, 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, 10, 0, 16, 128, 65, 0, 0, 0, 0, - 0, 0, 0, 49, 0, 0, 8, 34, 0, 16, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 7, 18, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, - 0, 0, 0, 55, 0, 0, 10, 18, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 42, 0, 16, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, - 0, 0, 0, 10, 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, - 0, 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 216, 15, - 201, 63, 56, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, - 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 134, 249, 34, 62, - 29, 0, 0, 8, 34, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, - 0, 0, 0, 0, 0, 10, 0, 16, 128, 65, 0, 0, 0, 0, 0, - 0, 0, 26, 0, 0, 6, 18, 0, 16, 0, 0, 0, 0, 0, 10, - 0, 16, 128, 129, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 10, - 18, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, - 0, 10, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 128, 65, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 18, 0, 16, 0, 0, - 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 26, 128, 32, 128, - 65, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, - 10, 34, 0, 16, 0, 0, 0, 0, 0, 26, 128, 32, 128, 65, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 42, 128, 32, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, - 0, 0, 0, 0, 0, 54, 0, 0, 5, 34, 0, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, 0, 0, 0, 63, 69, 0, 0, 9, 242, - 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, - 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, - 0, 56, 0, 0, 7, 114, 0, 16, 0, 0, 0, 0, 0, 246, 15, - 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 69, - 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 70, 16, 16, 0, - 1, 0, 0, 0, 70, 126, 16, 0, 1, 0, 0, 0, 0, 96, 16, - 0, 1, 0, 0, 0, 56, 0, 0, 7, 242, 32, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 246, 15, 16, 0, 1, - 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, 0, 0, - 39, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 30, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, 69, 70, - 64, 2, 0, 0, 1, 0, 0, 0, 224, 0, 0, 0, 5, 0, 0, - 0, 28, 0, 0, 0, 0, 4, 255, 255, 0, 1, 0, 0, 12, 2, - 0, 0, 188, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 197, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 210, 0, 0, 0, 2, 0, 0, 0, 5, - 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 1, 0, 0, 0, 12, 0, 0, 0, 214, 0, 0, 0, 2, 0, 0, - 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 1, 0, - 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 219, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 115, 83, 97, - 109, 112, 108, 101, 114, 0, 115, 77, 97, 115, 107, 83, 97, 109, 112, - 108, 101, 114, 0, 116, 101, 120, 0, 109, 97, 115, 107, 0, 99, 98, - 51, 0, 171, 219, 0, 0, 0, 6, 0, 0, 0, 248, 0, 0, 0, - 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 1, 0, - 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 164, 1, - 0, 0, 0, 0, 0, 0, 180, 1, 0, 0, 48, 0, 0, 0, 8, - 0, 0, 0, 0, 0, 0, 0, 196, 1, 0, 0, 0, 0, 0, 0, - 212, 1, 0, 0, 56, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, - 0, 196, 1, 0, 0, 0, 0, 0, 0, 219, 1, 0, 0, 64, 0, - 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 228, 1, 0, 0, 0, - 0, 0, 0, 244, 1, 0, 0, 68, 0, 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 228, 1, 0, 0, 0, 0, 0, 0, 1, 2, 0, - 0, 72, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 228, 1, - 0, 0, 0, 0, 0, 0, 68, 101, 118, 105, 99, 101, 83, 112, 97, - 99, 101, 84, 111, 85, 115, 101, 114, 83, 112, 97, 99, 101, 95, 99, - 98, 51, 0, 171, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 100, 105, 109, 101, 110, 115, 105, 111, 110, 115, - 95, 99, 98, 51, 0, 171, 1, 0, 3, 0, 1, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 99, 101, 110, 116, 101, 114, 0, 97, - 110, 103, 108, 101, 0, 171, 171, 171, 0, 0, 3, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 116, 97, 114, 116, 95, - 111, 102, 102, 115, 101, 116, 0, 101, 110, 100, 95, 111, 102, 102, 115, - 101, 116, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, - 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, - 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, - 48, 46, 49, 54, 51, 56, 52, 0, 171, 171, 73, 83, 71, 78, 104, - 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, 92, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 12, 12, 0, 0, 83, 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, - 171, 171, 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, - 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, - 84, 97, 114, 103, 101, 116, 0, 171, 171, 229, 198, 0, 0, 0, 0, - 0, 0, 12, 7, 0, 0, 68, 88, 66, 67, 139, 251, 38, 36, 124, - 246, 203, 168, 214, 67, 77, 25, 142, 114, 138, 15, 1, 0, 0, 0, - 12, 7, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 148, 1, 0, - 0, 104, 3, 0, 0, 228, 3, 0, 0, 104, 6, 0, 0, 156, 6, - 0, 0, 65, 111, 110, 57, 84, 1, 0, 0, 84, 1, 0, 0, 0, - 2, 254, 255, 252, 0, 0, 0, 88, 0, 0, 0, 4, 0, 36, 0, - 0, 0, 84, 0, 0, 0, 84, 0, 0, 0, 36, 0, 1, 0, 84, - 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, - 0, 3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 1, 0, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 254, 255, 81, 0, 0, - 5, 6, 0, 15, 160, 0, 0, 128, 63, 0, 0, 0, 63, 0, 0, - 0, 0, 0, 0, 0, 0, 31, 0, 0, 2, 5, 0, 0, 128, 0, - 0, 15, 144, 4, 0, 0, 4, 0, 0, 3, 224, 0, 0, 228, 144, - 2, 0, 238, 160, 2, 0, 228, 160, 4, 0, 0, 4, 0, 0, 3, - 128, 0, 0, 228, 144, 1, 0, 238, 160, 1, 0, 228, 160, 2, 0, - 0, 3, 0, 0, 4, 128, 0, 0, 0, 128, 6, 0, 0, 160, 5, - 0, 0, 3, 0, 0, 4, 128, 0, 0, 170, 128, 5, 0, 0, 160, - 5, 0, 0, 3, 1, 0, 1, 128, 0, 0, 170, 128, 6, 0, 85, - 160, 2, 0, 0, 3, 0, 0, 4, 128, 0, 0, 85, 129, 6, 0, - 0, 160, 2, 0, 0, 3, 0, 0, 3, 192, 0, 0, 228, 128, 0, - 0, 228, 160, 5, 0, 0, 3, 0, 0, 1, 128, 0, 0, 170, 128, - 5, 0, 85, 160, 5, 0, 0, 3, 1, 0, 2, 128, 0, 0, 0, - 128, 6, 0, 85, 160, 1, 0, 0, 2, 1, 0, 4, 128, 6, 0, - 0, 160, 8, 0, 0, 3, 0, 0, 8, 224, 1, 0, 228, 128, 3, - 0, 228, 160, 8, 0, 0, 3, 0, 0, 4, 224, 1, 0, 228, 128, - 4, 0, 228, 160, 1, 0, 0, 2, 0, 0, 12, 192, 6, 0, 36, - 160, 255, 255, 0, 0, 83, 72, 68, 82, 204, 1, 0, 0, 64, 0, - 1, 0, 115, 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, - 1, 0, 0, 0, 4, 0, 0, 0, 95, 0, 0, 3, 50, 16, 16, - 0, 0, 0, 0, 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 101, 0, 0, 3, 50, 32, 16, 0, 1, - 0, 0, 0, 101, 0, 0, 3, 194, 32, 16, 0, 1, 0, 0, 0, - 104, 0, 0, 2, 2, 0, 0, 0, 54, 0, 0, 8, 194, 32, 16, - 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 128, 63, 50, 0, 0, 11, 50, - 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, - 230, 138, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, 32, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 5, 50, 32, - 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 0, 0, 0, - 8, 34, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 128, 65, 0, - 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 56, - 0, 0, 8, 50, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, - 0, 0, 0, 0, 70, 128, 32, 0, 1, 0, 0, 0, 3, 0, 0, - 0, 56, 0, 0, 10, 50, 0, 16, 0, 1, 0, 0, 0, 70, 0, - 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 63, 0, - 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 5, - 66, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, - 63, 16, 0, 0, 8, 66, 32, 16, 0, 1, 0, 0, 0, 70, 2, - 16, 0, 1, 0, 0, 0, 70, 130, 32, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 8, 130, 32, 16, 0, 1, 0, 0, 0, - 70, 2, 16, 0, 1, 0, 0, 0, 70, 130, 32, 0, 1, 0, 0, - 0, 1, 0, 0, 0, 50, 0, 0, 11, 50, 32, 16, 0, 1, 0, - 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, 0, - 0, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, 69, - 70, 124, 2, 0, 0, 2, 0, 0, 0, 100, 0, 0, 0, 2, 0, - 0, 0, 28, 0, 0, 0, 0, 4, 254, 255, 0, 1, 0, 0, 72, - 2, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 99, 98, 48, 0, 99, 98, 51, 0, - 92, 0, 0, 0, 4, 0, 0, 0, 148, 0, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 6, 0, - 0, 0, 52, 1, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 16, 1, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 26, 1, 0, 0, 32, 0, 0, 0, 16, - 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 40, 1, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 81, 117, 97, 100, 68, 101, - 115, 99, 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 84, 101, 120, 67, 111, 111, 114, 100, - 115, 0, 77, 97, 115, 107, 84, 101, 120, 67, 111, 111, 114, 100, 115, - 0, 84, 101, 120, 116, 67, 111, 108, 111, 114, 0, 171, 171, 196, 1, - 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 2, 0, 0, 0, 224, - 1, 0, 0, 0, 0, 0, 0, 240, 1, 0, 0, 48, 0, 0, 0, - 8, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 16, 2, 0, 0, 56, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 23, 2, 0, 0, 64, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 32, 2, 0, 0, - 0, 0, 0, 0, 48, 2, 0, 0, 68, 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 32, 2, 0, 0, 0, 0, 0, 0, 61, 2, - 0, 0, 72, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 32, - 2, 0, 0, 0, 0, 0, 0, 68, 101, 118, 105, 99, 101, 83, 112, - 97, 99, 101, 84, 111, 85, 115, 101, 114, 83, 112, 97, 99, 101, 95, - 99, 98, 51, 0, 171, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 100, 105, 109, 101, 110, 115, 105, 111, 110, - 115, 95, 99, 98, 51, 0, 171, 1, 0, 3, 0, 1, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 99, 101, 110, 116, 101, 114, 0, - 97, 110, 103, 108, 101, 0, 171, 171, 171, 0, 0, 3, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 116, 97, 114, 116, - 95, 111, 102, 102, 115, 101, 116, 0, 101, 110, 100, 95, 111, 102, 102, - 115, 101, 116, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, - 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, - 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, - 48, 48, 46, 49, 54, 51, 56, 52, 0, 171, 171, 73, 83, 71, 78, - 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 7, 3, 0, 0, 80, 79, 83, 73, 84, 73, 79, 78, 0, - 171, 171, 171, 79, 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, - 0, 0, 0, 3, 12, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, 3, 0, - 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, - 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 61, 211, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 80, 12, 0, 0, 68, 88, 66, 67, 247, 165, 11, 199, 50, 224, 108, - 119, 183, 179, 87, 201, 53, 213, 28, 250, 1, 0, 0, 0, 80, 12, - 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 144, 3, 0, 0, 228, - 8, 0, 0, 96, 9, 0, 0, 172, 11, 0, 0, 28, 12, 0, 0, - 65, 111, 110, 57, 80, 3, 0, 0, 80, 3, 0, 0, 0, 2, 255, - 255, 24, 3, 0, 0, 56, 0, 0, 0, 1, 0, 44, 0, 0, 0, - 56, 0, 0, 0, 56, 0, 2, 0, 36, 0, 0, 0, 56, 0, 0, - 0, 0, 0, 1, 1, 1, 0, 0, 0, 3, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 255, 255, 81, 0, 0, 5, 2, 0, 15, - 160, 95, 174, 170, 60, 54, 90, 174, 189, 226, 118, 56, 62, 4, 29, - 169, 190, 81, 0, 0, 5, 3, 0, 15, 160, 56, 247, 127, 63, 0, - 0, 0, 0, 0, 0, 128, 63, 219, 15, 73, 64, 81, 0, 0, 5, - 4, 0, 15, 160, 0, 0, 0, 192, 219, 15, 201, 63, 216, 15, 201, - 63, 134, 249, 34, 62, 81, 0, 0, 5, 5, 0, 15, 160, 0, 0, - 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, - 0, 0, 2, 0, 0, 0, 128, 0, 0, 15, 176, 31, 0, 0, 2, - 0, 0, 0, 144, 0, 8, 15, 160, 31, 0, 0, 2, 0, 0, 0, - 144, 1, 8, 15, 160, 2, 0, 0, 3, 0, 0, 3, 128, 0, 0, - 235, 176, 0, 0, 238, 161, 35, 0, 0, 2, 0, 0, 12, 128, 0, - 0, 68, 128, 2, 0, 0, 3, 1, 0, 3, 128, 0, 0, 238, 129, - 0, 0, 235, 128, 88, 0, 0, 4, 0, 0, 12, 128, 1, 0, 0, - 128, 0, 0, 228, 128, 0, 0, 180, 128, 88, 0, 0, 4, 1, 0, - 1, 128, 1, 0, 85, 128, 3, 0, 85, 160, 3, 0, 170, 160, 6, - 0, 0, 2, 0, 0, 8, 128, 0, 0, 255, 128, 5, 0, 0, 3, - 0, 0, 4, 128, 0, 0, 255, 128, 0, 0, 170, 128, 5, 0, 0, - 3, 0, 0, 8, 128, 0, 0, 170, 128, 0, 0, 170, 128, 4, 0, - 0, 4, 1, 0, 2, 128, 0, 0, 255, 128, 2, 0, 0, 160, 2, - 0, 85, 160, 4, 0, 0, 4, 1, 0, 2, 128, 0, 0, 255, 128, - 1, 0, 85, 128, 2, 0, 170, 160, 4, 0, 0, 4, 1, 0, 2, - 128, 0, 0, 255, 128, 1, 0, 85, 128, 2, 0, 255, 160, 4, 0, - 0, 4, 0, 0, 8, 128, 0, 0, 255, 128, 1, 0, 85, 128, 3, - 0, 0, 160, 5, 0, 0, 3, 0, 0, 4, 128, 0, 0, 255, 128, - 0, 0, 170, 128, 4, 0, 0, 4, 0, 0, 8, 128, 0, 0, 170, - 128, 4, 0, 0, 160, 4, 0, 85, 160, 4, 0, 0, 4, 0, 0, - 4, 128, 0, 0, 255, 128, 1, 0, 0, 128, 0, 0, 170, 128, 88, - 0, 0, 4, 0, 0, 8, 128, 0, 0, 0, 128, 3, 0, 85, 161, - 3, 0, 255, 161, 2, 0, 0, 3, 0, 0, 4, 128, 0, 0, 255, - 128, 0, 0, 170, 128, 2, 0, 0, 3, 0, 0, 8, 128, 0, 0, - 170, 128, 0, 0, 170, 128, 2, 0, 0, 3, 1, 0, 1, 128, 0, - 0, 0, 129, 0, 0, 85, 128, 88, 0, 0, 4, 0, 0, 3, 128, - 1, 0, 0, 128, 0, 0, 228, 128, 0, 0, 225, 128, 88, 0, 0, - 4, 0, 0, 2, 128, 0, 0, 85, 128, 3, 0, 170, 160, 3, 0, - 85, 160, 88, 0, 0, 4, 0, 0, 1, 128, 0, 0, 0, 128, 3, - 0, 85, 160, 0, 0, 85, 128, 4, 0, 0, 4, 0, 0, 1, 128, - 0, 0, 0, 128, 0, 0, 255, 129, 0, 0, 170, 128, 2, 0, 0, - 3, 0, 0, 1, 128, 0, 0, 0, 128, 1, 0, 0, 161, 2, 0, - 0, 3, 0, 0, 1, 128, 0, 0, 0, 128, 4, 0, 170, 160, 5, - 0, 0, 3, 0, 0, 2, 128, 0, 0, 0, 128, 4, 0, 255, 160, - 35, 0, 0, 2, 0, 0, 2, 128, 0, 0, 85, 128, 19, 0, 0, - 2, 0, 0, 2, 128, 0, 0, 85, 128, 88, 0, 0, 4, 0, 0, - 1, 128, 0, 0, 0, 128, 0, 0, 85, 128, 0, 0, 85, 129, 2, - 0, 0, 3, 0, 0, 1, 128, 0, 0, 0, 128, 1, 0, 85, 161, - 2, 0, 0, 3, 0, 0, 2, 128, 1, 0, 85, 161, 1, 0, 170, - 160, 6, 0, 0, 2, 0, 0, 2, 128, 0, 0, 85, 128, 5, 0, - 0, 3, 0, 0, 1, 128, 0, 0, 85, 128, 0, 0, 0, 128, 1, - 0, 0, 2, 0, 0, 2, 128, 5, 0, 0, 160, 66, 0, 0, 3, - 1, 0, 15, 128, 0, 0, 228, 176, 1, 8, 228, 160, 66, 0, 0, - 3, 0, 0, 15, 128, 0, 0, 228, 128, 0, 8, 228, 160, 5, 0, - 0, 3, 0, 0, 7, 128, 0, 0, 255, 128, 0, 0, 228, 128, 5, - 0, 0, 3, 0, 0, 15, 128, 1, 0, 255, 128, 0, 0, 228, 128, - 1, 0, 0, 2, 0, 8, 15, 128, 0, 0, 228, 128, 255, 255, 0, - 0, 83, 72, 68, 82, 76, 5, 0, 0, 64, 0, 0, 0, 83, 1, - 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 5, - 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, 0, - 90, 0, 0, 3, 0, 96, 16, 0, 1, 0, 0, 0, 88, 24, 0, - 4, 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, 0, 0, 88, 24, - 0, 4, 0, 112, 16, 0, 1, 0, 0, 0, 85, 85, 0, 0, 98, - 16, 0, 3, 50, 16, 16, 0, 1, 0, 0, 0, 98, 16, 0, 3, - 194, 16, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, - 0, 0, 0, 0, 0, 104, 0, 0, 2, 2, 0, 0, 0, 0, 0, - 0, 9, 50, 0, 16, 0, 0, 0, 0, 0, 182, 31, 16, 0, 1, - 0, 0, 0, 182, 143, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 52, 0, 0, 9, 66, 0, 16, 0, 0, 0, 0, - 0, 26, 0, 16, 128, 129, 0, 0, 0, 0, 0, 0, 0, 10, 0, - 16, 128, 129, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 10, 66, - 0, 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 42, 0, 16, - 0, 0, 0, 0, 0, 51, 0, 0, 9, 130, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 128, 129, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 16, 128, 129, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 7, - 66, 0, 16, 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, - 0, 58, 0, 16, 0, 0, 0, 0, 0, 56, 0, 0, 7, 130, 0, - 16, 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 42, - 0, 16, 0, 0, 0, 0, 0, 50, 0, 0, 9, 18, 0, 16, 0, - 1, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, - 0, 95, 174, 170, 60, 1, 64, 0, 0, 54, 90, 174, 189, 50, 0, - 0, 9, 18, 0, 16, 0, 1, 0, 0, 0, 58, 0, 16, 0, 0, - 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, - 226, 118, 56, 62, 50, 0, 0, 9, 18, 0, 16, 0, 1, 0, 0, - 0, 58, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 1, 0, - 0, 0, 1, 64, 0, 0, 4, 29, 169, 190, 50, 0, 0, 9, 130, - 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 56, 247, 127, - 63, 56, 0, 0, 7, 18, 0, 16, 0, 1, 0, 0, 0, 58, 0, - 16, 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 50, - 0, 0, 9, 18, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, - 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 192, 1, 64, 0, - 0, 219, 15, 201, 63, 49, 0, 0, 9, 34, 0, 16, 0, 1, 0, - 0, 0, 26, 0, 16, 128, 129, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 16, 128, 129, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 7, - 18, 0, 16, 0, 1, 0, 0, 0, 26, 0, 16, 0, 1, 0, 0, - 0, 10, 0, 16, 0, 1, 0, 0, 0, 50, 0, 0, 9, 66, 0, - 16, 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 58, - 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, - 49, 0, 0, 8, 130, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, - 0, 0, 0, 0, 0, 26, 0, 16, 128, 65, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 7, 130, 0, 16, 0, 0, 0, 0, 0, 58, - 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 219, 15, 73, 192, - 0, 0, 0, 7, 66, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, - 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 51, 0, - 0, 7, 130, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, - 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 52, 0, 0, 7, - 18, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, - 0, 10, 0, 16, 0, 0, 0, 0, 0, 29, 0, 0, 8, 18, 0, - 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 10, - 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 8, - 34, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, - 0, 58, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, - 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 55, 0, 0, 10, - 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, - 0, 42, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 42, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 9, 18, 0, 16, 0, 0, - 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 10, 128, 32, 128, - 65, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, - 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, 216, 15, 201, 63, 56, 0, 0, 7, 18, - 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 134, 249, 34, 62, 29, 0, 0, 8, 34, 0, 16, - 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 10, 0, - 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 6, 18, - 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 128, 129, 0, 0, 0, - 0, 0, 0, 0, 55, 0, 0, 10, 18, 0, 16, 0, 0, 0, 0, - 0, 26, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 26, 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 10, 34, 0, 16, 0, 0, 0, - 0, 0, 26, 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 42, 128, 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 14, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, - 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 54, 0, - 0, 5, 34, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, - 0, 0, 63, 69, 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, - 70, 0, 16, 0, 0, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, - 0, 0, 96, 16, 0, 0, 0, 0, 0, 56, 0, 0, 7, 114, 0, - 16, 0, 0, 0, 0, 0, 246, 15, 16, 0, 0, 0, 0, 0, 70, - 2, 16, 0, 0, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, - 1, 0, 0, 0, 70, 16, 16, 0, 1, 0, 0, 0, 70, 126, 16, - 0, 1, 0, 0, 0, 0, 96, 16, 0, 1, 0, 0, 0, 56, 0, - 0, 7, 242, 32, 16, 0, 0, 0, 0, 0, 70, 14, 16, 0, 0, - 0, 0, 0, 246, 15, 16, 0, 1, 0, 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, 0, 0, 39, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 30, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, 69, 70, 68, 2, 0, 0, 1, 0, 0, - 0, 228, 0, 0, 0, 5, 0, 0, 0, 28, 0, 0, 0, 0, 4, - 255, 255, 0, 1, 0, 0, 16, 2, 0, 0, 188, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 201, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 214, - 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, - 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, - 0, 218, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, - 0, 0, 255, 255, 255, 255, 1, 0, 0, 0, 1, 0, 0, 0, 12, - 0, 0, 0, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 115, 87, 114, 97, 112, 83, 97, 109, 112, 108, - 101, 114, 0, 115, 77, 97, 115, 107, 83, 97, 109, 112, 108, 101, 114, - 0, 116, 101, 120, 0, 109, 97, 115, 107, 0, 99, 98, 51, 0, 171, - 223, 0, 0, 0, 6, 0, 0, 0, 252, 0, 0, 0, 80, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 1, 0, 0, 0, 0, - 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 168, 1, 0, 0, 0, - 0, 0, 0, 184, 1, 0, 0, 48, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 200, 1, 0, 0, 0, 0, 0, 0, 216, 1, 0, - 0, 56, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 200, 1, - 0, 0, 0, 0, 0, 0, 223, 1, 0, 0, 64, 0, 0, 0, 4, - 0, 0, 0, 2, 0, 0, 0, 232, 1, 0, 0, 0, 0, 0, 0, - 248, 1, 0, 0, 68, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, - 0, 232, 1, 0, 0, 0, 0, 0, 0, 5, 2, 0, 0, 72, 0, - 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 232, 1, 0, 0, 0, - 0, 0, 0, 68, 101, 118, 105, 99, 101, 83, 112, 97, 99, 101, 84, - 111, 85, 115, 101, 114, 83, 112, 97, 99, 101, 95, 99, 98, 51, 0, - 171, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 100, 105, 109, 101, 110, 115, 105, 111, 110, 115, 95, 99, 98, - 51, 0, 171, 1, 0, 3, 0, 1, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 99, 101, 110, 116, 101, 114, 0, 97, 110, 103, 108, - 101, 0, 171, 171, 171, 0, 0, 3, 0, 1, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 115, 116, 97, 114, 116, 95, 111, 102, 102, - 115, 101, 116, 0, 101, 110, 100, 95, 111, 102, 102, 115, 101, 116, 0, - 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, - 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, - 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, - 54, 51, 56, 52, 0, 171, 171, 73, 83, 71, 78, 104, 0, 0, 0, - 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, - 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, 92, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, - 0, 12, 12, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, - 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 79, - 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 97, 114, - 103, 101, 116, 0, 171, 171, 97, 218, 0, 0, 0, 0, 0, 0, 12, - 7, 0, 0, 68, 88, 66, 67, 139, 251, 38, 36, 124, 246, 203, 168, - 214, 67, 77, 25, 142, 114, 138, 15, 1, 0, 0, 0, 12, 7, 0, - 0, 6, 0, 0, 0, 56, 0, 0, 0, 148, 1, 0, 0, 104, 3, - 0, 0, 228, 3, 0, 0, 104, 6, 0, 0, 156, 6, 0, 0, 65, - 111, 110, 57, 84, 1, 0, 0, 84, 1, 0, 0, 0, 2, 254, 255, - 252, 0, 0, 0, 88, 0, 0, 0, 4, 0, 36, 0, 0, 0, 84, - 0, 0, 0, 84, 0, 0, 0, 36, 0, 1, 0, 84, 0, 0, 0, - 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, - 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 3, 0, - 0, 0, 0, 0, 1, 0, 3, 0, 1, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 254, 255, 81, 0, 0, 5, 6, 0, - 15, 160, 0, 0, 128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, - 0, 0, 0, 31, 0, 0, 2, 5, 0, 0, 128, 0, 0, 15, 144, - 4, 0, 0, 4, 0, 0, 3, 224, 0, 0, 228, 144, 2, 0, 238, - 160, 2, 0, 228, 160, 4, 0, 0, 4, 0, 0, 3, 128, 0, 0, - 228, 144, 1, 0, 238, 160, 1, 0, 228, 160, 2, 0, 0, 3, 0, - 0, 4, 128, 0, 0, 0, 128, 6, 0, 0, 160, 5, 0, 0, 3, - 0, 0, 4, 128, 0, 0, 170, 128, 5, 0, 0, 160, 5, 0, 0, - 3, 1, 0, 1, 128, 0, 0, 170, 128, 6, 0, 85, 160, 2, 0, - 0, 3, 0, 0, 4, 128, 0, 0, 85, 129, 6, 0, 0, 160, 2, - 0, 0, 3, 0, 0, 3, 192, 0, 0, 228, 128, 0, 0, 228, 160, - 5, 0, 0, 3, 0, 0, 1, 128, 0, 0, 170, 128, 5, 0, 85, - 160, 5, 0, 0, 3, 1, 0, 2, 128, 0, 0, 0, 128, 6, 0, - 85, 160, 1, 0, 0, 2, 1, 0, 4, 128, 6, 0, 0, 160, 8, - 0, 0, 3, 0, 0, 8, 224, 1, 0, 228, 128, 3, 0, 228, 160, - 8, 0, 0, 3, 0, 0, 4, 224, 1, 0, 228, 128, 4, 0, 228, - 160, 1, 0, 0, 2, 0, 0, 12, 192, 6, 0, 36, 160, 255, 255, - 0, 0, 83, 72, 68, 82, 204, 1, 0, 0, 64, 0, 1, 0, 115, - 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 1, 0, 0, - 0, 4, 0, 0, 0, 95, 0, 0, 3, 50, 16, 16, 0, 0, 0, - 0, 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 101, 0, 0, 3, 50, 32, 16, 0, 1, 0, 0, 0, - 101, 0, 0, 3, 194, 32, 16, 0, 1, 0, 0, 0, 104, 0, 0, - 2, 2, 0, 0, 0, 54, 0, 0, 8, 194, 32, 16, 0, 0, 0, - 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 63, 50, 0, 0, 11, 50, 0, 16, 0, - 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 0, 0, 5, 50, 32, 16, 0, 0, - 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, - 0, 1, 64, 0, 0, 0, 0, 128, 63, 0, 0, 0, 8, 34, 0, - 16, 0, 0, 0, 0, 0, 26, 0, 16, 128, 65, 0, 0, 0, 0, - 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 56, 0, 0, 8, - 50, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, - 0, 70, 128, 32, 0, 1, 0, 0, 0, 3, 0, 0, 0, 56, 0, - 0, 10, 50, 0, 16, 0, 1, 0, 0, 0, 70, 0, 16, 0, 0, - 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 5, 66, 0, 16, - 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 16, 0, - 0, 8, 66, 32, 16, 0, 1, 0, 0, 0, 70, 2, 16, 0, 1, - 0, 0, 0, 70, 130, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 16, 0, 0, 8, 130, 32, 16, 0, 1, 0, 0, 0, 70, 2, 16, - 0, 1, 0, 0, 0, 70, 130, 32, 0, 1, 0, 0, 0, 1, 0, - 0, 0, 50, 0, 0, 11, 50, 32, 16, 0, 1, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, 0, 0, 12, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, 69, 70, 124, 2, - 0, 0, 2, 0, 0, 0, 100, 0, 0, 0, 2, 0, 0, 0, 28, - 0, 0, 0, 0, 4, 254, 255, 0, 1, 0, 0, 72, 2, 0, 0, - 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 99, 98, 48, 0, 99, 98, 51, 0, 92, 0, 0, - 0, 4, 0, 0, 0, 148, 0, 0, 0, 64, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 6, 0, 0, 0, 52, - 1, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 244, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 16, 1, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 26, 1, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 40, 1, 0, - 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 81, 117, 97, 100, 68, 101, 115, 99, 0, - 171, 171, 171, 1, 0, 3, 0, 1, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 84, 101, 120, 67, 111, 111, 114, 100, 115, 0, 77, - 97, 115, 107, 84, 101, 120, 67, 111, 111, 114, 100, 115, 0, 84, 101, - 120, 116, 67, 111, 108, 111, 114, 0, 171, 171, 196, 1, 0, 0, 0, - 0, 0, 0, 44, 0, 0, 0, 2, 0, 0, 0, 224, 1, 0, 0, - 0, 0, 0, 0, 240, 1, 0, 0, 48, 0, 0, 0, 8, 0, 0, - 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 16, 2, - 0, 0, 56, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 23, 2, 0, 0, 64, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 32, 2, 0, 0, 0, 0, 0, - 0, 48, 2, 0, 0, 68, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 32, 2, 0, 0, 0, 0, 0, 0, 61, 2, 0, 0, 72, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 32, 2, 0, 0, - 0, 0, 0, 0, 68, 101, 118, 105, 99, 101, 83, 112, 97, 99, 101, - 84, 111, 85, 115, 101, 114, 83, 112, 97, 99, 101, 95, 99, 98, 51, - 0, 171, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 100, 105, 109, 101, 110, 115, 105, 111, 110, 115, 95, 99, - 98, 51, 0, 171, 1, 0, 3, 0, 1, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 99, 101, 110, 116, 101, 114, 0, 97, 110, 103, - 108, 101, 0, 171, 171, 171, 0, 0, 3, 0, 1, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 115, 116, 97, 114, 116, 95, 111, 102, - 102, 115, 101, 116, 0, 101, 110, 100, 95, 111, 102, 102, 115, 101, 116, - 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, 171, 171, 73, 83, 71, 78, 44, 0, 0, - 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 7, - 3, 0, 0, 80, 79, 83, 73, 84, 73, 79, 78, 0, 171, 171, 171, - 79, 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, - 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, - 3, 12, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, 3, 0, 0, 83, 86, - 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, - 79, 82, 68, 0, 171, 171, 171, 189, 230, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 84, 12, 0, - 0, 68, 88, 66, 67, 176, 243, 97, 211, 20, 121, 26, 93, 252, 11, - 132, 198, 181, 186, 97, 15, 1, 0, 0, 0, 84, 12, 0, 0, 6, - 0, 0, 0, 56, 0, 0, 0, 144, 3, 0, 0, 228, 8, 0, 0, - 96, 9, 0, 0, 176, 11, 0, 0, 32, 12, 0, 0, 65, 111, 110, - 57, 80, 3, 0, 0, 80, 3, 0, 0, 0, 2, 255, 255, 24, 3, - 0, 0, 56, 0, 0, 0, 1, 0, 44, 0, 0, 0, 56, 0, 0, - 0, 56, 0, 2, 0, 36, 0, 0, 0, 56, 0, 0, 0, 0, 0, - 1, 1, 1, 0, 0, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 255, 255, 81, 0, 0, 5, 2, 0, 15, 160, 95, 174, - 170, 60, 54, 90, 174, 189, 226, 118, 56, 62, 4, 29, 169, 190, 81, - 0, 0, 5, 3, 0, 15, 160, 56, 247, 127, 63, 0, 0, 0, 0, - 0, 0, 128, 63, 219, 15, 73, 64, 81, 0, 0, 5, 4, 0, 15, - 160, 0, 0, 0, 192, 219, 15, 201, 63, 216, 15, 201, 63, 134, 249, - 34, 62, 81, 0, 0, 5, 5, 0, 15, 160, 0, 0, 0, 63, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 2, - 0, 0, 0, 128, 0, 0, 15, 176, 31, 0, 0, 2, 0, 0, 0, - 144, 0, 8, 15, 160, 31, 0, 0, 2, 0, 0, 0, 144, 1, 8, - 15, 160, 2, 0, 0, 3, 0, 0, 3, 128, 0, 0, 235, 176, 0, - 0, 238, 161, 35, 0, 0, 2, 0, 0, 12, 128, 0, 0, 68, 128, - 2, 0, 0, 3, 1, 0, 3, 128, 0, 0, 238, 129, 0, 0, 235, - 128, 88, 0, 0, 4, 0, 0, 12, 128, 1, 0, 0, 128, 0, 0, - 228, 128, 0, 0, 180, 128, 88, 0, 0, 4, 1, 0, 1, 128, 1, - 0, 85, 128, 3, 0, 85, 160, 3, 0, 170, 160, 6, 0, 0, 2, - 0, 0, 8, 128, 0, 0, 255, 128, 5, 0, 0, 3, 0, 0, 4, - 128, 0, 0, 255, 128, 0, 0, 170, 128, 5, 0, 0, 3, 0, 0, - 8, 128, 0, 0, 170, 128, 0, 0, 170, 128, 4, 0, 0, 4, 1, - 0, 2, 128, 0, 0, 255, 128, 2, 0, 0, 160, 2, 0, 85, 160, - 4, 0, 0, 4, 1, 0, 2, 128, 0, 0, 255, 128, 1, 0, 85, - 128, 2, 0, 170, 160, 4, 0, 0, 4, 1, 0, 2, 128, 0, 0, - 255, 128, 1, 0, 85, 128, 2, 0, 255, 160, 4, 0, 0, 4, 0, - 0, 8, 128, 0, 0, 255, 128, 1, 0, 85, 128, 3, 0, 0, 160, - 5, 0, 0, 3, 0, 0, 4, 128, 0, 0, 255, 128, 0, 0, 170, - 128, 4, 0, 0, 4, 0, 0, 8, 128, 0, 0, 170, 128, 4, 0, - 0, 160, 4, 0, 85, 160, 4, 0, 0, 4, 0, 0, 4, 128, 0, - 0, 255, 128, 1, 0, 0, 128, 0, 0, 170, 128, 88, 0, 0, 4, - 0, 0, 8, 128, 0, 0, 0, 128, 3, 0, 85, 161, 3, 0, 255, - 161, 2, 0, 0, 3, 0, 0, 4, 128, 0, 0, 255, 128, 0, 0, - 170, 128, 2, 0, 0, 3, 0, 0, 8, 128, 0, 0, 170, 128, 0, - 0, 170, 128, 2, 0, 0, 3, 1, 0, 1, 128, 0, 0, 0, 129, - 0, 0, 85, 128, 88, 0, 0, 4, 0, 0, 3, 128, 1, 0, 0, - 128, 0, 0, 228, 128, 0, 0, 225, 128, 88, 0, 0, 4, 0, 0, - 2, 128, 0, 0, 85, 128, 3, 0, 170, 160, 3, 0, 85, 160, 88, - 0, 0, 4, 0, 0, 1, 128, 0, 0, 0, 128, 3, 0, 85, 160, - 0, 0, 85, 128, 4, 0, 0, 4, 0, 0, 1, 128, 0, 0, 0, - 128, 0, 0, 255, 129, 0, 0, 170, 128, 2, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 0, 128, 1, 0, 0, 161, 2, 0, 0, 3, 0, - 0, 1, 128, 0, 0, 0, 128, 4, 0, 170, 160, 5, 0, 0, 3, - 0, 0, 2, 128, 0, 0, 0, 128, 4, 0, 255, 160, 35, 0, 0, - 2, 0, 0, 2, 128, 0, 0, 85, 128, 19, 0, 0, 2, 0, 0, - 2, 128, 0, 0, 85, 128, 88, 0, 0, 4, 0, 0, 1, 128, 0, - 0, 0, 128, 0, 0, 85, 128, 0, 0, 85, 129, 2, 0, 0, 3, - 0, 0, 1, 128, 0, 0, 0, 128, 1, 0, 85, 161, 2, 0, 0, - 3, 0, 0, 2, 128, 1, 0, 85, 161, 1, 0, 170, 160, 6, 0, - 0, 2, 0, 0, 2, 128, 0, 0, 85, 128, 5, 0, 0, 3, 0, - 0, 1, 128, 0, 0, 85, 128, 0, 0, 0, 128, 1, 0, 0, 2, - 0, 0, 2, 128, 5, 0, 0, 160, 66, 0, 0, 3, 1, 0, 15, - 128, 0, 0, 228, 176, 1, 8, 228, 160, 66, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 128, 0, 8, 228, 160, 5, 0, 0, 3, 0, - 0, 7, 128, 0, 0, 255, 128, 0, 0, 228, 128, 5, 0, 0, 3, - 0, 0, 15, 128, 1, 0, 255, 128, 0, 0, 228, 128, 1, 0, 0, - 2, 0, 8, 15, 128, 0, 0, 228, 128, 255, 255, 0, 0, 83, 72, - 68, 82, 76, 5, 0, 0, 64, 0, 0, 0, 83, 1, 0, 0, 89, - 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 5, 0, 0, 0, - 90, 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, 0, 90, 0, 0, - 3, 0, 96, 16, 0, 1, 0, 0, 0, 88, 24, 0, 4, 0, 112, - 16, 0, 0, 0, 0, 0, 85, 85, 0, 0, 88, 24, 0, 4, 0, - 112, 16, 0, 1, 0, 0, 0, 85, 85, 0, 0, 98, 16, 0, 3, - 50, 16, 16, 0, 1, 0, 0, 0, 98, 16, 0, 3, 194, 16, 16, - 0, 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, 0, 0, 0, - 0, 0, 104, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 9, 50, - 0, 16, 0, 0, 0, 0, 0, 182, 31, 16, 0, 1, 0, 0, 0, - 182, 143, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 52, 0, 0, 9, 66, 0, 16, 0, 0, 0, 0, 0, 26, 0, - 16, 128, 129, 0, 0, 0, 0, 0, 0, 0, 10, 0, 16, 128, 129, - 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 10, 66, 0, 16, 0, - 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 63, 0, 0, 128, - 63, 0, 0, 128, 63, 0, 0, 128, 63, 42, 0, 16, 0, 0, 0, - 0, 0, 51, 0, 0, 9, 130, 0, 16, 0, 0, 0, 0, 0, 26, - 0, 16, 128, 129, 0, 0, 0, 0, 0, 0, 0, 10, 0, 16, 128, - 129, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 7, 66, 0, 16, - 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 58, 0, - 16, 0, 0, 0, 0, 0, 56, 0, 0, 7, 130, 0, 16, 0, 0, - 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 42, 0, 16, 0, - 0, 0, 0, 0, 50, 0, 0, 9, 18, 0, 16, 0, 1, 0, 0, - 0, 58, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 95, 174, - 170, 60, 1, 64, 0, 0, 54, 90, 174, 189, 50, 0, 0, 9, 18, - 0, 16, 0, 1, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 226, 118, 56, - 62, 50, 0, 0, 9, 18, 0, 16, 0, 1, 0, 0, 0, 58, 0, - 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, - 64, 0, 0, 4, 29, 169, 190, 50, 0, 0, 9, 130, 0, 16, 0, - 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, - 0, 1, 0, 0, 0, 1, 64, 0, 0, 56, 247, 127, 63, 56, 0, - 0, 7, 18, 0, 16, 0, 1, 0, 0, 0, 58, 0, 16, 0, 0, - 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 50, 0, 0, 9, - 18, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, - 0, 1, 64, 0, 0, 0, 0, 0, 192, 1, 64, 0, 0, 219, 15, - 201, 63, 49, 0, 0, 9, 34, 0, 16, 0, 1, 0, 0, 0, 26, - 0, 16, 128, 129, 0, 0, 0, 0, 0, 0, 0, 10, 0, 16, 128, - 129, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 7, 18, 0, 16, - 0, 1, 0, 0, 0, 26, 0, 16, 0, 1, 0, 0, 0, 10, 0, - 16, 0, 1, 0, 0, 0, 50, 0, 0, 9, 66, 0, 16, 0, 0, - 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, - 0, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 49, 0, 0, - 8, 130, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 7, 130, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, - 0, 0, 0, 0, 1, 64, 0, 0, 219, 15, 73, 192, 0, 0, 0, - 7, 66, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, - 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 51, 0, 0, 7, 130, - 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 52, 0, 0, 7, 18, 0, 16, - 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, 29, 0, 0, 8, 18, 0, 16, 0, 0, - 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 128, - 65, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 8, 34, 0, 16, - 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 58, 0, - 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 7, 18, - 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, - 26, 0, 16, 0, 0, 0, 0, 0, 55, 0, 0, 10, 18, 0, 16, - 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 42, 0, - 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 18, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 10, 128, 32, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 7, 18, 0, - 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 1, - 64, 0, 0, 216, 15, 201, 63, 56, 0, 0, 7, 18, 0, 16, 0, - 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, - 0, 134, 249, 34, 62, 29, 0, 0, 8, 34, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 128, 65, - 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 6, 18, 0, 16, 0, - 0, 0, 0, 0, 10, 0, 16, 128, 129, 0, 0, 0, 0, 0, 0, - 0, 55, 0, 0, 10, 18, 0, 16, 0, 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 10, - 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, - 0, 26, 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 10, 34, 0, 16, 0, 0, 0, 0, 0, 26, - 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 42, 128, 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, - 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 54, 0, 0, 5, 34, - 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 63, - 69, 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, - 0, 0, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, - 16, 0, 0, 0, 0, 0, 56, 0, 0, 7, 114, 0, 16, 0, 0, - 0, 0, 0, 246, 15, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, - 0, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, - 0, 70, 16, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 1, 0, - 0, 0, 0, 96, 16, 0, 1, 0, 0, 0, 56, 0, 0, 7, 242, - 32, 16, 0, 0, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 1, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, - 84, 116, 0, 0, 0, 39, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 82, 68, 69, 70, 72, 2, 0, 0, 1, 0, 0, 0, 232, 0, - 0, 0, 5, 0, 0, 0, 28, 0, 0, 0, 0, 4, 255, 255, 0, - 1, 0, 0, 20, 2, 0, 0, 188, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, - 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, - 255, 0, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 220, 0, - 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, - 255, 255, 255, 1, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, - 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 115, 77, 105, 114, 114, 111, 114, 83, 97, 109, 112, 108, 101, - 114, 0, 115, 77, 97, 115, 107, 83, 97, 109, 112, 108, 101, 114, 0, - 116, 101, 120, 0, 109, 97, 115, 107, 0, 99, 98, 51, 0, 171, 171, - 171, 225, 0, 0, 0, 6, 0, 0, 0, 0, 1, 0, 0, 80, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 0, - 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 172, 1, 0, 0, - 0, 0, 0, 0, 188, 1, 0, 0, 48, 0, 0, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 204, 1, 0, 0, 0, 0, 0, 0, 220, 1, - 0, 0, 56, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 204, - 1, 0, 0, 0, 0, 0, 0, 227, 1, 0, 0, 64, 0, 0, 0, - 4, 0, 0, 0, 2, 0, 0, 0, 236, 1, 0, 0, 0, 0, 0, - 0, 252, 1, 0, 0, 68, 0, 0, 0, 4, 0, 0, 0, 2, 0, - 0, 0, 236, 1, 0, 0, 0, 0, 0, 0, 9, 2, 0, 0, 72, - 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 236, 1, 0, 0, - 0, 0, 0, 0, 68, 101, 118, 105, 99, 101, 83, 112, 97, 99, 101, - 84, 111, 85, 115, 101, 114, 83, 112, 97, 99, 101, 95, 99, 98, 51, - 0, 171, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 100, 105, 109, 101, 110, 115, 105, 111, 110, 115, 95, 99, - 98, 51, 0, 171, 1, 0, 3, 0, 1, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 99, 101, 110, 116, 101, 114, 0, 97, 110, 103, - 108, 101, 0, 171, 171, 171, 0, 0, 3, 0, 1, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 115, 116, 97, 114, 116, 95, 111, 102, - 102, 115, 101, 116, 0, 101, 110, 100, 95, 111, 102, 102, 115, 101, 116, - 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, 171, 171, 73, 83, 71, 78, 104, 0, 0, - 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, - 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, 92, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, - 0, 0, 12, 12, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, - 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, - 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 97, - 114, 103, 101, 116, 0, 171, 171, 225, 237, 0, 0, 0, 0, 0, 0, - 83, 97, 109, 112, 108, 101, 77, 97, 115, 107, 101, 100, 84, 101, 120, - 116, 117, 114, 101, 0, 68, 4, 0, 0, 68, 88, 66, 67, 77, 85, - 167, 240, 56, 56, 155, 78, 125, 96, 49, 253, 103, 100, 22, 62, 1, - 0, 0, 0, 68, 4, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, - 248, 0, 0, 0, 244, 1, 0, 0, 112, 2, 0, 0, 160, 3, 0, - 0, 212, 3, 0, 0, 65, 111, 110, 57, 184, 0, 0, 0, 184, 0, - 0, 0, 0, 2, 254, 255, 132, 0, 0, 0, 52, 0, 0, 0, 1, - 0, 36, 0, 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 36, 0, - 1, 0, 48, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 254, 255, 81, 0, 0, 5, 4, 0, - 15, 160, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, - 0, 0, 0, 31, 0, 0, 2, 5, 0, 0, 128, 0, 0, 15, 144, - 4, 0, 0, 4, 0, 0, 3, 224, 0, 0, 228, 144, 2, 0, 238, - 160, 2, 0, 228, 160, 4, 0, 0, 4, 0, 0, 12, 224, 0, 0, - 20, 144, 3, 0, 180, 160, 3, 0, 20, 160, 4, 0, 0, 4, 0, - 0, 3, 128, 0, 0, 228, 144, 1, 0, 238, 160, 1, 0, 228, 160, - 2, 0, 0, 3, 0, 0, 3, 192, 0, 0, 228, 128, 0, 0, 228, - 160, 1, 0, 0, 2, 0, 0, 12, 192, 4, 0, 68, 160, 255, 255, - 0, 0, 83, 72, 68, 82, 244, 0, 0, 0, 64, 0, 1, 0, 61, - 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 95, 0, 0, 3, 50, 16, 16, 0, 0, 0, 0, - 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 101, 0, 0, 3, 50, 32, 16, 0, 1, 0, 0, 0, 101, - 0, 0, 3, 194, 32, 16, 0, 1, 0, 0, 0, 50, 0, 0, 11, - 50, 32, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 8, 194, - 32, 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 63, 50, 0, 0, - 11, 50, 32, 16, 0, 1, 0, 0, 0, 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 70, - 128, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 11, - 194, 32, 16, 0, 1, 0, 0, 0, 6, 20, 16, 0, 0, 0, 0, - 0, 166, 142, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 132, - 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 62, 0, 0, 1, 83, - 84, 65, 84, 116, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 68, 69, 70, 40, 1, 0, 0, 1, 0, 0, 0, - 64, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 0, 4, 254, - 255, 0, 1, 0, 0, 246, 0, 0, 0, 60, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 99, 98, 48, 0, - 60, 0, 0, 0, 4, 0, 0, 0, 88, 0, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, - 0, 0, 0, 212, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 222, 0, 0, - 0, 32, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, 0, - 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 48, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, - 81, 117, 97, 100, 68, 101, 115, 99, 0, 171, 171, 171, 1, 0, 3, - 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 101, - 120, 67, 111, 111, 114, 100, 115, 0, 77, 97, 115, 107, 84, 101, 120, - 67, 111, 111, 114, 100, 115, 0, 84, 101, 120, 116, 67, 111, 108, 111, - 114, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, - 46, 49, 54, 51, 56, 52, 0, 73, 83, 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 7, 3, - 0, 0, 80, 79, 83, 73, 84, 73, 79, 78, 0, 171, 171, 171, 79, - 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, - 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, - 12, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, 0, 0, 12, 3, 0, 0, 83, 86, 95, - 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, - 82, 68, 0, 171, 171, 171, 85, 250, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 212, 3, 0, 0, - 68, 88, 66, 67, 98, 136, 224, 212, 103, 235, 205, 77, 125, 241, 101, - 150, 199, 56, 208, 85, 1, 0, 0, 0, 212, 3, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, 224, 0, 0, 0, 188, 1, 0, 0, 56, - 2, 0, 0, 48, 3, 0, 0, 160, 3, 0, 0, 65, 111, 110, 57, - 160, 0, 0, 0, 160, 0, 0, 0, 0, 2, 255, 255, 116, 0, 0, - 0, 44, 0, 0, 0, 0, 0, 44, 0, 0, 0, 44, 0, 0, 0, - 44, 0, 2, 0, 36, 0, 0, 0, 44, 0, 0, 0, 0, 0, 1, - 1, 1, 0, 1, 2, 255, 255, 31, 0, 0, 2, 0, 0, 0, 128, - 0, 0, 15, 176, 31, 0, 0, 2, 0, 0, 0, 144, 0, 8, 15, - 160, 31, 0, 0, 2, 0, 0, 0, 144, 1, 8, 15, 160, 1, 0, - 0, 2, 0, 0, 3, 128, 0, 0, 235, 176, 66, 0, 0, 3, 1, - 0, 15, 128, 0, 0, 228, 176, 0, 8, 228, 160, 66, 0, 0, 3, - 0, 0, 15, 128, 0, 0, 228, 128, 1, 8, 228, 160, 5, 0, 0, - 3, 0, 0, 15, 128, 0, 0, 255, 128, 1, 0, 228, 128, 1, 0, - 0, 2, 0, 8, 15, 128, 0, 0, 228, 128, 255, 255, 0, 0, 83, - 72, 68, 82, 212, 0, 0, 0, 64, 0, 0, 0, 53, 0, 0, 0, - 90, 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, 0, 90, 0, 0, - 3, 0, 96, 16, 0, 1, 0, 0, 0, 88, 24, 0, 4, 0, 112, - 16, 0, 0, 0, 0, 0, 85, 85, 0, 0, 88, 24, 0, 4, 0, - 112, 16, 0, 1, 0, 0, 0, 85, 85, 0, 0, 98, 16, 0, 3, - 50, 16, 16, 0, 1, 0, 0, 0, 98, 16, 0, 3, 194, 16, 16, - 0, 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, 0, 0, 0, - 0, 0, 104, 0, 0, 2, 2, 0, 0, 0, 69, 0, 0, 9, 242, - 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 1, 0, 0, 0, - 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, - 0, 69, 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 230, 26, - 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 1, 0, 0, 0, 0, - 96, 16, 0, 1, 0, 0, 0, 56, 0, 0, 7, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 246, 15, 16, - 0, 1, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, - 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, - 69, 70, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 28, 0, 0, 0, 0, 4, 255, 255, 0, 1, 0, 0, - 187, 0, 0, 0, 156, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 165, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, 2, 0, 0, - 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 182, 0, 0, 0, 2, - 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, - 1, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 115, 83, 97, - 109, 112, 108, 101, 114, 0, 115, 77, 97, 115, 107, 83, 97, 109, 112, - 108, 101, 114, 0, 116, 101, 120, 0, 109, 97, 115, 107, 0, 77, 105, - 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, - 56, 52, 0, 171, 171, 171, 73, 83, 71, 78, 104, 0, 0, 0, 3, - 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, 92, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, - 12, 12, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, - 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 79, 83, - 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 97, 114, 103, - 101, 116, 0, 171, 171, 177, 254, 0, 0, 0, 0, 0, 0, 83, 97, - 109, 112, 108, 101, 84, 101, 120, 116, 117, 114, 101, 87, 105, 116, 104, - 83, 104, 97, 100, 111, 119, 0, 4, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 128, 63, 1, 0, 0, 0, 0, 0, 128, 63, 1, 0, 0, - 0, 0, 0, 128, 63, 1, 0, 0, 0, 0, 0, 128, 63, 1, 0, - 0, 0, 3, 0, 0, 0, 255, 255, 255, 255, 68, 4, 0, 0, 68, - 88, 66, 67, 77, 85, 167, 240, 56, 56, 155, 78, 125, 96, 49, 253, - 103, 100, 22, 62, 1, 0, 0, 0, 68, 4, 0, 0, 6, 0, 0, - 0, 56, 0, 0, 0, 248, 0, 0, 0, 244, 1, 0, 0, 112, 2, - 0, 0, 160, 3, 0, 0, 212, 3, 0, 0, 65, 111, 110, 57, 184, - 0, 0, 0, 184, 0, 0, 0, 0, 2, 254, 255, 132, 0, 0, 0, - 52, 0, 0, 0, 1, 0, 36, 0, 0, 0, 48, 0, 0, 0, 48, - 0, 0, 0, 36, 0, 1, 0, 48, 0, 0, 0, 0, 0, 3, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 254, 255, 81, - 0, 0, 5, 4, 0, 15, 160, 0, 0, 0, 0, 0, 0, 128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 2, 5, 0, 0, - 128, 0, 0, 15, 144, 4, 0, 0, 4, 0, 0, 3, 224, 0, 0, - 228, 144, 2, 0, 238, 160, 2, 0, 228, 160, 4, 0, 0, 4, 0, - 0, 12, 224, 0, 0, 20, 144, 3, 0, 180, 160, 3, 0, 20, 160, - 4, 0, 0, 4, 0, 0, 3, 128, 0, 0, 228, 144, 1, 0, 238, - 160, 1, 0, 228, 160, 2, 0, 0, 3, 0, 0, 3, 192, 0, 0, - 228, 128, 0, 0, 228, 160, 1, 0, 0, 2, 0, 0, 12, 192, 4, - 0, 68, 160, 255, 255, 0, 0, 83, 72, 68, 82, 244, 0, 0, 0, - 64, 0, 1, 0, 61, 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 95, 0, 0, 3, 50, 16, - 16, 0, 0, 0, 0, 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 101, 0, 0, 3, 50, 32, 16, 0, - 1, 0, 0, 0, 101, 0, 0, 3, 194, 32, 16, 0, 1, 0, 0, - 0, 50, 0, 0, 11, 50, 32, 16, 0, 0, 0, 0, 0, 70, 16, - 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 54, 0, 0, 8, 194, 32, 16, 0, 0, 0, 0, 0, 2, 64, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 128, 63, 50, 0, 0, 11, 50, 32, 16, 0, 1, 0, 0, 0, 70, - 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 50, 0, 0, 11, 194, 32, 16, 0, 1, 0, 0, 0, 6, 20, - 16, 0, 0, 0, 0, 0, 166, 142, 32, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 6, 132, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, 0, 0, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, 69, 70, 40, 1, 0, - 0, 1, 0, 0, 0, 64, 0, 0, 0, 1, 0, 0, 0, 28, 0, - 0, 0, 0, 4, 254, 255, 0, 1, 0, 0, 246, 0, 0, 0, 60, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 99, 98, 48, 0, 60, 0, 0, 0, 4, 0, 0, 0, 88, 0, - 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, - 196, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 16, 0, 0, - 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, 0, - 0, 0, 222, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 2, - 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, - 48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, - 0, 0, 0, 0, 0, 81, 117, 97, 100, 68, 101, 115, 99, 0, 171, - 171, 171, 1, 0, 3, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 84, 101, 120, 67, 111, 111, 114, 100, 115, 0, 77, 97, - 115, 107, 84, 101, 120, 67, 111, 111, 114, 100, 115, 0, 84, 101, 120, - 116, 67, 111, 108, 111, 114, 0, 77, 105, 99, 114, 111, 115, 111, 102, - 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, - 101, 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, - 46, 57, 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 73, 83, 71, - 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 7, 3, 0, 0, 80, 79, 83, 73, 84, 73, 79, 78, - 0, 171, 171, 171, 79, 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, - 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 3, 12, 0, 0, 92, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, 3, - 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, - 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 217, 2, 1, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 232, 9, 0, 0, 68, 88, 66, 67, 128, 131, 241, 85, 199, 21, - 192, 89, 55, 255, 82, 94, 121, 175, 16, 184, 1, 0, 0, 0, 232, - 9, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 248, 2, 0, 0, - 8, 7, 0, 0, 132, 7, 0, 0, 68, 9, 0, 0, 180, 9, 0, - 0, 65, 111, 110, 57, 184, 2, 0, 0, 184, 2, 0, 0, 0, 2, - 255, 255, 120, 2, 0, 0, 64, 0, 0, 0, 2, 0, 40, 0, 0, - 0, 64, 0, 0, 0, 64, 0, 1, 0, 36, 0, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 0, 4, 0, 3, 0, 0, 0, 0, 0, 1, 2, - 255, 255, 31, 0, 0, 2, 0, 0, 0, 128, 0, 0, 15, 176, 31, - 0, 0, 2, 0, 0, 0, 144, 0, 8, 15, 160, 2, 0, 0, 3, - 0, 0, 1, 128, 0, 0, 0, 176, 0, 0, 85, 160, 1, 0, 0, - 2, 0, 0, 2, 128, 0, 0, 85, 176, 2, 0, 0, 3, 1, 0, - 1, 128, 0, 0, 0, 176, 0, 0, 0, 160, 1, 0, 0, 2, 1, - 0, 2, 128, 0, 0, 85, 176, 66, 0, 0, 3, 0, 0, 15, 128, - 0, 0, 228, 128, 0, 8, 228, 160, 66, 0, 0, 3, 1, 0, 15, - 128, 1, 0, 228, 128, 0, 8, 228, 160, 5, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 255, 128, 3, 0, 85, 160, 4, 0, 0, 4, 0, - 0, 1, 128, 3, 0, 0, 160, 1, 0, 255, 128, 0, 0, 0, 128, - 2, 0, 0, 3, 1, 0, 1, 128, 0, 0, 0, 176, 0, 0, 170, - 160, 1, 0, 0, 2, 1, 0, 2, 128, 0, 0, 85, 176, 2, 0, - 0, 3, 2, 0, 1, 128, 0, 0, 0, 176, 0, 0, 255, 160, 1, - 0, 0, 2, 2, 0, 2, 128, 0, 0, 85, 176, 66, 0, 0, 3, - 1, 0, 15, 128, 1, 0, 228, 128, 0, 8, 228, 160, 66, 0, 0, - 3, 2, 0, 15, 128, 2, 0, 228, 128, 0, 8, 228, 160, 4, 0, - 0, 4, 0, 0, 1, 128, 3, 0, 170, 160, 1, 0, 255, 128, 0, - 0, 0, 128, 4, 0, 0, 4, 0, 0, 1, 128, 3, 0, 255, 160, - 2, 0, 255, 128, 0, 0, 0, 128, 2, 0, 0, 3, 1, 0, 1, - 128, 0, 0, 0, 176, 1, 0, 0, 160, 1, 0, 0, 2, 1, 0, - 2, 128, 0, 0, 85, 176, 2, 0, 0, 3, 2, 0, 1, 128, 0, - 0, 0, 176, 1, 0, 85, 160, 1, 0, 0, 2, 2, 0, 2, 128, - 0, 0, 85, 176, 66, 0, 0, 3, 1, 0, 15, 128, 1, 0, 228, - 128, 0, 8, 228, 160, 66, 0, 0, 3, 2, 0, 15, 128, 2, 0, - 228, 128, 0, 8, 228, 160, 4, 0, 0, 4, 0, 0, 1, 128, 4, - 0, 0, 160, 1, 0, 255, 128, 0, 0, 0, 128, 4, 0, 0, 4, - 0, 0, 1, 128, 4, 0, 85, 160, 2, 0, 255, 128, 0, 0, 0, - 128, 2, 0, 0, 3, 1, 0, 1, 128, 0, 0, 0, 176, 1, 0, - 170, 160, 1, 0, 0, 2, 1, 0, 2, 128, 0, 0, 85, 176, 2, - 0, 0, 3, 2, 0, 1, 128, 0, 0, 0, 176, 1, 0, 255, 160, - 1, 0, 0, 2, 2, 0, 2, 128, 0, 0, 85, 176, 66, 0, 0, - 3, 1, 0, 15, 128, 1, 0, 228, 128, 0, 8, 228, 160, 66, 0, - 0, 3, 2, 0, 15, 128, 2, 0, 228, 128, 0, 8, 228, 160, 4, - 0, 0, 4, 0, 0, 1, 128, 4, 0, 170, 160, 1, 0, 255, 128, - 0, 0, 0, 128, 4, 0, 0, 4, 0, 0, 1, 128, 4, 0, 255, - 160, 2, 0, 255, 128, 0, 0, 0, 128, 2, 0, 0, 3, 1, 0, - 1, 128, 0, 0, 0, 176, 2, 0, 0, 160, 1, 0, 0, 2, 1, - 0, 2, 128, 0, 0, 85, 176, 66, 0, 0, 3, 1, 0, 15, 128, - 1, 0, 228, 128, 0, 8, 228, 160, 4, 0, 0, 4, 0, 0, 1, - 128, 5, 0, 0, 160, 1, 0, 255, 128, 0, 0, 0, 128, 5, 0, - 0, 3, 0, 0, 15, 128, 0, 0, 0, 128, 6, 0, 228, 160, 1, - 0, 0, 2, 0, 8, 15, 128, 0, 0, 228, 128, 255, 255, 0, 0, - 83, 72, 68, 82, 8, 4, 0, 0, 64, 0, 0, 0, 2, 1, 0, - 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 10, 0, - 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, 0, 88, - 24, 0, 4, 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, 0, 0, - 98, 16, 0, 3, 50, 16, 16, 0, 1, 0, 0, 0, 101, 0, 0, - 3, 242, 32, 16, 0, 0, 0, 0, 0, 104, 0, 0, 2, 4, 0, - 0, 0, 0, 0, 0, 8, 242, 0, 16, 0, 0, 0, 0, 0, 6, - 16, 16, 0, 1, 0, 0, 0, 38, 135, 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, 0, 5, 82, 0, 16, 0, 1, 0, 0, - 0, 86, 7, 16, 0, 0, 0, 0, 0, 54, 0, 0, 5, 162, 0, - 16, 0, 1, 0, 0, 0, 86, 21, 16, 0, 1, 0, 0, 0, 69, - 0, 0, 9, 242, 0, 16, 0, 2, 0, 0, 0, 230, 10, 16, 0, - 1, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, - 0, 0, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 1, 0, - 0, 0, 70, 0, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 0, - 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 56, 0, 0, 8, - 18, 0, 16, 0, 1, 0, 0, 0, 58, 0, 16, 0, 2, 0, 0, - 0, 26, 128, 32, 0, 0, 0, 0, 0, 6, 0, 0, 0, 50, 0, - 0, 10, 18, 0, 16, 0, 1, 0, 0, 0, 10, 128, 32, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 58, 0, 16, 0, 1, 0, 0, 0, - 10, 0, 16, 0, 1, 0, 0, 0, 54, 0, 0, 5, 162, 0, 16, - 0, 0, 0, 0, 0, 86, 21, 16, 0, 1, 0, 0, 0, 69, 0, - 0, 9, 242, 0, 16, 0, 2, 0, 0, 0, 70, 0, 16, 0, 0, - 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, - 0, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, - 0, 230, 10, 16, 0, 0, 0, 0, 0, 70, 126, 16, 0, 0, 0, - 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 50, 0, 0, 10, 18, - 0, 16, 0, 0, 0, 0, 0, 42, 128, 32, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 58, 0, 16, 0, 2, 0, 0, 0, 10, 0, 16, - 0, 1, 0, 0, 0, 50, 0, 0, 10, 18, 0, 16, 0, 0, 0, - 0, 0, 58, 128, 32, 0, 0, 0, 0, 0, 6, 0, 0, 0, 58, - 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 242, 0, 16, 0, 1, 0, 0, 0, 6, 16, 16, - 0, 1, 0, 0, 0, 38, 135, 32, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 54, 0, 0, 5, 82, 0, 16, 0, 2, 0, 0, 0, 86, - 7, 16, 0, 1, 0, 0, 0, 54, 0, 0, 5, 162, 0, 16, 0, - 2, 0, 0, 0, 86, 21, 16, 0, 1, 0, 0, 0, 69, 0, 0, - 9, 242, 0, 16, 0, 3, 0, 0, 0, 70, 0, 16, 0, 2, 0, - 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, - 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 2, 0, 0, 0, - 230, 10, 16, 0, 2, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, - 0, 0, 96, 16, 0, 0, 0, 0, 0, 50, 0, 0, 10, 18, 0, - 16, 0, 0, 0, 0, 0, 10, 128, 32, 0, 0, 0, 0, 0, 7, - 0, 0, 0, 58, 0, 16, 0, 3, 0, 0, 0, 10, 0, 16, 0, - 0, 0, 0, 0, 50, 0, 0, 10, 18, 0, 16, 0, 0, 0, 0, - 0, 26, 128, 32, 0, 0, 0, 0, 0, 7, 0, 0, 0, 58, 0, - 16, 0, 2, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 54, - 0, 0, 5, 162, 0, 16, 0, 1, 0, 0, 0, 86, 21, 16, 0, - 1, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 2, 0, 0, - 0, 70, 0, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 0, 0, - 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 69, 0, 0, 9, 242, - 0, 16, 0, 1, 0, 0, 0, 230, 10, 16, 0, 1, 0, 0, 0, - 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, - 0, 50, 0, 0, 10, 18, 0, 16, 0, 0, 0, 0, 0, 42, 128, - 32, 0, 0, 0, 0, 0, 7, 0, 0, 0, 58, 0, 16, 0, 2, - 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 50, 0, 0, 10, - 18, 0, 16, 0, 0, 0, 0, 0, 58, 128, 32, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 58, 0, 16, 0, 1, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 8, 18, 0, 16, 0, 1, - 0, 0, 0, 10, 16, 16, 0, 1, 0, 0, 0, 10, 128, 32, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 54, 0, 0, 5, 34, 0, 16, - 0, 1, 0, 0, 0, 26, 16, 16, 0, 1, 0, 0, 0, 69, 0, - 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 70, 0, 16, 0, 1, - 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, - 0, 0, 0, 0, 50, 0, 0, 10, 18, 0, 16, 0, 0, 0, 0, - 0, 10, 128, 32, 0, 0, 0, 0, 0, 8, 0, 0, 0, 58, 0, - 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 56, - 0, 0, 8, 242, 32, 16, 0, 0, 0, 0, 0, 6, 0, 16, 0, - 0, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 9, 0, 0, - 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, 0, 0, 30, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 13, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, 69, 70, 184, 1, - 0, 0, 1, 0, 0, 0, 148, 0, 0, 0, 3, 0, 0, 0, 28, - 0, 0, 0, 0, 4, 255, 255, 0, 1, 0, 0, 132, 1, 0, 0, - 124, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 139, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, - 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, - 12, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 115, 83, 104, 97, 100, 111, 119, 83, 97, - 109, 112, 108, 101, 114, 0, 116, 101, 120, 0, 99, 98, 49, 0, 171, - 143, 0, 0, 0, 4, 0, 0, 0, 172, 0, 0, 0, 160, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, - 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 28, 1, 0, 0, 0, - 0, 0, 0, 44, 1, 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, - 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 0, 0, 76, 1, 0, - 0, 96, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 88, 1, - 0, 0, 0, 0, 0, 0, 104, 1, 0, 0, 144, 0, 0, 0, 16, - 0, 0, 0, 2, 0, 0, 0, 116, 1, 0, 0, 0, 0, 0, 0, - 66, 108, 117, 114, 79, 102, 102, 115, 101, 116, 115, 72, 0, 171, 171, - 171, 1, 0, 3, 0, 1, 0, 4, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 66, 108, 117, 114, 79, 102, 102, 115, 101, 116, 115, 86, 0, - 171, 171, 171, 1, 0, 3, 0, 1, 0, 4, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 66, 108, 117, 114, 87, 101, 105, 103, 104, 116, 115, - 0, 1, 0, 3, 0, 1, 0, 4, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 83, 104, 97, 100, 111, 119, 67, 111, 108, 111, 114, 0, 1, - 0, 3, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, - 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, - 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, - 54, 51, 56, 52, 0, 171, 171, 73, 83, 71, 78, 104, 0, 0, 0, - 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, - 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, 92, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, - 0, 12, 0, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, - 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 79, - 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 97, 114, - 103, 101, 116, 0, 171, 171, 53, 7, 1, 0, 0, 0, 0, 0, 80, - 49, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 128, 63, 1, - 0, 0, 0, 0, 0, 128, 63, 1, 0, 0, 0, 0, 0, 128, 63, - 1, 0, 0, 0, 0, 0, 128, 63, 1, 0, 0, 0, 3, 0, 0, - 0, 255, 255, 255, 255, 68, 4, 0, 0, 68, 88, 66, 67, 77, 85, - 167, 240, 56, 56, 155, 78, 125, 96, 49, 253, 103, 100, 22, 62, 1, - 0, 0, 0, 68, 4, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, - 248, 0, 0, 0, 244, 1, 0, 0, 112, 2, 0, 0, 160, 3, 0, - 0, 212, 3, 0, 0, 65, 111, 110, 57, 184, 0, 0, 0, 184, 0, - 0, 0, 0, 2, 254, 255, 132, 0, 0, 0, 52, 0, 0, 0, 1, - 0, 36, 0, 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 36, 0, - 1, 0, 48, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 254, 255, 81, 0, 0, 5, 4, 0, - 15, 160, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, - 0, 0, 0, 31, 0, 0, 2, 5, 0, 0, 128, 0, 0, 15, 144, - 4, 0, 0, 4, 0, 0, 3, 224, 0, 0, 228, 144, 2, 0, 238, - 160, 2, 0, 228, 160, 4, 0, 0, 4, 0, 0, 12, 224, 0, 0, - 20, 144, 3, 0, 180, 160, 3, 0, 20, 160, 4, 0, 0, 4, 0, - 0, 3, 128, 0, 0, 228, 144, 1, 0, 238, 160, 1, 0, 228, 160, - 2, 0, 0, 3, 0, 0, 3, 192, 0, 0, 228, 128, 0, 0, 228, - 160, 1, 0, 0, 2, 0, 0, 12, 192, 4, 0, 68, 160, 255, 255, - 0, 0, 83, 72, 68, 82, 244, 0, 0, 0, 64, 0, 1, 0, 61, - 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 95, 0, 0, 3, 50, 16, 16, 0, 0, 0, 0, - 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 101, 0, 0, 3, 50, 32, 16, 0, 1, 0, 0, 0, 101, - 0, 0, 3, 194, 32, 16, 0, 1, 0, 0, 0, 50, 0, 0, 11, - 50, 32, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, - 0, 230, 138, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 8, 194, - 32, 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 63, 50, 0, 0, - 11, 50, 32, 16, 0, 1, 0, 0, 0, 70, 16, 16, 0, 0, 0, - 0, 0, 230, 138, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 70, - 128, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 11, - 194, 32, 16, 0, 1, 0, 0, 0, 6, 20, 16, 0, 0, 0, 0, - 0, 166, 142, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 132, - 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 62, 0, 0, 1, 83, - 84, 65, 84, 116, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 68, 69, 70, 40, 1, 0, 0, 1, 0, 0, 0, - 64, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 0, 4, 254, - 255, 0, 1, 0, 0, 246, 0, 0, 0, 60, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 99, 98, 48, 0, - 60, 0, 0, 0, 4, 0, 0, 0, 88, 0, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, - 0, 0, 0, 212, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, - 2, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 222, 0, 0, - 0, 32, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, 0, - 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 48, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, - 81, 117, 97, 100, 68, 101, 115, 99, 0, 171, 171, 171, 1, 0, 3, - 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 101, - 120, 67, 111, 111, 114, 100, 115, 0, 77, 97, 115, 107, 84, 101, 120, - 67, 111, 111, 114, 100, 115, 0, 84, 101, 120, 116, 67, 111, 108, 111, - 114, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, - 46, 49, 54, 51, 56, 52, 0, 73, 83, 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 7, 3, - 0, 0, 80, 79, 83, 73, 84, 73, 79, 78, 0, 171, 171, 171, 79, - 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, - 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, - 12, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, 0, 0, 12, 3, 0, 0, 83, 86, 95, - 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, - 82, 68, 0, 171, 171, 171, 92, 17, 1, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 172, 9, 0, 0, - 68, 88, 66, 67, 67, 47, 1, 244, 0, 102, 246, 41, 38, 220, 84, - 204, 156, 139, 96, 25, 1, 0, 0, 0, 172, 9, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, 220, 2, 0, 0, 204, 6, 0, 0, 72, - 7, 0, 0, 8, 9, 0, 0, 120, 9, 0, 0, 65, 111, 110, 57, - 156, 2, 0, 0, 156, 2, 0, 0, 0, 2, 255, 255, 104, 2, 0, - 0, 52, 0, 0, 0, 1, 0, 40, 0, 0, 0, 52, 0, 0, 0, - 52, 0, 1, 0, 36, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 2, 255, 255, - 31, 0, 0, 2, 0, 0, 0, 128, 0, 0, 15, 176, 31, 0, 0, - 2, 0, 0, 0, 144, 0, 8, 15, 160, 2, 0, 0, 3, 0, 0, - 2, 128, 0, 0, 85, 176, 0, 0, 85, 160, 1, 0, 0, 2, 0, - 0, 1, 128, 0, 0, 0, 176, 2, 0, 0, 3, 1, 0, 2, 128, - 0, 0, 85, 176, 0, 0, 0, 160, 1, 0, 0, 2, 1, 0, 1, - 128, 0, 0, 0, 176, 66, 0, 0, 3, 0, 0, 15, 128, 0, 0, - 228, 128, 0, 8, 228, 160, 66, 0, 0, 3, 1, 0, 15, 128, 1, - 0, 228, 128, 0, 8, 228, 160, 5, 0, 0, 3, 0, 0, 15, 128, - 0, 0, 228, 128, 3, 0, 85, 160, 4, 0, 0, 4, 0, 0, 15, - 128, 3, 0, 0, 160, 1, 0, 228, 128, 0, 0, 228, 128, 2, 0, - 0, 3, 1, 0, 2, 128, 0, 0, 85, 176, 0, 0, 170, 160, 1, - 0, 0, 2, 1, 0, 1, 128, 0, 0, 0, 176, 2, 0, 0, 3, - 2, 0, 2, 128, 0, 0, 85, 176, 0, 0, 255, 160, 1, 0, 0, - 2, 2, 0, 1, 128, 0, 0, 0, 176, 66, 0, 0, 3, 1, 0, - 15, 128, 1, 0, 228, 128, 0, 8, 228, 160, 66, 0, 0, 3, 2, - 0, 15, 128, 2, 0, 228, 128, 0, 8, 228, 160, 4, 0, 0, 4, - 0, 0, 15, 128, 3, 0, 170, 160, 1, 0, 228, 128, 0, 0, 228, - 128, 4, 0, 0, 4, 0, 0, 15, 128, 3, 0, 255, 160, 2, 0, - 228, 128, 0, 0, 228, 128, 2, 0, 0, 3, 1, 0, 2, 128, 0, - 0, 85, 176, 1, 0, 0, 160, 1, 0, 0, 2, 1, 0, 1, 128, - 0, 0, 0, 176, 2, 0, 0, 3, 2, 0, 2, 128, 0, 0, 85, - 176, 1, 0, 85, 160, 1, 0, 0, 2, 2, 0, 1, 128, 0, 0, - 0, 176, 66, 0, 0, 3, 1, 0, 15, 128, 1, 0, 228, 128, 0, - 8, 228, 160, 66, 0, 0, 3, 2, 0, 15, 128, 2, 0, 228, 128, - 0, 8, 228, 160, 4, 0, 0, 4, 0, 0, 15, 128, 4, 0, 0, - 160, 1, 0, 228, 128, 0, 0, 228, 128, 4, 0, 0, 4, 0, 0, - 15, 128, 4, 0, 85, 160, 2, 0, 228, 128, 0, 0, 228, 128, 2, - 0, 0, 3, 1, 0, 2, 128, 0, 0, 85, 176, 1, 0, 170, 160, - 1, 0, 0, 2, 1, 0, 1, 128, 0, 0, 0, 176, 2, 0, 0, - 3, 2, 0, 2, 128, 0, 0, 85, 176, 1, 0, 255, 160, 1, 0, - 0, 2, 2, 0, 1, 128, 0, 0, 0, 176, 66, 0, 0, 3, 1, - 0, 15, 128, 1, 0, 228, 128, 0, 8, 228, 160, 66, 0, 0, 3, - 2, 0, 15, 128, 2, 0, 228, 128, 0, 8, 228, 160, 4, 0, 0, - 4, 0, 0, 15, 128, 4, 0, 170, 160, 1, 0, 228, 128, 0, 0, - 228, 128, 4, 0, 0, 4, 0, 0, 15, 128, 4, 0, 255, 160, 2, - 0, 228, 128, 0, 0, 228, 128, 2, 0, 0, 3, 1, 0, 2, 128, - 0, 0, 85, 176, 2, 0, 0, 160, 1, 0, 0, 2, 1, 0, 1, - 128, 0, 0, 0, 176, 66, 0, 0, 3, 1, 0, 15, 128, 1, 0, - 228, 128, 0, 8, 228, 160, 4, 0, 0, 4, 0, 0, 15, 128, 5, - 0, 0, 160, 1, 0, 228, 128, 0, 0, 228, 128, 1, 0, 0, 2, - 0, 8, 15, 128, 0, 0, 228, 128, 255, 255, 0, 0, 83, 72, 68, - 82, 232, 3, 0, 0, 64, 0, 0, 0, 250, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 9, 0, 0, 0, 90, - 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, 0, 88, 24, 0, 4, - 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, 0, 0, 98, 16, 0, - 3, 50, 16, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, - 16, 0, 0, 0, 0, 0, 104, 0, 0, 2, 4, 0, 0, 0, 54, - 0, 0, 5, 82, 0, 16, 0, 0, 0, 0, 0, 6, 16, 16, 0, - 1, 0, 0, 0, 0, 0, 0, 8, 242, 0, 16, 0, 1, 0, 0, - 0, 86, 21, 16, 0, 1, 0, 0, 0, 134, 141, 32, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 54, 0, 0, 5, 162, 0, 16, 0, 0, - 0, 0, 0, 6, 8, 16, 0, 1, 0, 0, 0, 69, 0, 0, 9, - 242, 0, 16, 0, 2, 0, 0, 0, 230, 10, 16, 0, 0, 0, 0, - 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, - 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, 70, - 0, 16, 0, 0, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, - 0, 96, 16, 0, 0, 0, 0, 0, 56, 0, 0, 8, 242, 0, 16, - 0, 2, 0, 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, 86, 133, - 32, 0, 0, 0, 0, 0, 6, 0, 0, 0, 50, 0, 0, 10, 242, - 0, 16, 0, 0, 0, 0, 0, 6, 128, 32, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 70, 14, 16, - 0, 2, 0, 0, 0, 54, 0, 0, 5, 82, 0, 16, 0, 1, 0, - 0, 0, 6, 16, 16, 0, 1, 0, 0, 0, 69, 0, 0, 9, 242, - 0, 16, 0, 2, 0, 0, 0, 70, 0, 16, 0, 1, 0, 0, 0, - 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, - 0, 69, 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 230, 10, - 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, - 0, 0, 0, 0, 166, 138, 32, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 70, 14, 16, 0, 2, 0, 0, 0, 70, 14, 16, 0, 0, 0, - 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, 0, 0, 0, 0, 246, - 143, 32, 0, 0, 0, 0, 0, 6, 0, 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 54, 0, 0, - 5, 82, 0, 16, 0, 1, 0, 0, 0, 6, 16, 16, 0, 1, 0, - 0, 0, 0, 0, 0, 8, 242, 0, 16, 0, 2, 0, 0, 0, 86, - 21, 16, 0, 1, 0, 0, 0, 134, 141, 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 54, 0, 0, 5, 162, 0, 16, 0, 1, 0, 0, - 0, 6, 8, 16, 0, 2, 0, 0, 0, 69, 0, 0, 9, 242, 0, - 16, 0, 3, 0, 0, 0, 70, 0, 16, 0, 1, 0, 0, 0, 70, - 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, - 69, 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 230, 10, 16, - 0, 1, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, - 16, 0, 0, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, 0, - 0, 0, 0, 6, 128, 32, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 70, 14, 16, 0, 3, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, - 0, 50, 0, 0, 10, 242, 0, 16, 0, 0, 0, 0, 0, 86, 133, - 32, 0, 0, 0, 0, 0, 7, 0, 0, 0, 70, 14, 16, 0, 1, - 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 54, 0, 0, 5, - 82, 0, 16, 0, 2, 0, 0, 0, 6, 16, 16, 0, 1, 0, 0, - 0, 69, 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 70, 0, - 16, 0, 2, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, - 2, 0, 0, 0, 230, 10, 16, 0, 2, 0, 0, 0, 70, 126, 16, - 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, 0, 0, 0, 0, 166, 138, 32, 0, 0, - 0, 0, 0, 7, 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, - 70, 14, 16, 0, 0, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, - 0, 0, 0, 0, 0, 246, 143, 32, 0, 0, 0, 0, 0, 7, 0, - 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, 70, 14, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 34, 0, 16, 0, 1, 0, 0, 0, - 26, 16, 16, 0, 1, 0, 0, 0, 10, 128, 32, 0, 0, 0, 0, - 0, 5, 0, 0, 0, 54, 0, 0, 5, 18, 0, 16, 0, 1, 0, - 0, 0, 10, 16, 16, 0, 1, 0, 0, 0, 69, 0, 0, 9, 242, - 0, 16, 0, 1, 0, 0, 0, 70, 0, 16, 0, 1, 0, 0, 0, - 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, - 0, 50, 0, 0, 10, 242, 32, 16, 0, 0, 0, 0, 0, 6, 128, - 32, 0, 0, 0, 0, 0, 8, 0, 0, 0, 70, 14, 16, 0, 1, - 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 62, 0, 0, 1, - 83, 84, 65, 84, 116, 0, 0, 0, 29, 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 68, 69, 70, 184, 1, 0, 0, 1, 0, 0, - 0, 148, 0, 0, 0, 3, 0, 0, 0, 28, 0, 0, 0, 0, 4, - 255, 255, 0, 1, 0, 0, 132, 1, 0, 0, 124, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 139, 0, 0, - 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, - 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 143, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 115, 83, 104, 97, 100, 111, 119, 83, 97, 109, 112, 108, 101, 114, - 0, 116, 101, 120, 0, 99, 98, 49, 0, 171, 143, 0, 0, 0, 4, - 0, 0, 0, 172, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 48, 0, 0, - 0, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 0, 0, 44, 1, - 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 60, - 1, 0, 0, 0, 0, 0, 0, 76, 1, 0, 0, 96, 0, 0, 0, - 48, 0, 0, 0, 2, 0, 0, 0, 88, 1, 0, 0, 0, 0, 0, - 0, 104, 1, 0, 0, 144, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 116, 1, 0, 0, 0, 0, 0, 0, 66, 108, 117, 114, 79, - 102, 102, 115, 101, 116, 115, 72, 0, 171, 171, 171, 1, 0, 3, 0, - 1, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 66, 108, 117, - 114, 79, 102, 102, 115, 101, 116, 115, 86, 0, 171, 171, 171, 1, 0, - 3, 0, 1, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 66, - 108, 117, 114, 87, 101, 105, 103, 104, 116, 115, 0, 1, 0, 3, 0, - 1, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 83, 104, 97, - 100, 111, 119, 67, 111, 108, 111, 114, 0, 1, 0, 3, 0, 1, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 105, 99, 114, 111, - 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, - 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, - 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, - 171, 171, 73, 83, 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, 8, - 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, - 0, 0, 3, 3, 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, - 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, - 67, 79, 79, 82, 68, 0, 171, 171, 171, 79, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 83, 86, 95, 84, 97, 114, 103, 101, 116, 0, 171, - 171, 184, 21, 1, 0, 0, 0, 0, 0, 80, 50, 0, 4, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 128, 63, 1, 0, 0, 0, 0, 0, - 128, 63, 1, 0, 0, 0, 0, 0, 128, 63, 1, 0, 0, 0, 0, - 0, 128, 63, 1, 0, 0, 0, 3, 0, 0, 0, 255, 255, 255, 255, - 68, 4, 0, 0, 68, 88, 66, 67, 77, 85, 167, 240, 56, 56, 155, - 78, 125, 96, 49, 253, 103, 100, 22, 62, 1, 0, 0, 0, 68, 4, - 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 248, 0, 0, 0, 244, - 1, 0, 0, 112, 2, 0, 0, 160, 3, 0, 0, 212, 3, 0, 0, - 65, 111, 110, 57, 184, 0, 0, 0, 184, 0, 0, 0, 0, 2, 254, - 255, 132, 0, 0, 0, 52, 0, 0, 0, 1, 0, 36, 0, 0, 0, - 48, 0, 0, 0, 48, 0, 0, 0, 36, 0, 1, 0, 48, 0, 0, - 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 254, 255, 81, 0, 0, 5, 4, 0, 15, 160, 0, 0, 0, - 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, - 0, 2, 5, 0, 0, 128, 0, 0, 15, 144, 4, 0, 0, 4, 0, - 0, 3, 224, 0, 0, 228, 144, 2, 0, 238, 160, 2, 0, 228, 160, - 4, 0, 0, 4, 0, 0, 12, 224, 0, 0, 20, 144, 3, 0, 180, - 160, 3, 0, 20, 160, 4, 0, 0, 4, 0, 0, 3, 128, 0, 0, - 228, 144, 1, 0, 238, 160, 1, 0, 228, 160, 2, 0, 0, 3, 0, - 0, 3, 192, 0, 0, 228, 128, 0, 0, 228, 160, 1, 0, 0, 2, - 0, 0, 12, 192, 4, 0, 68, 160, 255, 255, 0, 0, 83, 72, 68, - 82, 244, 0, 0, 0, 64, 0, 1, 0, 61, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, 95, - 0, 0, 3, 50, 16, 16, 0, 0, 0, 0, 0, 103, 0, 0, 4, - 242, 32, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 101, 0, 0, - 3, 50, 32, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 194, 32, - 16, 0, 1, 0, 0, 0, 50, 0, 0, 11, 50, 32, 16, 0, 0, - 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 54, 0, 0, 8, 194, 32, 16, 0, 0, 0, - 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 63, 50, 0, 0, 11, 50, 32, 16, 0, - 1, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 70, 128, 32, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 50, 0, 0, 11, 194, 32, 16, 0, 1, - 0, 0, 0, 6, 20, 16, 0, 0, 0, 0, 0, 166, 142, 32, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 6, 132, 32, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, - 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, - 69, 70, 40, 1, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, 1, - 0, 0, 0, 28, 0, 0, 0, 0, 4, 254, 255, 0, 1, 0, 0, - 246, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 99, 98, 48, 0, 60, 0, 0, 0, 4, - 0, 0, 0, 88, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 212, 0, - 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, - 0, 0, 0, 0, 0, 0, 0, 222, 0, 0, 0, 32, 0, 0, 0, - 16, 0, 0, 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, - 0, 236, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 81, 117, 97, 100, 68, - 101, 115, 99, 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84, 101, 120, 67, 111, 111, 114, - 100, 115, 0, 77, 97, 115, 107, 84, 101, 120, 67, 111, 111, 114, 100, - 115, 0, 84, 101, 120, 116, 67, 111, 108, 111, 114, 0, 77, 105, 99, - 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, - 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, 101, - 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, 56, - 52, 0, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, - 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 7, 3, 0, 0, 80, 79, 83, - 73, 84, 73, 79, 78, 0, 171, 171, 171, 79, 83, 71, 78, 104, 0, - 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 12, 0, 0, 92, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, - 0, 0, 0, 12, 3, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, - 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, - 171, 163, 31, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 164, 10, 0, 0, 68, 88, 66, 67, 70, - 166, 174, 156, 153, 145, 163, 116, 127, 37, 205, 162, 136, 116, 62, 222, - 1, 0, 0, 0, 164, 10, 0, 0, 6, 0, 0, 0, 56, 0, 0, - 0, 24, 3, 0, 0, 112, 7, 0, 0, 236, 7, 0, 0, 0, 10, - 0, 0, 112, 10, 0, 0, 65, 111, 110, 57, 216, 2, 0, 0, 216, - 2, 0, 0, 0, 2, 255, 255, 160, 2, 0, 0, 56, 0, 0, 0, - 1, 0, 44, 0, 0, 0, 56, 0, 0, 0, 56, 0, 2, 0, 36, - 0, 0, 0, 56, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 3, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 2, 255, 255, 31, - 0, 0, 2, 0, 0, 0, 128, 0, 0, 15, 176, 31, 0, 0, 2, - 0, 0, 0, 144, 0, 8, 15, 160, 31, 0, 0, 2, 0, 0, 0, - 144, 1, 8, 15, 160, 2, 0, 0, 3, 0, 0, 2, 128, 0, 0, - 85, 176, 0, 0, 85, 160, 1, 0, 0, 2, 0, 0, 1, 128, 0, - 0, 0, 176, 2, 0, 0, 3, 1, 0, 2, 128, 0, 0, 85, 176, - 0, 0, 0, 160, 1, 0, 0, 2, 1, 0, 1, 128, 0, 0, 0, - 176, 66, 0, 0, 3, 0, 0, 15, 128, 0, 0, 228, 128, 1, 8, - 228, 160, 66, 0, 0, 3, 1, 0, 15, 128, 1, 0, 228, 128, 1, - 8, 228, 160, 5, 0, 0, 3, 0, 0, 15, 128, 0, 0, 228, 128, - 3, 0, 85, 160, 4, 0, 0, 4, 0, 0, 15, 128, 3, 0, 0, - 160, 1, 0, 228, 128, 0, 0, 228, 128, 2, 0, 0, 3, 1, 0, - 2, 128, 0, 0, 85, 176, 0, 0, 170, 160, 1, 0, 0, 2, 1, - 0, 1, 128, 0, 0, 0, 176, 2, 0, 0, 3, 2, 0, 2, 128, - 0, 0, 85, 176, 0, 0, 255, 160, 1, 0, 0, 2, 2, 0, 1, - 128, 0, 0, 0, 176, 66, 0, 0, 3, 1, 0, 15, 128, 1, 0, - 228, 128, 1, 8, 228, 160, 66, 0, 0, 3, 2, 0, 15, 128, 2, - 0, 228, 128, 1, 8, 228, 160, 4, 0, 0, 4, 0, 0, 15, 128, - 3, 0, 170, 160, 1, 0, 228, 128, 0, 0, 228, 128, 4, 0, 0, - 4, 0, 0, 15, 128, 3, 0, 255, 160, 2, 0, 228, 128, 0, 0, - 228, 128, 2, 0, 0, 3, 1, 0, 2, 128, 0, 0, 85, 176, 1, - 0, 0, 160, 1, 0, 0, 2, 1, 0, 1, 128, 0, 0, 0, 176, - 2, 0, 0, 3, 2, 0, 2, 128, 0, 0, 85, 176, 1, 0, 85, - 160, 1, 0, 0, 2, 2, 0, 1, 128, 0, 0, 0, 176, 66, 0, - 0, 3, 1, 0, 15, 128, 1, 0, 228, 128, 1, 8, 228, 160, 66, - 0, 0, 3, 2, 0, 15, 128, 2, 0, 228, 128, 1, 8, 228, 160, - 4, 0, 0, 4, 0, 0, 15, 128, 4, 0, 0, 160, 1, 0, 228, - 128, 0, 0, 228, 128, 4, 0, 0, 4, 0, 0, 15, 128, 4, 0, - 85, 160, 2, 0, 228, 128, 0, 0, 228, 128, 2, 0, 0, 3, 1, - 0, 2, 128, 0, 0, 85, 176, 1, 0, 170, 160, 1, 0, 0, 2, - 1, 0, 1, 128, 0, 0, 0, 176, 2, 0, 0, 3, 2, 0, 2, - 128, 0, 0, 85, 176, 1, 0, 255, 160, 1, 0, 0, 2, 2, 0, - 1, 128, 0, 0, 0, 176, 66, 0, 0, 3, 1, 0, 15, 128, 1, - 0, 228, 128, 1, 8, 228, 160, 66, 0, 0, 3, 2, 0, 15, 128, - 2, 0, 228, 128, 1, 8, 228, 160, 4, 0, 0, 4, 0, 0, 15, - 128, 4, 0, 170, 160, 1, 0, 228, 128, 0, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 15, 128, 4, 0, 255, 160, 2, 0, 228, 128, 0, - 0, 228, 128, 2, 0, 0, 3, 1, 0, 2, 128, 0, 0, 85, 176, - 2, 0, 0, 160, 1, 0, 0, 2, 1, 0, 1, 128, 0, 0, 0, - 176, 1, 0, 0, 2, 2, 0, 3, 128, 0, 0, 235, 176, 66, 0, - 0, 3, 1, 0, 15, 128, 1, 0, 228, 128, 1, 8, 228, 160, 66, - 0, 0, 3, 2, 0, 15, 128, 2, 0, 228, 128, 0, 8, 228, 160, - 4, 0, 0, 4, 0, 0, 15, 128, 5, 0, 0, 160, 1, 0, 228, - 128, 0, 0, 228, 128, 5, 0, 0, 3, 0, 0, 15, 128, 2, 0, - 255, 128, 0, 0, 228, 128, 1, 0, 0, 2, 0, 8, 15, 128, 0, - 0, 228, 128, 255, 255, 0, 0, 83, 72, 68, 82, 80, 4, 0, 0, - 64, 0, 0, 0, 20, 1, 0, 0, 89, 0, 0, 4, 70, 142, 32, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 90, 0, 0, 3, 0, 96, - 16, 0, 0, 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 1, - 0, 0, 0, 88, 24, 0, 4, 0, 112, 16, 0, 0, 0, 0, 0, - 85, 85, 0, 0, 88, 24, 0, 4, 0, 112, 16, 0, 1, 0, 0, - 0, 85, 85, 0, 0, 98, 16, 0, 3, 50, 16, 16, 0, 1, 0, - 0, 0, 98, 16, 0, 3, 194, 16, 16, 0, 1, 0, 0, 0, 101, - 0, 0, 3, 242, 32, 16, 0, 0, 0, 0, 0, 104, 0, 0, 2, - 4, 0, 0, 0, 54, 0, 0, 5, 82, 0, 16, 0, 0, 0, 0, - 0, 6, 16, 16, 0, 1, 0, 0, 0, 0, 0, 0, 8, 242, 0, - 16, 0, 1, 0, 0, 0, 86, 21, 16, 0, 1, 0, 0, 0, 134, - 141, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, 54, 0, 0, 5, - 162, 0, 16, 0, 0, 0, 0, 0, 6, 8, 16, 0, 1, 0, 0, - 0, 69, 0, 0, 9, 242, 0, 16, 0, 2, 0, 0, 0, 230, 10, - 16, 0, 0, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, - 96, 16, 0, 1, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, - 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 70, 126, 16, - 0, 0, 0, 0, 0, 0, 96, 16, 0, 1, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, 2, 0, 0, 0, 70, 14, 16, 0, 2, - 0, 0, 0, 86, 133, 32, 0, 0, 0, 0, 0, 6, 0, 0, 0, - 50, 0, 0, 10, 242, 0, 16, 0, 0, 0, 0, 0, 6, 128, 32, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 70, 14, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, 54, 0, 0, 5, 82, - 0, 16, 0, 1, 0, 0, 0, 6, 16, 16, 0, 1, 0, 0, 0, - 69, 0, 0, 9, 242, 0, 16, 0, 2, 0, 0, 0, 70, 0, 16, - 0, 1, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, - 16, 0, 1, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 1, - 0, 0, 0, 230, 10, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, - 0, 0, 0, 0, 0, 96, 16, 0, 1, 0, 0, 0, 50, 0, 0, - 10, 242, 0, 16, 0, 0, 0, 0, 0, 166, 138, 32, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, 70, - 14, 16, 0, 0, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, - 0, 0, 0, 0, 246, 143, 32, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 70, 14, 16, 0, 1, 0, 0, 0, 70, 14, 16, 0, 0, 0, - 0, 0, 54, 0, 0, 5, 82, 0, 16, 0, 1, 0, 0, 0, 6, - 16, 16, 0, 1, 0, 0, 0, 0, 0, 0, 8, 242, 0, 16, 0, - 2, 0, 0, 0, 86, 21, 16, 0, 1, 0, 0, 0, 134, 141, 32, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 54, 0, 0, 5, 162, 0, - 16, 0, 1, 0, 0, 0, 6, 8, 16, 0, 2, 0, 0, 0, 69, - 0, 0, 9, 242, 0, 16, 0, 3, 0, 0, 0, 70, 0, 16, 0, - 1, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, - 0, 1, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 1, 0, - 0, 0, 230, 10, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 0, - 0, 0, 0, 0, 96, 16, 0, 1, 0, 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 0, 0, 0, 0, 6, 128, 32, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 70, 14, 16, 0, 3, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, 0, - 0, 0, 0, 86, 133, 32, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 70, 14, 16, 0, 1, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, - 0, 54, 0, 0, 5, 82, 0, 16, 0, 2, 0, 0, 0, 6, 16, - 16, 0, 1, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 1, - 0, 0, 0, 70, 0, 16, 0, 2, 0, 0, 0, 70, 126, 16, 0, - 0, 0, 0, 0, 0, 96, 16, 0, 1, 0, 0, 0, 69, 0, 0, - 9, 242, 0, 16, 0, 2, 0, 0, 0, 230, 10, 16, 0, 2, 0, - 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 1, - 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, 0, 0, 0, 0, - 166, 138, 32, 0, 0, 0, 0, 0, 7, 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 50, 0, - 0, 10, 242, 0, 16, 0, 0, 0, 0, 0, 246, 143, 32, 0, 0, - 0, 0, 0, 7, 0, 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, - 70, 14, 16, 0, 0, 0, 0, 0, 0, 0, 0, 8, 34, 0, 16, - 0, 1, 0, 0, 0, 26, 16, 16, 0, 1, 0, 0, 0, 10, 128, - 32, 0, 0, 0, 0, 0, 5, 0, 0, 0, 54, 0, 0, 5, 18, - 0, 16, 0, 1, 0, 0, 0, 10, 16, 16, 0, 1, 0, 0, 0, - 69, 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 70, 0, 16, - 0, 1, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, - 16, 0, 1, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, 0, - 0, 0, 0, 6, 128, 32, 0, 0, 0, 0, 0, 8, 0, 0, 0, - 70, 14, 16, 0, 1, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, - 0, 69, 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 230, 26, - 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 1, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, 0, 56, 0, 0, 7, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 246, 15, 16, - 0, 1, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, - 0, 0, 31, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, - 69, 70, 12, 2, 0, 0, 1, 0, 0, 0, 232, 0, 0, 0, 5, - 0, 0, 0, 28, 0, 0, 0, 0, 4, 255, 255, 0, 1, 0, 0, - 216, 1, 0, 0, 188, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 201, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 2, 0, 0, - 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 220, 0, 0, 0, 2, - 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, - 1, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 225, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 115, - 77, 97, 115, 107, 83, 97, 109, 112, 108, 101, 114, 0, 115, 83, 104, - 97, 100, 111, 119, 83, 97, 109, 112, 108, 101, 114, 0, 116, 101, 120, - 0, 109, 97, 115, 107, 0, 99, 98, 49, 0, 171, 171, 171, 225, 0, - 0, 0, 4, 0, 0, 0, 0, 1, 0, 0, 160, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 0, 0, - 48, 0, 0, 0, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 0, - 0, 128, 1, 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 2, 0, - 0, 0, 144, 1, 0, 0, 0, 0, 0, 0, 160, 1, 0, 0, 96, - 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 172, 1, 0, 0, - 0, 0, 0, 0, 188, 1, 0, 0, 144, 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 200, 1, 0, 0, 0, 0, 0, 0, 66, 108, - 117, 114, 79, 102, 102, 115, 101, 116, 115, 72, 0, 171, 171, 171, 1, - 0, 3, 0, 1, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 66, 108, 117, 114, 79, 102, 102, 115, 101, 116, 115, 86, 0, 171, 171, - 171, 1, 0, 3, 0, 1, 0, 4, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 66, 108, 117, 114, 87, 101, 105, 103, 104, 116, 115, 0, 1, - 0, 3, 0, 1, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 83, 104, 97, 100, 111, 119, 67, 111, 108, 111, 114, 0, 1, 0, 3, - 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 105, - 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, - 56, 52, 0, 171, 171, 73, 83, 71, 78, 104, 0, 0, 0, 3, 0, - 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 3, 3, 0, 0, 92, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, - 12, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, - 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 79, 83, 71, - 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 97, 114, 103, 101, - 116, 0, 171, 171, 255, 35, 1, 0, 0, 0, 0, 0, 83, 97, 109, - 112, 108, 101, 84, 101, 120, 116, 84, 101, 120, 116, 117, 114, 101, 0, - 85, 110, 109, 97, 115, 107, 101, 100, 0, 4, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, 0, 0, 255, 255, 255, 255, 68, 4, 0, - 0, 68, 88, 66, 67, 77, 85, 167, 240, 56, 56, 155, 78, 125, 96, - 49, 253, 103, 100, 22, 62, 1, 0, 0, 0, 68, 4, 0, 0, 6, - 0, 0, 0, 56, 0, 0, 0, 248, 0, 0, 0, 244, 1, 0, 0, - 112, 2, 0, 0, 160, 3, 0, 0, 212, 3, 0, 0, 65, 111, 110, - 57, 184, 0, 0, 0, 184, 0, 0, 0, 0, 2, 254, 255, 132, 0, - 0, 0, 52, 0, 0, 0, 1, 0, 36, 0, 0, 0, 48, 0, 0, - 0, 48, 0, 0, 0, 36, 0, 1, 0, 48, 0, 0, 0, 0, 0, - 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 254, - 255, 81, 0, 0, 5, 4, 0, 15, 160, 0, 0, 0, 0, 0, 0, - 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 2, 5, - 0, 0, 128, 0, 0, 15, 144, 4, 0, 0, 4, 0, 0, 3, 224, - 0, 0, 228, 144, 2, 0, 238, 160, 2, 0, 228, 160, 4, 0, 0, - 4, 0, 0, 12, 224, 0, 0, 20, 144, 3, 0, 180, 160, 3, 0, - 20, 160, 4, 0, 0, 4, 0, 0, 3, 128, 0, 0, 228, 144, 1, - 0, 238, 160, 1, 0, 228, 160, 2, 0, 0, 3, 0, 0, 3, 192, - 0, 0, 228, 128, 0, 0, 228, 160, 1, 0, 0, 2, 0, 0, 12, - 192, 4, 0, 68, 160, 255, 255, 0, 0, 83, 72, 68, 82, 244, 0, - 0, 0, 64, 0, 1, 0, 61, 0, 0, 0, 89, 0, 0, 4, 70, - 142, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, 95, 0, 0, 3, - 50, 16, 16, 0, 0, 0, 0, 0, 103, 0, 0, 4, 242, 32, 16, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 101, 0, 0, 3, 50, 32, - 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 194, 32, 16, 0, 1, - 0, 0, 0, 50, 0, 0, 11, 50, 32, 16, 0, 0, 0, 0, 0, - 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 8, 194, 32, 16, 0, 0, 0, 0, 0, 2, - 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 128, 63, 50, 0, 0, 11, 50, 32, 16, 0, 1, 0, 0, - 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 50, 0, 0, 11, 194, 32, 16, 0, 1, 0, 0, 0, - 6, 20, 16, 0, 0, 0, 0, 0, 166, 142, 32, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 6, 132, 32, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, 0, 0, 5, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, 69, 70, 40, - 1, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, 1, 0, 0, 0, - 28, 0, 0, 0, 0, 4, 254, 255, 0, 1, 0, 0, 246, 0, 0, - 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 99, 98, 48, 0, 60, 0, 0, 0, 4, 0, 0, 0, - 88, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 184, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 2, 0, - 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 16, - 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, 0, 0, 0, - 0, 0, 0, 0, 222, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 236, 0, - 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 196, - 0, 0, 0, 0, 0, 0, 0, 81, 117, 97, 100, 68, 101, 115, 99, - 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 84, 101, 120, 67, 111, 111, 114, 100, 115, 0, - 77, 97, 115, 107, 84, 101, 120, 67, 111, 111, 114, 100, 115, 0, 84, - 101, 120, 116, 67, 111, 108, 111, 114, 0, 77, 105, 99, 114, 111, 115, - 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, - 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, - 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 73, - 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 7, 3, 0, 0, 80, 79, 83, 73, 84, 73, - 79, 78, 0, 171, 171, 171, 79, 83, 71, 78, 104, 0, 0, 0, 3, - 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, 3, 12, 0, 0, 92, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, - 12, 3, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, - 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 250, 46, - 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 152, 4, 0, 0, 68, 88, 66, 67, 227, 84, 48, 176, - 142, 231, 109, 63, 97, 30, 1, 57, 105, 137, 178, 120, 1, 0, 0, - 0, 152, 4, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 4, 1, - 0, 0, 224, 1, 0, 0, 92, 2, 0, 0, 220, 3, 0, 0, 76, - 4, 0, 0, 65, 111, 110, 57, 196, 0, 0, 0, 196, 0, 0, 0, - 0, 2, 255, 255, 144, 0, 0, 0, 52, 0, 0, 0, 1, 0, 40, - 0, 0, 0, 52, 0, 0, 0, 52, 0, 1, 0, 36, 0, 0, 0, - 52, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 255, 255, 81, 0, 0, 5, 1, 0, 15, 160, - 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 31, 0, 0, 2, 0, 0, 0, 128, 0, 0, 15, 176, 31, 0, - 0, 2, 0, 0, 0, 144, 0, 8, 15, 160, 1, 0, 0, 2, 0, - 0, 7, 128, 0, 0, 228, 160, 4, 0, 0, 4, 0, 0, 15, 128, - 0, 0, 36, 128, 1, 0, 64, 160, 1, 0, 21, 160, 1, 0, 0, - 2, 0, 8, 15, 128, 0, 0, 228, 128, 66, 0, 0, 3, 0, 0, - 15, 128, 0, 0, 228, 176, 0, 8, 228, 160, 5, 0, 0, 3, 0, - 0, 15, 128, 0, 0, 70, 128, 0, 0, 255, 160, 1, 0, 0, 2, - 1, 8, 15, 128, 0, 0, 228, 128, 255, 255, 0, 0, 83, 72, 68, - 82, 212, 0, 0, 0, 64, 0, 0, 0, 53, 0, 0, 0, 89, 0, - 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, 90, - 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, 0, 88, 24, 0, 4, - 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, 0, 0, 98, 16, 0, - 3, 50, 16, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, - 16, 0, 0, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, 0, 1, - 0, 0, 0, 104, 0, 0, 2, 1, 0, 0, 0, 54, 0, 0, 6, - 114, 32, 16, 0, 0, 0, 0, 0, 70, 130, 32, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 54, 0, 0, 5, 130, 32, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 69, 0, 0, 9, 242, - 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 1, 0, 0, 0, - 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, - 0, 56, 0, 0, 8, 242, 32, 16, 0, 1, 0, 0, 0, 102, 4, - 16, 0, 0, 0, 0, 0, 246, 143, 32, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, 0, 0, - 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, 69, 70, - 120, 1, 0, 0, 1, 0, 0, 0, 144, 0, 0, 0, 3, 0, 0, - 0, 28, 0, 0, 0, 0, 4, 255, 255, 0, 1, 0, 0, 70, 1, - 0, 0, 124, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 133, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, - 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, - 0, 0, 12, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 115, 83, 97, 109, 112, 108, 101, - 114, 0, 116, 101, 120, 0, 99, 98, 48, 0, 171, 171, 171, 137, 0, - 0, 0, 4, 0, 0, 0, 168, 0, 0, 0, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, - 0, 36, 1, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 20, 1, 0, 0, 0, 0, 0, 0, 46, 1, 0, 0, 32, - 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 20, 1, 0, 0, - 0, 0, 0, 0, 60, 1, 0, 0, 48, 0, 0, 0, 16, 0, 0, - 0, 2, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, 0, 81, 117, - 97, 100, 68, 101, 115, 99, 0, 171, 171, 171, 1, 0, 3, 0, 1, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 101, 120, 67, - 111, 111, 114, 100, 115, 0, 77, 97, 115, 107, 84, 101, 120, 67, 111, - 111, 114, 100, 115, 0, 84, 101, 120, 116, 67, 111, 108, 111, 114, 0, - 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, - 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, - 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, - 54, 51, 56, 52, 0, 73, 83, 71, 78, 104, 0, 0, 0, 3, 0, - 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 3, 3, 0, 0, 92, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 12, - 0, 0, 0, 83, 86, 95, 80, 111, 115, 105, 116, 105, 111, 110, 0, - 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 79, 83, 71, - 78, 68, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 56, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, 0, 56, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 15, 0, 0, - 0, 83, 86, 95, 84, 97, 114, 103, 101, 116, 0, 171, 171, 86, 51, - 1, 0, 0, 0, 0, 0, 77, 97, 115, 107, 101, 100, 0, 4, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 255, 255, 255, - 255, 68, 4, 0, 0, 68, 88, 66, 67, 77, 85, 167, 240, 56, 56, - 155, 78, 125, 96, 49, 253, 103, 100, 22, 62, 1, 0, 0, 0, 68, - 4, 0, 0, 6, 0, 0, 0, 56, 0, 0, 0, 248, 0, 0, 0, - 244, 1, 0, 0, 112, 2, 0, 0, 160, 3, 0, 0, 212, 3, 0, - 0, 65, 111, 110, 57, 184, 0, 0, 0, 184, 0, 0, 0, 0, 2, - 254, 255, 132, 0, 0, 0, 52, 0, 0, 0, 1, 0, 36, 0, 0, - 0, 48, 0, 0, 0, 48, 0, 0, 0, 36, 0, 1, 0, 48, 0, - 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 254, 255, 81, 0, 0, 5, 4, 0, 15, 160, 0, 0, - 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 31, - 0, 0, 2, 5, 0, 0, 128, 0, 0, 15, 144, 4, 0, 0, 4, - 0, 0, 3, 224, 0, 0, 228, 144, 2, 0, 238, 160, 2, 0, 228, - 160, 4, 0, 0, 4, 0, 0, 12, 224, 0, 0, 20, 144, 3, 0, - 180, 160, 3, 0, 20, 160, 4, 0, 0, 4, 0, 0, 3, 128, 0, - 0, 228, 144, 1, 0, 238, 160, 1, 0, 228, 160, 2, 0, 0, 3, - 0, 0, 3, 192, 0, 0, 228, 128, 0, 0, 228, 160, 1, 0, 0, - 2, 0, 0, 12, 192, 4, 0, 68, 160, 255, 255, 0, 0, 83, 72, - 68, 82, 244, 0, 0, 0, 64, 0, 1, 0, 61, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 95, 0, 0, 3, 50, 16, 16, 0, 0, 0, 0, 0, 103, 0, 0, - 4, 242, 32, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 101, 0, - 0, 3, 50, 32, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 194, - 32, 16, 0, 1, 0, 0, 0, 50, 0, 0, 11, 50, 32, 16, 0, - 0, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, 32, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 128, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 0, 0, 8, 194, 32, 16, 0, 0, - 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 128, 63, 50, 0, 0, 11, 50, 32, 16, - 0, 1, 0, 0, 0, 70, 16, 16, 0, 0, 0, 0, 0, 230, 138, - 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 70, 128, 32, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 11, 194, 32, 16, 0, - 1, 0, 0, 0, 6, 20, 16, 0, 0, 0, 0, 0, 166, 142, 32, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 132, 32, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, - 68, 69, 70, 40, 1, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, - 1, 0, 0, 0, 28, 0, 0, 0, 0, 4, 254, 255, 0, 1, 0, - 0, 246, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 99, 98, 48, 0, 60, 0, 0, 0, - 4, 0, 0, 0, 88, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 0, 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 212, - 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, - 196, 0, 0, 0, 0, 0, 0, 0, 222, 0, 0, 0, 32, 0, 0, - 0, 16, 0, 0, 0, 2, 0, 0, 0, 196, 0, 0, 0, 0, 0, - 0, 0, 236, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 81, 117, 97, 100, - 68, 101, 115, 99, 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 101, 120, 67, 111, 111, - 114, 100, 115, 0, 77, 97, 115, 107, 84, 101, 120, 67, 111, 111, 114, - 100, 115, 0, 84, 101, 120, 116, 67, 111, 108, 111, 114, 0, 77, 105, - 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, - 56, 52, 0, 73, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, - 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 7, 3, 0, 0, 80, 79, - 83, 73, 84, 73, 79, 78, 0, 171, 171, 171, 79, 83, 71, 78, 104, - 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 12, 0, 0, 92, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 12, 3, 0, 0, 83, 86, 95, 80, 111, 115, 105, - 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, - 171, 171, 49, 56, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 140, 5, 0, 0, 68, 88, 66, 67, - 233, 167, 4, 110, 60, 182, 197, 16, 114, 252, 67, 184, 217, 172, 169, - 241, 1, 0, 0, 0, 140, 5, 0, 0, 6, 0, 0, 0, 56, 0, - 0, 0, 64, 1, 0, 0, 132, 2, 0, 0, 0, 3, 0, 0, 208, - 4, 0, 0, 64, 5, 0, 0, 65, 111, 110, 57, 0, 1, 0, 0, - 0, 1, 0, 0, 0, 2, 255, 255, 200, 0, 0, 0, 56, 0, 0, - 0, 1, 0, 44, 0, 0, 0, 56, 0, 0, 0, 56, 0, 2, 0, - 36, 0, 0, 0, 56, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, - 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 255, 255, - 81, 0, 0, 5, 1, 0, 15, 160, 0, 0, 128, 63, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 2, 0, 0, - 0, 128, 0, 0, 15, 176, 31, 0, 0, 2, 0, 0, 0, 144, 0, - 8, 15, 160, 31, 0, 0, 2, 0, 0, 0, 144, 1, 8, 15, 160, - 1, 0, 0, 2, 0, 0, 7, 128, 0, 0, 228, 160, 4, 0, 0, - 4, 0, 0, 15, 128, 0, 0, 36, 128, 1, 0, 64, 160, 1, 0, - 21, 160, 1, 0, 0, 2, 0, 8, 15, 128, 0, 0, 228, 128, 1, - 0, 0, 2, 0, 0, 3, 128, 0, 0, 235, 176, 66, 0, 0, 3, - 1, 0, 15, 128, 0, 0, 228, 176, 0, 8, 228, 160, 66, 0, 0, - 3, 0, 0, 15, 128, 0, 0, 228, 128, 1, 8, 228, 160, 5, 0, - 0, 3, 1, 0, 15, 128, 1, 0, 70, 128, 0, 0, 255, 160, 5, - 0, 0, 3, 0, 0, 15, 128, 0, 0, 255, 128, 1, 0, 228, 128, - 1, 0, 0, 2, 1, 8, 15, 128, 0, 0, 228, 128, 255, 255, 0, - 0, 83, 72, 68, 82, 60, 1, 0, 0, 64, 0, 0, 0, 79, 0, - 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, 0, - 90, 0, 0, 3, 0, 96, 16, 0, 1, 0, 0, 0, 88, 24, 0, - 4, 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, 0, 0, 88, 24, - 0, 4, 0, 112, 16, 0, 1, 0, 0, 0, 85, 85, 0, 0, 98, - 16, 0, 3, 50, 16, 16, 0, 1, 0, 0, 0, 98, 16, 0, 3, - 194, 16, 16, 0, 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, - 0, 0, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, 0, 1, 0, - 0, 0, 104, 0, 0, 2, 2, 0, 0, 0, 54, 0, 0, 6, 114, - 32, 16, 0, 0, 0, 0, 0, 70, 130, 32, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 54, 0, 0, 5, 130, 32, 16, 0, 0, 0, 0, - 0, 1, 64, 0, 0, 0, 0, 128, 63, 69, 0, 0, 9, 242, 0, - 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, 1, 0, 0, 0, 70, - 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, - 56, 0, 0, 8, 242, 0, 16, 0, 0, 0, 0, 0, 102, 4, 16, - 0, 0, 0, 0, 0, 246, 143, 32, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 69, 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 230, - 26, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 1, 0, 0, 0, - 0, 96, 16, 0, 1, 0, 0, 0, 56, 0, 0, 7, 242, 32, 16, - 0, 1, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 246, 15, - 16, 0, 1, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, - 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, - 68, 69, 70, 200, 1, 0, 0, 1, 0, 0, 0, 224, 0, 0, 0, - 5, 0, 0, 0, 28, 0, 0, 0, 0, 4, 255, 255, 0, 1, 0, - 0, 150, 1, 0, 0, 188, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 210, 0, 0, 0, 2, 0, - 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, - 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 214, 0, 0, 0, - 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, - 255, 1, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 219, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 115, 83, 97, 109, 112, 108, 101, 114, 0, 115, 77, 97, 115, 107, 83, - 97, 109, 112, 108, 101, 114, 0, 116, 101, 120, 0, 109, 97, 115, 107, - 0, 99, 98, 48, 0, 171, 219, 0, 0, 0, 4, 0, 0, 0, 248, - 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 88, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, - 0, 100, 1, 0, 0, 0, 0, 0, 0, 116, 1, 0, 0, 16, 0, - 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 100, 1, 0, 0, 0, - 0, 0, 0, 126, 1, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 100, 1, 0, 0, 0, 0, 0, 0, 140, 1, 0, - 0, 48, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 100, 1, - 0, 0, 0, 0, 0, 0, 81, 117, 97, 100, 68, 101, 115, 99, 0, - 171, 171, 171, 1, 0, 3, 0, 1, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 84, 101, 120, 67, 111, 111, 114, 100, 115, 0, 77, - 97, 115, 107, 84, 101, 120, 67, 111, 111, 114, 100, 115, 0, 84, 101, - 120, 116, 67, 111, 108, 111, 114, 0, 77, 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, - 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, - 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 73, 83, - 71, 78, 104, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0, 80, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, - 0, 0, 92, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, 0, 12, 12, 0, 0, 83, 86, 95, 80, - 111, 115, 105, 116, 105, 111, 110, 0, 84, 69, 88, 67, 79, 79, 82, - 68, 0, 171, 171, 171, 79, 83, 71, 78, 68, 0, 0, 0, 2, 0, - 0, 0, 8, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 56, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 97, 114, - 103, 101, 116, 0, 171, 171, 141, 60, 1, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 255, 255, 255, 255, 0, 0, 0, 0, 46, 0, 0, 0, 18, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 64, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 93, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 0, - 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, - 65, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 65, 0, - 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 136, 0, 0, 0, 160, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, - 0, 168, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, - 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 0, - 0, 140, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0, 0, 65, - 0, 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 218, 0, 0, 0, 112, 0, 0, - 0, 0, 0, 0, 0, 7, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 3, 1, 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 61, 1, 0, 0, 33, 1, 0, 0, 0, 0, 0, 0, 48, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 1, - 0, 0, 79, 1, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 1, 0, 0, - 33, 1, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 1, 0, 0, 126, 1, - 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 156, 1, 0, 0, 126, 1, 0, 0, - 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 164, 1, 0, 0, 126, 1, 0, 0, 0, 0, - 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 175, 1, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 179, 1, 0, - 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 1, 0, 0, 33, - 1, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 221, 1, 0, 0, 33, 1, 0, - 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 228, 1, 0, 0, 126, 1, 0, 0, 0, - 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 234, 1, 0, 0, 126, 1, 0, 0, 0, 0, 0, - 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 247, 1, 0, 0, 126, 1, 0, 0, 0, 0, 0, 0, 72, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 40, 2, 0, 0, 12, 2, 0, 0, 0, 0, 0, 0, 255, 255, 255, - 255, 0, 0, 0, 0, 44, 2, 0, 0, 12, 2, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 51, 2, 0, 0, 12, - 2, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, - 97, 2, 0, 0, 69, 2, 0, 0, 0, 0, 0, 0, 255, 255, 255, - 255, 4, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 106, 2, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 40, 2, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 118, 2, 0, 0, 47, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 130, 2, 0, 0, 0, 0, 0, 0, 142, 2, - 0, 0, 69, 2, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 4, - 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 154, 2, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 44, 2, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 166, 2, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 178, 2, 0, 0, 0, 0, 0, 0, 190, 2, 0, 0, - 69, 2, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 4, 0, 0, - 0, 45, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 203, 2, - 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 40, - 2, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 215, 2, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 227, 2, 0, 0, 0, 0, 0, 0, 239, 2, 0, 0, 69, 2, - 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 4, 0, 0, 0, 45, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 254, 2, 0, 0, - 55, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 40, 2, 0, - 0, 46, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 10, 3, - 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 22, - 3, 0, 0, 0, 0, 0, 0, 34, 3, 0, 0, 69, 2, 0, 0, - 0, 0, 0, 0, 255, 255, 255, 255, 4, 0, 0, 0, 45, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 47, 3, 0, 0, 55, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 51, 2, 0, 0, 46, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 59, 3, 0, 0, - 47, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 71, 3, 0, - 0, 0, 0, 0, 0, 83, 3, 0, 0, 69, 2, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, 5, 0, 0, 0, 45, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 98, 3, 0, 0, 55, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 40, 2, 0, 0, 46, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 110, 3, 0, 0, 47, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 122, 3, 0, 0, 52, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 134, 3, 0, 0, - 0, 0, 0, 0, 214, 3, 0, 0, 186, 3, 0, 0, 0, 0, 0, - 0, 255, 255, 255, 255, 2, 0, 0, 0, 19, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 226, 3, 0, 0, 13, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 238, 3, 0, 0, 0, 0, 0, 0, - 33, 4, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, 255, 255, 255, - 255, 2, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 46, 4, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 58, 4, 0, 0, 0, 0, 0, 0, 70, 4, 0, 0, - 5, 4, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 8, 0, 0, - 0, 37, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 83, 4, - 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 95, - 4, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 107, 4, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 119, 4, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 131, 4, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 143, 4, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 155, 4, 0, 0, 44, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 167, 4, 0, 0, 0, 0, 0, 0, 179, 4, - 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 9, - 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 190, 4, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 202, 4, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 214, 4, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 226, 4, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 238, 4, 0, 0, 41, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 250, 4, 0, 0, 42, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 6, 5, 0, 0, 43, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 18, 5, 0, 0, 44, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 30, 5, 0, 0, 0, 0, 0, - 0, 42, 5, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56, 5, - 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 214, 3, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 131, 9, 0, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 139, 9, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 111, 12, 0, 0, 119, - 12, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56, 5, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 214, 3, 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 227, 16, 0, 0, 8, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 235, 16, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 67, 30, 0, 0, 75, 30, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 56, 5, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 214, 3, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 183, 34, 0, 0, 8, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 191, 34, 0, 0, 7, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 39, 52, 0, 0, 47, 52, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 56, 5, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 214, 3, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, - 0, 0, 156, 56, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 164, 56, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 140, 94, 0, 0, 148, 94, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 169, 94, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 214, - 3, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 222, 101, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 230, 101, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 7, 0, - 0, 0, 214, 111, 0, 0, 222, 111, 0, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 214, 3, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, - 0, 17, 119, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 25, 119, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 0, 0, 233, 126, 0, 0, 241, 126, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 214, 3, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, - 0, 0, 42, 134, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 50, 134, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 38, 144, 0, 0, 46, 144, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 214, 3, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 0, 0, 101, 151, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 109, 151, 0, 0, 7, 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 65, 159, 0, 0, 73, 159, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 214, 3, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 132, 166, 0, 0, 8, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 140, 166, 0, 0, 7, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 132, 176, 0, 0, 140, 176, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 214, 3, 0, 0, 6, 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 197, 183, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 205, 183, 0, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, 0, 165, 191, 0, 0, 173, 191, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 169, 94, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 214, 3, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 0, 0, 209, 198, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 217, 198, 0, 0, 7, 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 53, 211, 0, 0, 241, 126, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 214, 3, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 77, 218, 0, 0, 8, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 85, 218, 0, 0, 7, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 181, 230, 0, 0, 73, 159, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 214, 3, 0, 0, 6, 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 205, 237, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 213, 237, 0, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, 0, 57, 250, 0, 0, 65, 250, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 56, 5, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 214, 3, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 0, 0, 157, 254, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 165, 254, 0, 0, 7, 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 137, 2, 1, 0, 145, 2, 1, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 56, 5, 0, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 214, 3, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 169, 2, 1, 0, 11, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 205, 2, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 33, 4, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 33, 7, 1, 0, 8, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 41, 7, 1, 0, 7, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 33, 17, 1, 0, 41, 17, 1, 0, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 214, 3, 0, 0, 10, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 44, 17, 1, 0, 11, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 80, 17, 1, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 70, 4, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 164, 21, 1, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 172, 21, 1, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 104, 31, 1, 0, 112, - 31, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 214, 3, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 115, 31, 1, 0, 11, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 151, 31, 1, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 70, 4, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 235, 35, 1, - 0, 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 243, 35, - 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 167, - 46, 1, 0, 175, 46, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 193, 46, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 214, 3, 0, 0, 10, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 202, 46, 1, 0, 11, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 238, 46, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 179, 4, 0, - 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 66, 51, - 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 74, - 51, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 242, 55, 1, 0, 250, 55, 1, 0, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 214, 3, - 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, - 56, 1, 0, 11, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 37, 56, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 179, 4, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, - 0, 0, 121, 60, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 129, 60, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 29, 66, 1, 0}; diff --git a/gfx/2d/ShadersD2D1.h b/gfx/2d/ShadersD2D1.h @@ -1,1186 +0,0 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 -// -// -// Buffer Definitions: -// -// cbuffer radialGradientConstants -// { -// -// float3 diff; // Offset: 0 Size: 12 -// float2 center1; // Offset: 16 Size: 8 -// float A; // Offset: 24 Size: 4 -// float radius1; // Offset: 28 Size: 4 -// float sq_radius1; // Offset: 32 Size: 4 -// float repeat_correct; // Offset: 36 Size: 4 -// float allow_odd; // Offset: 40 Size: 4 -// float3x2 transform; // Offset: 48 Size: 28 -// -// } -// -// -// Resource Bindings: -// -// Name Type Format Dim Slot Elements -// ------------------------------ ---------- ------- ----------- ---- -------- -// InputSampler sampler NA NA 0 1 -// GradientSampler sampler NA NA 1 1 -// InputTexture texture float4 2d 0 1 -// GradientTexture texture float4 2d 1 1 -// radialGradientConstants cbuffer NA NA 0 1 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_POSITION 0 xyzw 0 POS float -// SCENE_POSITION 0 xyzw 1 NONE float xy -// TEXCOORD 0 xyzw 2 NONE float xy -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_Target 0 xyzw 0 TARGET float xyzw -// -// -// Constant buffer to DX9 shader constant mappings: -// -// Target Reg Buffer Start Reg # of Regs Data Conversion -// ---------- ------- --------- --------- ---------------------- -// c0 cb0 0 5 ( FLT, FLT, FLT, FLT) -// -// -// Sampler/Resource to DX9 shader sampler mappings: -// -// Target Sampler Source Sampler Source Resource -// -------------- --------------- ---------------- -// s0 s0 t0 -// s1 s1 t1 -// -// -// Level9 shader bytecode: -// - ps_2_x - def c5, 0.5, 1, 0, 0 - def c6, 1, -1, 0, -0 - dcl t0 - dcl t1 - dcl_2d s0 - dcl_2d s1 - dp2add r0.x, t0, c3, c3.z - dp2add r0.y, t0, c4, c4.z - add r0.xy, r0, -c1 - dp2add r0.w, r0, r0, -c2.x - mul r0.w, r0.w, c1.z - mov r0.z, c1.w - dp3 r0.x, r0, c0 - mad r0.y, r0.x, r0.x, -r0.w - abs r0.z, r0.y - cmp r0.y, r0.y, c5.y, c5.z - rsq r0.z, r0.z - rcp r1.x, r0.z - mov r1.yz, -r1.x - add r0.xzw, r0.x, r1.xyyz - rcp r1.x, c1.z - mul r0.xzw, r0, r1.x - mov r1.w, c1.w - mad r1.xyz, r0.xzww, c0.z, r1.w - cmp r1.w, r1.x, r0.x, r0.w - cmp r0.xzw, r1.xyyz, c6.xyxy, c6.zyzw - frc r1.x, r1.w - add r1.x, -r1.x, r1.w - mul r1.y, r1.x, c5.x - abs r1.y, r1.y - frc r1.y, r1.y - cmp r1.y, r1.x, r1.y, -r1.y - add r1.x, -r1.x, r1.w - add r1.y, r1.y, r1.y - abs r1.y, r1.y - mul r1.y, r1.y, c2.z - frc r1.z, -r1.w - lrp r2.w, r1.y, r1.z, r1.x - lrp r3.x, c2.y, r2.w, r1.w - mov r3.y, c5.x - texld r1, t1, s0 - texld r2, r3, s1 - mul r2.xyz, r2.w, r2 - mul r1, r1, r2 - add r0.w, r0.w, r0.x - cmp r0.x, r0.w, r0.x, r0.z - mul r1, r0.x, r1 - mul r0, r0.y, r1 - mov oC0, r0 - -// approximately 46 instruction slots used (2 texture, 44 arithmetic) -ps_4_0 -dcl_constantbuffer cb0[5], immediateIndexed -dcl_sampler s0, mode_default -dcl_sampler s1, mode_default -dcl_resource_texture2d (float,float,float,float) t0 -dcl_resource_texture2d (float,float,float,float) t1 -dcl_input_ps linear v1.xy -dcl_input_ps linear v2.xy -dcl_output o0.xyzw -dcl_temps 3 -dp2 r0.x, v1.xyxx, cb0[3].xyxx -add r0.x, r0.x, cb0[3].z -dp2 r0.z, v1.xyxx, cb0[4].xyxx -add r0.y, r0.z, cb0[4].z -add r0.xy, r0.xyxx, -cb0[1].xyxx -dp2 r0.w, r0.xyxx, r0.xyxx -add r0.w, r0.w, -cb0[2].x -mul r0.w, r0.w, cb0[1].z -mov r0.z, cb0[1].w -dp3 r0.x, r0.xyzx, cb0[0].xyzx -mad r0.y, r0.x, r0.x, -r0.w -sqrt r1.x, |r0.y| -ge r0.y, r0.y, l(0.000000) -and r0.y, r0.y, l(0x3f800000) -mov r1.y, -r1.x -add r0.xz, r0.xxxx, r1.xxyx -div r0.xz, r0.xxzx, cb0[1].zzzz -add r0.w, -r0.z, r0.x -mul r1.xy, r0.xzxx, cb0[0].zzzz -ge r1.xy, r1.xyxx, -cb0[1].wwww -and r1.xy, r1.xyxx, l(0x3f800000, 0x3f800000, 0, 0) -mad r0.x, r1.x, r0.w, r0.z -max r0.z, r1.y, r1.x -ge r0.z, l(0.000000), r0.z -movc r0.z, r0.z, l(-0.000000), l(1.000000) -round_pi r0.w, r0.x -add r0.w, -r0.x, r0.w -round_ni r1.x, r0.x -mul r1.y, r1.x, l(0.500000) -add r1.x, r0.x, -r1.x -ge r1.z, r1.y, -r1.y -frc r1.y, |r1.y| -movc r1.y, r1.z, r1.y, -r1.y -add r1.y, r1.y, r1.y -mul r1.z, |r1.y|, cb0[2].z -mad r1.y, -|r1.y|, cb0[2].z, l(1.000000) -mul r0.w, r0.w, r1.z -mad r0.w, r1.x, r1.y, r0.w -mul r0.w, r0.w, cb0[2].y -add r1.x, l(1.000000), -cb0[2].y -mad r1.x, r0.x, r1.x, r0.w -mov r1.y, l(0.500000) -sample r1.xyzw, r1.xyxx, t1.xyzw, s1 -mul r1.xyz, r1.wwww, r1.xyzx -sample r2.xyzw, v2.xyxx, t0.xyzw, s0 -mul r1.xyzw, r1.xyzw, r2.xyzw -mul r1.xyzw, r0.zzzz, r1.xyzw -mul o0.xyzw, r0.yyyy, r1.xyzw -ret -// Approximately 49 instruction slots used -#endif - -const BYTE SampleRadialGradientPS[] = { - 68, 88, 66, 67, 221, 203, 207, 240, 164, 242, 31, 220, 34, 19, 29, - 61, 18, 184, 230, 185, 1, 0, 0, 0, 196, 13, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, 136, 3, 0, 0, 232, 9, 0, 0, 100, - 10, 0, 0, 20, 13, 0, 0, 144, 13, 0, 0, 65, 111, 110, 57, - 72, 3, 0, 0, 72, 3, 0, 0, 0, 2, 255, 255, 16, 3, 0, - 0, 56, 0, 0, 0, 1, 0, 44, 0, 0, 0, 56, 0, 0, 0, - 56, 0, 2, 0, 36, 0, 0, 0, 56, 0, 0, 0, 0, 0, 1, - 1, 1, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 255, 255, 81, 0, 0, 5, 5, 0, 15, 160, 0, 0, 0, - 63, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, - 0, 5, 6, 0, 15, 160, 0, 0, 128, 63, 0, 0, 128, 191, 0, - 0, 0, 0, 0, 0, 0, 128, 31, 0, 0, 2, 0, 0, 0, 128, - 0, 0, 15, 176, 31, 0, 0, 2, 0, 0, 0, 128, 1, 0, 15, - 176, 31, 0, 0, 2, 0, 0, 0, 144, 0, 8, 15, 160, 31, 0, - 0, 2, 0, 0, 0, 144, 1, 8, 15, 160, 90, 0, 0, 4, 0, - 0, 1, 128, 0, 0, 228, 176, 3, 0, 228, 160, 3, 0, 170, 160, - 90, 0, 0, 4, 0, 0, 2, 128, 0, 0, 228, 176, 4, 0, 228, - 160, 4, 0, 170, 160, 2, 0, 0, 3, 0, 0, 3, 128, 0, 0, - 228, 128, 1, 0, 228, 161, 90, 0, 0, 4, 0, 0, 8, 128, 0, - 0, 228, 128, 0, 0, 228, 128, 2, 0, 0, 161, 5, 0, 0, 3, - 0, 0, 8, 128, 0, 0, 255, 128, 1, 0, 170, 160, 1, 0, 0, - 2, 0, 0, 4, 128, 1, 0, 255, 160, 8, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 228, 128, 0, 0, 228, 160, 4, 0, 0, 4, 0, - 0, 2, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 255, 129, - 35, 0, 0, 2, 0, 0, 4, 128, 0, 0, 85, 128, 88, 0, 0, - 4, 0, 0, 2, 128, 0, 0, 85, 128, 5, 0, 85, 160, 5, 0, - 170, 160, 7, 0, 0, 2, 0, 0, 4, 128, 0, 0, 170, 128, 6, - 0, 0, 2, 1, 0, 1, 128, 0, 0, 170, 128, 1, 0, 0, 2, - 1, 0, 6, 128, 1, 0, 0, 129, 2, 0, 0, 3, 0, 0, 13, - 128, 0, 0, 0, 128, 1, 0, 148, 128, 6, 0, 0, 2, 1, 0, - 1, 128, 1, 0, 170, 160, 5, 0, 0, 3, 0, 0, 13, 128, 0, - 0, 228, 128, 1, 0, 0, 128, 1, 0, 0, 2, 1, 0, 8, 128, - 1, 0, 255, 160, 4, 0, 0, 4, 1, 0, 7, 128, 0, 0, 248, - 128, 0, 0, 170, 160, 1, 0, 255, 128, 88, 0, 0, 4, 1, 0, - 8, 128, 1, 0, 0, 128, 0, 0, 0, 128, 0, 0, 255, 128, 88, - 0, 0, 4, 0, 0, 13, 128, 1, 0, 148, 128, 6, 0, 68, 160, - 6, 0, 230, 160, 19, 0, 0, 2, 1, 0, 1, 128, 1, 0, 255, - 128, 2, 0, 0, 3, 1, 0, 1, 128, 1, 0, 0, 129, 1, 0, - 255, 128, 5, 0, 0, 3, 1, 0, 2, 128, 1, 0, 0, 128, 5, - 0, 0, 160, 35, 0, 0, 2, 1, 0, 2, 128, 1, 0, 85, 128, - 19, 0, 0, 2, 1, 0, 2, 128, 1, 0, 85, 128, 88, 0, 0, - 4, 1, 0, 2, 128, 1, 0, 0, 128, 1, 0, 85, 128, 1, 0, - 85, 129, 2, 0, 0, 3, 1, 0, 1, 128, 1, 0, 0, 129, 1, - 0, 255, 128, 2, 0, 0, 3, 1, 0, 2, 128, 1, 0, 85, 128, - 1, 0, 85, 128, 35, 0, 0, 2, 1, 0, 2, 128, 1, 0, 85, - 128, 5, 0, 0, 3, 1, 0, 2, 128, 1, 0, 85, 128, 2, 0, - 170, 160, 19, 0, 0, 2, 1, 0, 4, 128, 1, 0, 255, 129, 18, - 0, 0, 4, 2, 0, 8, 128, 1, 0, 85, 128, 1, 0, 170, 128, - 1, 0, 0, 128, 18, 0, 0, 4, 3, 0, 1, 128, 2, 0, 85, - 160, 2, 0, 255, 128, 1, 0, 255, 128, 1, 0, 0, 2, 3, 0, - 2, 128, 5, 0, 0, 160, 66, 0, 0, 3, 1, 0, 15, 128, 1, - 0, 228, 176, 0, 8, 228, 160, 66, 0, 0, 3, 2, 0, 15, 128, - 3, 0, 228, 128, 1, 8, 228, 160, 5, 0, 0, 3, 2, 0, 7, - 128, 2, 0, 255, 128, 2, 0, 228, 128, 5, 0, 0, 3, 1, 0, - 15, 128, 1, 0, 228, 128, 2, 0, 228, 128, 2, 0, 0, 3, 0, - 0, 8, 128, 0, 0, 255, 128, 0, 0, 0, 128, 88, 0, 0, 4, - 0, 0, 1, 128, 0, 0, 255, 128, 0, 0, 0, 128, 0, 0, 170, - 128, 5, 0, 0, 3, 1, 0, 15, 128, 0, 0, 0, 128, 1, 0, - 228, 128, 5, 0, 0, 3, 0, 0, 15, 128, 0, 0, 85, 128, 1, - 0, 228, 128, 1, 0, 0, 2, 0, 8, 15, 128, 0, 0, 228, 128, - 255, 255, 0, 0, 83, 72, 68, 82, 88, 6, 0, 0, 64, 0, 0, - 0, 150, 1, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, - 0, 0, 5, 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 0, - 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 1, 0, 0, 0, - 88, 24, 0, 4, 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, 0, - 0, 88, 24, 0, 4, 0, 112, 16, 0, 1, 0, 0, 0, 85, 85, - 0, 0, 98, 16, 0, 3, 50, 16, 16, 0, 1, 0, 0, 0, 98, - 16, 0, 3, 50, 16, 16, 0, 2, 0, 0, 0, 101, 0, 0, 3, - 242, 32, 16, 0, 0, 0, 0, 0, 104, 0, 0, 2, 3, 0, 0, - 0, 15, 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, 0, 70, 16, - 16, 0, 1, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 42, 128, 32, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 15, 0, 0, 8, 66, 0, 16, 0, 0, 0, - 0, 0, 70, 16, 16, 0, 1, 0, 0, 0, 70, 128, 32, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 8, 34, 0, 16, 0, - 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 42, 128, 32, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 9, 50, 0, - 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 70, - 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 15, 0, 0, 7, 130, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, - 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 130, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, - 0, 0, 0, 10, 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 56, 0, 0, 8, 130, 0, 16, 0, 0, 0, 0, - 0, 58, 0, 16, 0, 0, 0, 0, 0, 42, 128, 32, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 54, 0, 0, 6, 66, 0, 16, 0, 0, - 0, 0, 0, 58, 128, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 16, 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, 0, 70, 2, 16, - 0, 0, 0, 0, 0, 70, 130, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 50, 0, 0, 10, 34, 0, 16, 0, 0, 0, 0, 0, 10, - 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, - 58, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, - 6, 18, 0, 16, 0, 1, 0, 0, 0, 26, 0, 16, 128, 129, 0, - 0, 0, 0, 0, 0, 0, 29, 0, 0, 7, 34, 0, 16, 0, 0, - 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 7, 34, 0, 16, 0, 0, 0, 0, - 0, 26, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, - 128, 63, 54, 0, 0, 6, 34, 0, 16, 0, 1, 0, 0, 0, 10, - 0, 16, 128, 65, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7, - 82, 0, 16, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0, 0, - 0, 6, 1, 16, 0, 1, 0, 0, 0, 14, 0, 0, 8, 82, 0, - 16, 0, 0, 0, 0, 0, 6, 2, 16, 0, 0, 0, 0, 0, 166, - 138, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8, - 130, 0, 16, 0, 0, 0, 0, 0, 42, 0, 16, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 56, 0, - 0, 8, 50, 0, 16, 0, 1, 0, 0, 0, 134, 0, 16, 0, 0, - 0, 0, 0, 166, 138, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 29, 0, 0, 9, 50, 0, 16, 0, 1, 0, 0, 0, 70, 0, 16, - 0, 1, 0, 0, 0, 246, 143, 32, 128, 65, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 1, 0, 0, 10, 50, 0, 16, 0, 1, - 0, 0, 0, 70, 0, 16, 0, 1, 0, 0, 0, 2, 64, 0, 0, - 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, - 0, 50, 0, 0, 9, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, - 16, 0, 1, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 42, - 0, 16, 0, 0, 0, 0, 0, 52, 0, 0, 7, 66, 0, 16, 0, - 0, 0, 0, 0, 26, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, - 0, 1, 0, 0, 0, 29, 0, 0, 7, 66, 0, 16, 0, 0, 0, - 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, - 0, 0, 0, 55, 0, 0, 9, 66, 0, 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, - 128, 1, 64, 0, 0, 0, 0, 128, 63, 66, 0, 0, 5, 130, 0, - 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 130, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 128, - 65, 0, 0, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, - 0, 65, 0, 0, 5, 18, 0, 16, 0, 1, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, 56, 0, 0, 7, 34, 0, 16, 0, 1, - 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 8, 18, 0, 16, 0, 1, 0, 0, - 0, 10, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 128, 65, 0, - 0, 0, 1, 0, 0, 0, 29, 0, 0, 8, 66, 0, 16, 0, 1, - 0, 0, 0, 26, 0, 16, 0, 1, 0, 0, 0, 26, 0, 16, 128, - 65, 0, 0, 0, 1, 0, 0, 0, 26, 0, 0, 6, 34, 0, 16, - 0, 1, 0, 0, 0, 26, 0, 16, 128, 129, 0, 0, 0, 1, 0, - 0, 0, 55, 0, 0, 10, 34, 0, 16, 0, 1, 0, 0, 0, 42, - 0, 16, 0, 1, 0, 0, 0, 26, 0, 16, 0, 1, 0, 0, 0, - 26, 0, 16, 128, 65, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 7, 34, 0, 16, 0, 1, 0, 0, 0, 26, 0, 16, 0, 1, 0, - 0, 0, 26, 0, 16, 0, 1, 0, 0, 0, 56, 0, 0, 9, 66, - 0, 16, 0, 1, 0, 0, 0, 26, 0, 16, 128, 129, 0, 0, 0, - 1, 0, 0, 0, 42, 128, 32, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 50, 0, 0, 11, 34, 0, 16, 0, 1, 0, 0, 0, 26, 0, - 16, 128, 193, 0, 0, 0, 1, 0, 0, 0, 42, 128, 32, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, - 56, 0, 0, 7, 130, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, - 0, 0, 0, 0, 0, 42, 0, 16, 0, 1, 0, 0, 0, 50, 0, - 0, 9, 130, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 1, - 0, 0, 0, 26, 0, 16, 0, 1, 0, 0, 0, 58, 0, 16, 0, - 0, 0, 0, 0, 56, 0, 0, 8, 130, 0, 16, 0, 0, 0, 0, - 0, 58, 0, 16, 0, 0, 0, 0, 0, 26, 128, 32, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 9, 18, 0, 16, 0, 1, - 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 26, 128, 32, 128, - 65, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 50, 0, 0, - 9, 18, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 58, 0, 16, 0, 0, - 0, 0, 0, 54, 0, 0, 5, 34, 0, 16, 0, 1, 0, 0, 0, - 1, 64, 0, 0, 0, 0, 0, 63, 69, 0, 0, 9, 242, 0, 16, - 0, 1, 0, 0, 0, 70, 0, 16, 0, 1, 0, 0, 0, 70, 126, - 16, 0, 1, 0, 0, 0, 0, 96, 16, 0, 1, 0, 0, 0, 56, - 0, 0, 7, 114, 0, 16, 0, 1, 0, 0, 0, 246, 15, 16, 0, - 1, 0, 0, 0, 70, 2, 16, 0, 1, 0, 0, 0, 69, 0, 0, - 9, 242, 0, 16, 0, 2, 0, 0, 0, 70, 16, 16, 0, 2, 0, - 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, - 0, 0, 0, 56, 0, 0, 7, 242, 0, 16, 0, 1, 0, 0, 0, - 70, 14, 16, 0, 1, 0, 0, 0, 70, 14, 16, 0, 2, 0, 0, - 0, 56, 0, 0, 7, 242, 0, 16, 0, 1, 0, 0, 0, 166, 10, - 16, 0, 0, 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 56, - 0, 0, 7, 242, 32, 16, 0, 0, 0, 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 62, 0, 0, - 1, 83, 84, 65, 84, 116, 0, 0, 0, 49, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 40, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 82, 68, 69, 70, 168, 2, 0, 0, 1, 0, - 0, 0, 16, 1, 0, 0, 5, 0, 0, 0, 28, 0, 0, 0, 0, - 4, 255, 255, 0, 1, 0, 0, 116, 2, 0, 0, 188, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 201, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 217, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, - 0, 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, - 0, 0, 230, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, - 0, 0, 0, 255, 255, 255, 255, 1, 0, 0, 0, 1, 0, 0, 0, - 13, 0, 0, 0, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, 73, 110, 112, 117, 116, 83, 97, 109, 112, - 108, 101, 114, 0, 71, 114, 97, 100, 105, 101, 110, 116, 83, 97, 109, - 112, 108, 101, 114, 0, 73, 110, 112, 117, 116, 84, 101, 120, 116, 117, - 114, 101, 0, 71, 114, 97, 100, 105, 101, 110, 116, 84, 101, 120, 116, - 117, 114, 101, 0, 114, 97, 100, 105, 97, 108, 71, 114, 97, 100, 105, - 101, 110, 116, 67, 111, 110, 115, 116, 97, 110, 116, 115, 0, 171, 171, - 246, 0, 0, 0, 8, 0, 0, 0, 40, 1, 0, 0, 80, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 1, 0, 0, 0, 0, - 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 240, 1, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 16, 0, 0, 0, 8, 0, 0, 0, - 2, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 24, 2, 0, - 0, 24, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 28, 2, - 0, 0, 0, 0, 0, 0, 44, 2, 0, 0, 28, 0, 0, 0, 4, - 0, 0, 0, 2, 0, 0, 0, 28, 2, 0, 0, 0, 0, 0, 0, - 52, 2, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, - 0, 28, 2, 0, 0, 0, 0, 0, 0, 63, 2, 0, 0, 36, 0, - 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 28, 2, 0, 0, 0, - 0, 0, 0, 78, 2, 0, 0, 40, 0, 0, 0, 4, 0, 0, 0, - 2, 0, 0, 0, 28, 2, 0, 0, 0, 0, 0, 0, 88, 2, 0, - 0, 48, 0, 0, 0, 28, 0, 0, 0, 2, 0, 0, 0, 100, 2, - 0, 0, 0, 0, 0, 0, 100, 105, 102, 102, 0, 171, 171, 171, 1, - 0, 3, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 101, 110, 116, 101, 114, 49, 0, 1, 0, 3, 0, 1, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 171, 171, 0, 0, - 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, - 97, 100, 105, 117, 115, 49, 0, 115, 113, 95, 114, 97, 100, 105, 117, - 115, 49, 0, 114, 101, 112, 101, 97, 116, 95, 99, 111, 114, 114, 101, - 99, 116, 0, 97, 108, 108, 111, 119, 95, 111, 100, 100, 0, 116, 114, - 97, 110, 115, 102, 111, 114, 109, 0, 171, 171, 3, 0, 3, 0, 3, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 105, 99, 114, - 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, - 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, 56, 52, - 0, 171, 171, 73, 83, 71, 78, 116, 0, 0, 0, 3, 0, 0, 0, - 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, - 0, 0, 0, 15, 3, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 15, 3, 0, - 0, 83, 86, 95, 80, 79, 83, 73, 84, 73, 79, 78, 0, 83, 67, - 69, 78, 69, 95, 80, 79, 83, 73, 84, 73, 79, 78, 0, 84, 69, - 88, 67, 79, 79, 82, 68, 0, 79, 83, 71, 78, 44, 0, 0, 0, - 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, - 0, 0, 83, 86, 95, 84, 97, 114, 103, 101, 116, 0, 171, 171}; -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 -// -// -// Buffer Definitions: -// -// cbuffer radialGradientConstants -// { -// -// float3 diff; // Offset: 0 Size: 12 -// float2 center1; // Offset: 16 Size: 8 -// float A; // Offset: 24 Size: 4 [unused] -// float radius1; // Offset: 28 Size: 4 -// float sq_radius1; // Offset: 32 Size: 4 [unused] -// float repeat_correct; // Offset: 36 Size: 4 -// float allow_odd; // Offset: 40 Size: 4 -// float3x2 transform; // Offset: 48 Size: 28 -// -// } -// -// -// Resource Bindings: -// -// Name Type Format Dim Slot Elements -// ------------------------------ ---------- ------- ----------- ---- -------- -// InputSampler sampler NA NA 0 1 -// GradientSampler sampler NA NA 1 1 -// InputTexture texture float4 2d 0 1 -// GradientTexture texture float4 2d 1 1 -// radialGradientConstants cbuffer NA NA 0 1 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_POSITION 0 xyzw 0 POS float -// SCENE_POSITION 0 xyzw 1 NONE float xy -// TEXCOORD 0 xyzw 2 NONE float xy -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_Target 0 xyzw 0 TARGET float xyzw -// -// -// Constant buffer to DX9 shader constant mappings: -// -// Target Reg Buffer Start Reg # of Regs Data Conversion -// ---------- ------- --------- --------- ---------------------- -// c0 cb0 0 5 ( FLT, FLT, FLT, FLT) -// -// -// Sampler/Resource to DX9 shader sampler mappings: -// -// Target Sampler Source Sampler Source Resource -// -------------- --------------- ---------------- -// s0 s0 t0 -// s1 s1 t1 -// -// -// Level9 shader bytecode: -// - ps_2_x - def c5, 0.5, -0, 1, 0 - dcl t0 - dcl t1 - dcl_2d s0 - dcl_2d s1 - dp2add r0.x, t0, c3, c3.z - dp2add r0.y, t0, c4, c4.z - add r0.xy, r0, -c1 - mul r0.w, c1.w, c1.w - dp2add r0.w, r0, r0, -r0.w - mul r0.w, r0.w, c5.x - mov r0.z, c1.w - dp3 r0.x, r0, c0 - rcp r0.x, r0.x - mul r0.y, r0.x, r0.w - frc r0.z, r0.y - add r0.z, -r0.z, r0.y - mul r1.w, r0.z, c5.x - abs r1.x, r1.w - frc r1.x, r1.x - cmp r1.x, r0.z, r1.x, -r1.x - mad r0.x, r0.w, r0.x, -r0.z - add r0.z, r1.x, r1.x - abs r0.z, r0.z - mul r0.z, r0.z, c2.z - frc r0.w, -r0.y - lrp r1.x, r0.z, r0.w, r0.x - lrp r2.x, c2.y, r1.x, r0.y - mov r0.w, c1.w - mad r0.x, r0.y, -c0.z, -r0.w - cmp r0.x, r0.x, c5.y, c5.z - mov r2.y, c5.x - texld r1, t1, s0 - texld r2, r2, s1 - mul r2.xyz, r2.w, r2 - mul r1, r1, r2 - mul r0, r0.x, r1 - mov oC0, r0 - -// approximately 36 instruction slots used (2 texture, 34 arithmetic) -ps_4_0 -dcl_constantbuffer cb0[5], immediateIndexed -dcl_sampler s0, mode_default -dcl_sampler s1, mode_default -dcl_resource_texture2d (float,float,float,float) t0 -dcl_resource_texture2d (float,float,float,float) t1 -dcl_input_ps linear v1.xy -dcl_input_ps linear v2.xy -dcl_output o0.xyzw -dcl_temps 3 -dp2 r0.x, v1.xyxx, cb0[3].xyxx -add r0.x, r0.x, cb0[3].z -dp2 r0.z, v1.xyxx, cb0[4].xyxx -add r0.y, r0.z, cb0[4].z -add r0.xy, r0.xyxx, -cb0[1].xyxx -dp2 r0.w, r0.xyxx, r0.xyxx -mad r0.w, -cb0[1].w, cb0[1].w, r0.w -mul r0.w, r0.w, l(0.500000) -mov r0.z, cb0[1].w -dp3 r0.x, r0.xyzx, cb0[0].xyzx -div r0.x, r0.w, r0.x -round_pi r0.y, r0.x -round_ni r0.z, r0.x -mul r0.w, r0.z, l(0.500000) -add r0.yz, -r0.xxzx, r0.yyxy -ge r1.x, r0.w, -r0.w -frc r0.w, |r0.w| -movc r0.w, r1.x, r0.w, -r0.w -add r0.w, r0.w, r0.w -mul r1.x, |r0.w|, cb0[2].z -mad r0.w, -|r0.w|, cb0[2].z, l(1.000000) -mul r0.y, r0.y, r1.x -mad r0.y, r0.z, r0.w, r0.y -mul r0.y, r0.y, cb0[2].y -add r0.z, l(1.000000), -cb0[2].y -mad r1.x, r0.x, r0.z, r0.y -mul r0.x, r0.x, cb0[0].z -ge r0.x, -cb0[1].w, r0.x -movc r0.x, r0.x, l(-0.000000), l(1.000000) -mov r1.y, l(0.500000) -sample r1.xyzw, r1.xyxx, t1.xyzw, s1 -mul r1.xyz, r1.wwww, r1.xyzx -sample r2.xyzw, v2.xyxx, t0.xyzw, s0 -mul r1.xyzw, r1.xyzw, r2.xyzw -mul o0.xyzw, r0.xxxx, r1.xyzw -ret -// Approximately 36 instruction slots used -#endif - -const BYTE SampleRadialGradientA0PS[] = { - 68, 88, 66, 67, 251, 98, 227, 203, 98, 180, 0, 199, 88, 100, 39, - 81, 223, 130, 11, 15, 1, 0, 0, 0, 136, 11, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, 212, 2, 0, 0, 172, 7, 0, 0, 40, - 8, 0, 0, 216, 10, 0, 0, 84, 11, 0, 0, 65, 111, 110, 57, - 148, 2, 0, 0, 148, 2, 0, 0, 0, 2, 255, 255, 92, 2, 0, - 0, 56, 0, 0, 0, 1, 0, 44, 0, 0, 0, 56, 0, 0, 0, - 56, 0, 2, 0, 36, 0, 0, 0, 56, 0, 0, 0, 0, 0, 1, - 1, 1, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 255, 255, 81, 0, 0, 5, 5, 0, 15, 160, 0, 0, 0, - 63, 0, 0, 0, 128, 0, 0, 128, 63, 0, 0, 0, 0, 31, 0, - 0, 2, 0, 0, 0, 128, 0, 0, 15, 176, 31, 0, 0, 2, 0, - 0, 0, 128, 1, 0, 15, 176, 31, 0, 0, 2, 0, 0, 0, 144, - 0, 8, 15, 160, 31, 0, 0, 2, 0, 0, 0, 144, 1, 8, 15, - 160, 90, 0, 0, 4, 0, 0, 1, 128, 0, 0, 228, 176, 3, 0, - 228, 160, 3, 0, 170, 160, 90, 0, 0, 4, 0, 0, 2, 128, 0, - 0, 228, 176, 4, 0, 228, 160, 4, 0, 170, 160, 2, 0, 0, 3, - 0, 0, 3, 128, 0, 0, 228, 128, 1, 0, 228, 161, 5, 0, 0, - 3, 0, 0, 8, 128, 1, 0, 255, 160, 1, 0, 255, 160, 90, 0, - 0, 4, 0, 0, 8, 128, 0, 0, 228, 128, 0, 0, 228, 128, 0, - 0, 255, 129, 5, 0, 0, 3, 0, 0, 8, 128, 0, 0, 255, 128, - 5, 0, 0, 160, 1, 0, 0, 2, 0, 0, 4, 128, 1, 0, 255, - 160, 8, 0, 0, 3, 0, 0, 1, 128, 0, 0, 228, 128, 0, 0, - 228, 160, 6, 0, 0, 2, 0, 0, 1, 128, 0, 0, 0, 128, 5, - 0, 0, 3, 0, 0, 2, 128, 0, 0, 0, 128, 0, 0, 255, 128, - 19, 0, 0, 2, 0, 0, 4, 128, 0, 0, 85, 128, 2, 0, 0, - 3, 0, 0, 4, 128, 0, 0, 170, 129, 0, 0, 85, 128, 5, 0, - 0, 3, 1, 0, 8, 128, 0, 0, 170, 128, 5, 0, 0, 160, 35, - 0, 0, 2, 1, 0, 1, 128, 1, 0, 255, 128, 19, 0, 0, 2, - 1, 0, 1, 128, 1, 0, 0, 128, 88, 0, 0, 4, 1, 0, 1, - 128, 0, 0, 170, 128, 1, 0, 0, 128, 1, 0, 0, 129, 4, 0, - 0, 4, 0, 0, 1, 128, 0, 0, 255, 128, 0, 0, 0, 128, 0, - 0, 170, 129, 2, 0, 0, 3, 0, 0, 4, 128, 1, 0, 0, 128, - 1, 0, 0, 128, 35, 0, 0, 2, 0, 0, 4, 128, 0, 0, 170, - 128, 5, 0, 0, 3, 0, 0, 4, 128, 0, 0, 170, 128, 2, 0, - 170, 160, 19, 0, 0, 2, 0, 0, 8, 128, 0, 0, 85, 129, 18, - 0, 0, 4, 1, 0, 1, 128, 0, 0, 170, 128, 0, 0, 255, 128, - 0, 0, 0, 128, 18, 0, 0, 4, 2, 0, 1, 128, 2, 0, 85, - 160, 1, 0, 0, 128, 0, 0, 85, 128, 1, 0, 0, 2, 0, 0, - 8, 128, 1, 0, 255, 160, 4, 0, 0, 4, 0, 0, 1, 128, 0, - 0, 85, 128, 0, 0, 170, 161, 0, 0, 255, 129, 88, 0, 0, 4, - 0, 0, 1, 128, 0, 0, 0, 128, 5, 0, 85, 160, 5, 0, 170, - 160, 1, 0, 0, 2, 2, 0, 2, 128, 5, 0, 0, 160, 66, 0, - 0, 3, 1, 0, 15, 128, 1, 0, 228, 176, 0, 8, 228, 160, 66, - 0, 0, 3, 2, 0, 15, 128, 2, 0, 228, 128, 1, 8, 228, 160, - 5, 0, 0, 3, 2, 0, 7, 128, 2, 0, 255, 128, 2, 0, 228, - 128, 5, 0, 0, 3, 1, 0, 15, 128, 1, 0, 228, 128, 2, 0, - 228, 128, 5, 0, 0, 3, 0, 0, 15, 128, 0, 0, 0, 128, 1, - 0, 228, 128, 1, 0, 0, 2, 0, 8, 15, 128, 0, 0, 228, 128, - 255, 255, 0, 0, 83, 72, 68, 82, 208, 4, 0, 0, 64, 0, 0, - 0, 52, 1, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, - 0, 0, 5, 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 0, - 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 1, 0, 0, 0, - 88, 24, 0, 4, 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, 0, - 0, 88, 24, 0, 4, 0, 112, 16, 0, 1, 0, 0, 0, 85, 85, - 0, 0, 98, 16, 0, 3, 50, 16, 16, 0, 1, 0, 0, 0, 98, - 16, 0, 3, 50, 16, 16, 0, 2, 0, 0, 0, 101, 0, 0, 3, - 242, 32, 16, 0, 0, 0, 0, 0, 104, 0, 0, 2, 3, 0, 0, - 0, 15, 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, 0, 70, 16, - 16, 0, 1, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 42, 128, 32, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 15, 0, 0, 8, 66, 0, 16, 0, 0, 0, - 0, 0, 70, 16, 16, 0, 1, 0, 0, 0, 70, 128, 32, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 8, 34, 0, 16, 0, - 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 42, 128, 32, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 9, 50, 0, - 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 70, - 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 15, 0, 0, 7, 130, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, - 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 50, 0, - 0, 12, 130, 0, 16, 0, 0, 0, 0, 0, 58, 128, 32, 128, 65, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 58, 128, 32, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, - 0, 56, 0, 0, 7, 130, 0, 16, 0, 0, 0, 0, 0, 58, 0, - 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 63, 54, - 0, 0, 6, 66, 0, 16, 0, 0, 0, 0, 0, 58, 128, 32, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 16, 0, 0, 8, 18, 0, 16, - 0, 0, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, 0, 70, 130, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 7, 18, - 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 66, 0, 0, 5, 34, 0, 16, - 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 65, 0, - 0, 5, 66, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, - 0, 0, 0, 56, 0, 0, 7, 130, 0, 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, - 63, 0, 0, 0, 8, 98, 0, 16, 0, 0, 0, 0, 0, 6, 2, - 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 86, 4, 16, 0, 0, - 0, 0, 0, 29, 0, 0, 8, 18, 0, 16, 0, 1, 0, 0, 0, - 58, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 26, 0, 0, 6, 130, 0, 16, 0, 0, 0, - 0, 0, 58, 0, 16, 128, 129, 0, 0, 0, 0, 0, 0, 0, 55, - 0, 0, 10, 130, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, - 1, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, - 128, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 130, 0, - 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 58, - 0, 16, 0, 0, 0, 0, 0, 56, 0, 0, 9, 18, 0, 16, 0, - 1, 0, 0, 0, 58, 0, 16, 128, 129, 0, 0, 0, 0, 0, 0, - 0, 42, 128, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, 50, 0, - 0, 11, 130, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 128, 193, - 0, 0, 0, 0, 0, 0, 0, 42, 128, 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 1, 64, 0, 0, 0, 0, 128, 63, 56, 0, 0, - 7, 34, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 50, 0, 0, 9, 34, - 0, 16, 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, - 58, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, - 0, 56, 0, 0, 8, 34, 0, 16, 0, 0, 0, 0, 0, 26, 0, - 16, 0, 0, 0, 0, 0, 26, 128, 32, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 9, 66, 0, 16, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 0, 0, 128, 63, 26, 128, 32, 128, 65, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 50, 0, 0, 9, 18, 0, - 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 42, - 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, - 56, 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, - 0, 0, 0, 0, 0, 42, 128, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 29, 0, 0, 9, 18, 0, 16, 0, 0, 0, 0, 0, 58, - 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 55, 0, 0, 9, 18, 0, 16, - 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 128, 1, 64, 0, 0, 0, 0, 128, 63, 54, - 0, 0, 5, 34, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, - 0, 0, 0, 63, 69, 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, - 0, 70, 0, 16, 0, 1, 0, 0, 0, 70, 126, 16, 0, 1, 0, - 0, 0, 0, 96, 16, 0, 1, 0, 0, 0, 56, 0, 0, 7, 114, - 0, 16, 0, 1, 0, 0, 0, 246, 15, 16, 0, 1, 0, 0, 0, - 70, 2, 16, 0, 1, 0, 0, 0, 69, 0, 0, 9, 242, 0, 16, - 0, 2, 0, 0, 0, 70, 16, 16, 0, 2, 0, 0, 0, 70, 126, - 16, 0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 56, - 0, 0, 7, 242, 0, 16, 0, 1, 0, 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, 56, 0, 0, - 7, 242, 32, 16, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 62, 0, 0, 1, 83, - 84, 65, 84, 116, 0, 0, 0, 36, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 68, 69, 70, 168, 2, 0, 0, 1, 0, 0, 0, - 16, 1, 0, 0, 5, 0, 0, 0, 28, 0, 0, 0, 0, 4, 255, - 255, 0, 1, 0, 0, 116, 2, 0, 0, 188, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 201, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 217, 0, - 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, - 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, - 230, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, - 0, 255, 255, 255, 255, 1, 0, 0, 0, 1, 0, 0, 0, 13, 0, - 0, 0, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 73, 110, 112, 117, 116, 83, 97, 109, 112, 108, 101, - 114, 0, 71, 114, 97, 100, 105, 101, 110, 116, 83, 97, 109, 112, 108, - 101, 114, 0, 73, 110, 112, 117, 116, 84, 101, 120, 116, 117, 114, 101, - 0, 71, 114, 97, 100, 105, 101, 110, 116, 84, 101, 120, 116, 117, 114, - 101, 0, 114, 97, 100, 105, 97, 108, 71, 114, 97, 100, 105, 101, 110, - 116, 67, 111, 110, 115, 116, 97, 110, 116, 115, 0, 171, 171, 246, 0, - 0, 0, 8, 0, 0, 0, 40, 1, 0, 0, 80, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 232, 1, 0, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 2, 0, 0, 0, 240, 1, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 16, 0, 0, 0, 8, 0, 0, 0, 2, 0, - 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 24, 2, 0, 0, 24, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 28, 2, 0, 0, - 0, 0, 0, 0, 44, 2, 0, 0, 28, 0, 0, 0, 4, 0, 0, - 0, 2, 0, 0, 0, 28, 2, 0, 0, 0, 0, 0, 0, 52, 2, - 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 28, - 2, 0, 0, 0, 0, 0, 0, 63, 2, 0, 0, 36, 0, 0, 0, - 4, 0, 0, 0, 2, 0, 0, 0, 28, 2, 0, 0, 0, 0, 0, - 0, 78, 2, 0, 0, 40, 0, 0, 0, 4, 0, 0, 0, 2, 0, - 0, 0, 28, 2, 0, 0, 0, 0, 0, 0, 88, 2, 0, 0, 48, - 0, 0, 0, 28, 0, 0, 0, 2, 0, 0, 0, 100, 2, 0, 0, - 0, 0, 0, 0, 100, 105, 102, 102, 0, 171, 171, 171, 1, 0, 3, - 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 101, - 110, 116, 101, 114, 49, 0, 1, 0, 3, 0, 1, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 65, 0, 171, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 97, 100, - 105, 117, 115, 49, 0, 115, 113, 95, 114, 97, 100, 105, 117, 115, 49, - 0, 114, 101, 112, 101, 97, 116, 95, 99, 111, 114, 114, 101, 99, 116, - 0, 97, 108, 108, 111, 119, 95, 111, 100, 100, 0, 116, 114, 97, 110, - 115, 102, 111, 114, 109, 0, 171, 171, 3, 0, 3, 0, 3, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 105, 99, 114, 111, 115, - 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, - 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, - 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 171, - 171, 73, 83, 71, 78, 116, 0, 0, 0, 3, 0, 0, 0, 8, 0, - 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 92, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, - 0, 15, 3, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 15, 3, 0, 0, 83, - 86, 95, 80, 79, 83, 73, 84, 73, 79, 78, 0, 83, 67, 69, 78, - 69, 95, 80, 79, 83, 73, 84, 73, 79, 78, 0, 84, 69, 88, 67, - 79, 79, 82, 68, 0, 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, - 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 83, 86, 95, 84, 97, 114, 103, 101, 116, 0, 171, 171}; -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 -// -// -// Buffer Definitions: -// -// cbuffer conicGradientConstants -// { -// -// float2 center; // Offset: 0 Size: 8 -// float angle; // Offset: 8 Size: 4 -// float start_offset; // Offset: 12 Size: 4 -// float end_offset; // Offset: 16 Size: 4 -// float repeat_correct_conic; // Offset: 20 Size: 4 [unused] -// float allow_odd_conic; // Offset: 24 Size: 4 [unused] -// float3x2 transform_conic; // Offset: 32 Size: 28 -// -// } -// -// -// Resource Bindings: -// -// Name Type Format Dim Slot Elements -// ------------------------------ ---------- ------- ----------- ---- -------- -// InputSampler sampler NA NA 0 1 -// GradientSampler sampler NA NA 1 1 -// InputTexture texture float4 2d 0 1 -// GradientTexture texture float4 2d 1 1 -// conicGradientConstants cbuffer NA NA 0 1 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_POSITION 0 xyzw 0 POS float -// SCENE_POSITION 0 xyzw 1 NONE float xy -// TEXCOORD 0 xyzw 2 NONE float xy -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_Target 0 xyzw 0 TARGET float xyzw -// -// -// Constant buffer to DX9 shader constant mappings: -// -// Target Reg Buffer Start Reg # of Regs Data Conversion -// ---------- ------- --------- --------- ---------------------- -// c0 cb0 0 4 ( FLT, FLT, FLT, FLT) -// -// -// Sampler/Resource to DX9 shader sampler mappings: -// -// Target Sampler Source Sampler Source Resource -// -------------- --------------- ---------------- -// s0 s0 t0 -// s1 s1 t1 -// -// -// Level9 shader bytecode: -// - ps_2_x - def c4, 0.0208350997, -0.0851330012, 0.180141002, -0.330299497 - def c5, 0.999866009, 0, 1, 3.14159274 - def c6, -2, 1.57079637, 0.159154937, 0.5 - dcl t0 - dcl t1 - dcl_2d s0 - dcl_2d s1 - dp2add r0.w, t0, c2, c2.z - add r0.x, -r0.w, c0.x - dp2add r0.z, t0, c3, c3.z - add r0.z, -r0.z, c0.y - abs r0.yw, r0.xxzz - max r1.w, r0.y, r0.w - rcp r1.x, r1.w - min r1.y, r0.w, r0.y - add r0.y, -r0.y, r0.w - cmp r0.y, r0.y, c5.y, c5.z - mul r0.w, r1.x, r1.y - mul r1.x, r0.w, r0.w - mad r1.y, r1.x, c4.x, c4.y - mad r1.y, r1.x, r1.y, c4.z - mad r1.y, r1.x, r1.y, c4.w - mad r1.x, r1.x, r1.y, c5.x - mul r0.w, r0.w, r1.x - mad r1.x, r0.w, c6.x, c6.y - mad r0.y, r1.x, r0.y, r0.w - cmp r0.w, -r0.z, -c5.y, -c5.w - add r0.y, r0.w, r0.y - add r0.w, r0.y, r0.y - max r1.x, r0.x, -r0.z - min r1.y, -r0.z, r0.x - cmp r0.x, r1.x, c5.z, c5.y - cmp r0.x, r1.y, c5.y, r0.x - mad r0.x, r0.x, -r0.w, r0.y - add r0.x, r0.x, -c0.z - mov r0.w, c0.w - add r0.y, -r0.w, c1.x - rcp r0.y, r0.y - mul r0.x, r0.x, r0.y - mov r0.z, c6.z - mad r0.x, r0.x, r0.z, c1.x - add r0.x, r0.x, -c0.w - add r0.x, r0.x, c6.w - abs r0.y, r0.x - frc r0.y, r0.y - cmp r0.x, r0.x, r0.y, -r0.y - mov r0.y, c6.w - texld r1, t1, s0 - texld r0, r0, s1 - mul r0.xyz, r0.w, r0 - mul r0, r1, r0 - mov oC0, r0 - -// approximately 47 instruction slots used (2 texture, 45 arithmetic) -ps_4_0 -dcl_constantbuffer cb0[4], immediateIndexed -dcl_sampler s0, mode_default -dcl_sampler s1, mode_default -dcl_resource_texture2d (float,float,float,float) t0 -dcl_resource_texture2d (float,float,float,float) t1 -dcl_input_ps linear v1.xy -dcl_input_ps linear v2.xy -dcl_output o0.xyzw -dcl_temps 2 -dp2 r0.x, v1.xyxx, cb0[2].xyxx -add r0.x, r0.x, cb0[2].z -dp2 r0.y, v1.xyxx, cb0[3].xyxx -add r0.y, r0.y, cb0[3].z -add r0.xy, -r0.xyxx, cb0[0].xyxx -max r0.z, |r0.y|, |r0.x| -div r0.z, l(1.000000, 1.000000, 1.000000, 1.000000), r0.z -min r0.w, |r0.y|, |r0.x| -mul r0.z, r0.z, r0.w -mul r0.w, r0.z, r0.z -mad r1.x, r0.w, l(0.020835), l(-0.085133) -mad r1.x, r0.w, r1.x, l(0.180141) -mad r1.x, r0.w, r1.x, l(-0.330299) -mad r0.w, r0.w, r1.x, l(0.999866) -mul r1.x, r0.w, r0.z -mad r1.x, r1.x, l(-2.000000), l(1.570796) -lt r1.y, |r0.y|, |r0.x| -and r1.x, r1.y, r1.x -mad r0.z, r0.z, r0.w, r1.x -lt r0.w, -r0.y, r0.y -and r0.w, r0.w, l(0xc0490fdb) -add r0.z, r0.w, r0.z -min r0.w, -r0.y, r0.x -max r0.x, -r0.y, r0.x -ge r0.x, r0.x, -r0.x -lt r0.y, r0.w, -r0.w -and r0.x, r0.x, r0.y -movc r0.x, r0.x, -r0.z, r0.z -add r0.x, r0.x, -cb0[0].z -add r0.y, -cb0[0].w, cb0[1].x -div r0.y, l(1.000000, 1.000000, 1.000000, 1.000000), r0.y -mul r0.x, r0.x, r0.y -mad r0.x, r0.x, l(0.159155), cb0[1].x -add r0.x, r0.x, -cb0[0].w -add r0.x, r0.x, l(0.500000) -ge r0.y, r0.x, -r0.x -frc r0.x, |r0.x| -movc r0.x, r0.y, r0.x, -r0.x -mov r0.y, l(0.500000) -sample r0.xyzw, r0.xyxx, t1.xyzw, s1 -mul r0.xyz, r0.wwww, r0.xyzx -sample r1.xyzw, v2.xyxx, t0.xyzw, s0 -mul o0.xyzw, r0.xyzw, r1.xyzw -ret -// Approximately 44 instruction slots used -#endif - -const BYTE SampleConicGradientPS[] = { - 68, 88, 66, 67, 111, 210, 133, 71, 96, 114, 123, 208, 6, 154, 50, - 242, 194, 61, 177, 240, 1, 0, 0, 0, 184, 13, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, 224, 3, 0, 0, 240, 9, 0, 0, 108, - 10, 0, 0, 8, 13, 0, 0, 132, 13, 0, 0, 65, 111, 110, 57, - 160, 3, 0, 0, 160, 3, 0, 0, 0, 2, 255, 255, 104, 3, 0, - 0, 56, 0, 0, 0, 1, 0, 44, 0, 0, 0, 56, 0, 0, 0, - 56, 0, 2, 0, 36, 0, 0, 0, 56, 0, 0, 0, 0, 0, 1, - 1, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 255, 255, 81, 0, 0, 5, 4, 0, 15, 160, 95, 174, 170, - 60, 54, 90, 174, 189, 226, 118, 56, 62, 4, 29, 169, 190, 81, 0, - 0, 5, 5, 0, 15, 160, 56, 247, 127, 63, 0, 0, 0, 0, 0, - 0, 128, 63, 219, 15, 73, 64, 81, 0, 0, 5, 6, 0, 15, 160, - 0, 0, 0, 192, 219, 15, 201, 63, 131, 249, 34, 62, 0, 0, 0, - 63, 31, 0, 0, 2, 0, 0, 0, 128, 0, 0, 15, 176, 31, 0, - 0, 2, 0, 0, 0, 128, 1, 0, 15, 176, 31, 0, 0, 2, 0, - 0, 0, 144, 0, 8, 15, 160, 31, 0, 0, 2, 0, 0, 0, 144, - 1, 8, 15, 160, 90, 0, 0, 4, 0, 0, 8, 128, 0, 0, 228, - 176, 2, 0, 228, 160, 2, 0, 170, 160, 2, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 255, 129, 0, 0, 0, 160, 90, 0, 0, 4, 0, - 0, 4, 128, 0, 0, 228, 176, 3, 0, 228, 160, 3, 0, 170, 160, - 2, 0, 0, 3, 0, 0, 4, 128, 0, 0, 170, 129, 0, 0, 85, - 160, 35, 0, 0, 2, 0, 0, 10, 128, 0, 0, 160, 128, 11, 0, - 0, 3, 1, 0, 8, 128, 0, 0, 85, 128, 0, 0, 255, 128, 6, - 0, 0, 2, 1, 0, 1, 128, 1, 0, 255, 128, 10, 0, 0, 3, - 1, 0, 2, 128, 0, 0, 255, 128, 0, 0, 85, 128, 2, 0, 0, - 3, 0, 0, 2, 128, 0, 0, 85, 129, 0, 0, 255, 128, 88, 0, - 0, 4, 0, 0, 2, 128, 0, 0, 85, 128, 5, 0, 85, 160, 5, - 0, 170, 160, 5, 0, 0, 3, 0, 0, 8, 128, 1, 0, 0, 128, - 1, 0, 85, 128, 5, 0, 0, 3, 1, 0, 1, 128, 0, 0, 255, - 128, 0, 0, 255, 128, 4, 0, 0, 4, 1, 0, 2, 128, 1, 0, - 0, 128, 4, 0, 0, 160, 4, 0, 85, 160, 4, 0, 0, 4, 1, - 0, 2, 128, 1, 0, 0, 128, 1, 0, 85, 128, 4, 0, 170, 160, - 4, 0, 0, 4, 1, 0, 2, 128, 1, 0, 0, 128, 1, 0, 85, - 128, 4, 0, 255, 160, 4, 0, 0, 4, 1, 0, 1, 128, 1, 0, - 0, 128, 1, 0, 85, 128, 5, 0, 0, 160, 5, 0, 0, 3, 0, - 0, 8, 128, 0, 0, 255, 128, 1, 0, 0, 128, 4, 0, 0, 4, - 1, 0, 1, 128, 0, 0, 255, 128, 6, 0, 0, 160, 6, 0, 85, - 160, 4, 0, 0, 4, 0, 0, 2, 128, 1, 0, 0, 128, 0, 0, - 85, 128, 0, 0, 255, 128, 88, 0, 0, 4, 0, 0, 8, 128, 0, - 0, 170, 129, 5, 0, 85, 161, 5, 0, 255, 161, 2, 0, 0, 3, - 0, 0, 2, 128, 0, 0, 255, 128, 0, 0, 85, 128, 2, 0, 0, - 3, 0, 0, 8, 128, 0, 0, 85, 128, 0, 0, 85, 128, 11, 0, - 0, 3, 1, 0, 1, 128, 0, 0, 0, 128, 0, 0, 170, 129, 10, - 0, 0, 3, 1, 0, 2, 128, 0, 0, 170, 129, 0, 0, 0, 128, - 88, 0, 0, 4, 0, 0, 1, 128, 1, 0, 0, 128, 5, 0, 170, - 160, 5, 0, 85, 160, 88, 0, 0, 4, 0, 0, 1, 128, 1, 0, - 85, 128, 5, 0, 85, 160, 0, 0, 0, 128, 4, 0, 0, 4, 0, - 0, 1, 128, 0, 0, 0, 128, 0, 0, 255, 129, 0, 0, 85, 128, - 2, 0, 0, 3, 0, 0, 1, 128, 0, 0, 0, 128, 0, 0, 170, - 161, 1, 0, 0, 2, 0, 0, 8, 128, 0, 0, 255, 160, 2, 0, - 0, 3, 0, 0, 2, 128, 0, 0, 255, 129, 1, 0, 0, 160, 6, - 0, 0, 2, 0, 0, 2, 128, 0, 0, 85, 128, 5, 0, 0, 3, - 0, 0, 1, 128, 0, 0, 0, 128, 0, 0, 85, 128, 1, 0, 0, - 2, 0, 0, 4, 128, 6, 0, 170, 160, 4, 0, 0, 4, 0, 0, - 1, 128, 0, 0, 0, 128, 0, 0, 170, 128, 1, 0, 0, 160, 2, - 0, 0, 3, 0, 0, 1, 128, 0, 0, 0, 128, 0, 0, 255, 161, - 2, 0, 0, 3, 0, 0, 1, 128, 0, 0, 0, 128, 6, 0, 255, - 160, 35, 0, 0, 2, 0, 0, 2, 128, 0, 0, 0, 128, 19, 0, - 0, 2, 0, 0, 2, 128, 0, 0, 85, 128, 88, 0, 0, 4, 0, - 0, 1, 128, 0, 0, 0, 128, 0, 0, 85, 128, 0, 0, 85, 129, - 1, 0, 0, 2, 0, 0, 2, 128, 6, 0, 255, 160, 66, 0, 0, - 3, 1, 0, 15, 128, 1, 0, 228, 176, 0, 8, 228, 160, 66, 0, - 0, 3, 0, 0, 15, 128, 0, 0, 228, 128, 1, 8, 228, 160, 5, - 0, 0, 3, 0, 0, 7, 128, 0, 0, 255, 128, 0, 0, 228, 128, - 5, 0, 0, 3, 0, 0, 15, 128, 1, 0, 228, 128, 0, 0, 228, - 128, 1, 0, 0, 2, 0, 8, 15, 128, 0, 0, 228, 128, 255, 255, - 0, 0, 83, 72, 68, 82, 8, 6, 0, 0, 64, 0, 0, 0, 130, - 1, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 90, 0, 0, 3, 0, 96, 16, 0, 0, 0, 0, - 0, 90, 0, 0, 3, 0, 96, 16, 0, 1, 0, 0, 0, 88, 24, - 0, 4, 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, 0, 0, 88, - 24, 0, 4, 0, 112, 16, 0, 1, 0, 0, 0, 85, 85, 0, 0, - 98, 16, 0, 3, 50, 16, 16, 0, 1, 0, 0, 0, 98, 16, 0, - 3, 50, 16, 16, 0, 2, 0, 0, 0, 101, 0, 0, 3, 242, 32, - 16, 0, 0, 0, 0, 0, 104, 0, 0, 2, 2, 0, 0, 0, 15, - 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, 0, - 1, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 8, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, 42, 128, 32, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 15, 0, 0, 8, 34, 0, 16, 0, 0, 0, 0, 0, - 70, 16, 16, 0, 1, 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 8, 34, 0, 16, 0, 0, 0, - 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 42, 128, 32, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 9, 50, 0, 16, 0, - 0, 0, 0, 0, 70, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, - 0, 70, 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, - 0, 9, 66, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 128, 129, - 0, 0, 0, 0, 0, 0, 0, 10, 0, 16, 128, 129, 0, 0, 0, - 0, 0, 0, 0, 14, 0, 0, 10, 66, 0, 16, 0, 0, 0, 0, - 0, 2, 64, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, - 128, 63, 0, 0, 128, 63, 42, 0, 16, 0, 0, 0, 0, 0, 51, - 0, 0, 9, 130, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 128, - 129, 0, 0, 0, 0, 0, 0, 0, 10, 0, 16, 128, 129, 0, 0, - 0, 0, 0, 0, 0, 56, 0, 0, 7, 66, 0, 16, 0, 0, 0, - 0, 0, 42, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, - 0, 0, 0, 56, 0, 0, 7, 130, 0, 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, 0, 0, 42, 0, 16, 0, 0, 0, 0, - 0, 50, 0, 0, 9, 18, 0, 16, 0, 1, 0, 0, 0, 58, 0, - 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 95, 174, 170, 60, 1, - 64, 0, 0, 54, 90, 174, 189, 50, 0, 0, 9, 18, 0, 16, 0, - 1, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, - 0, 1, 0, 0, 0, 1, 64, 0, 0, 226, 118, 56, 62, 50, 0, - 0, 9, 18, 0, 16, 0, 1, 0, 0, 0, 58, 0, 16, 0, 0, - 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, - 4, 29, 169, 190, 50, 0, 0, 9, 130, 0, 16, 0, 0, 0, 0, - 0, 58, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 1, 0, - 0, 0, 1, 64, 0, 0, 56, 247, 127, 63, 56, 0, 0, 7, 18, - 0, 16, 0, 1, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, 0, 0, 50, 0, 0, 9, 18, 0, 16, - 0, 1, 0, 0, 0, 10, 0, 16, 0, 1, 0, 0, 0, 1, 64, - 0, 0, 0, 0, 0, 192, 1, 64, 0, 0, 219, 15, 201, 63, 49, - 0, 0, 9, 34, 0, 16, 0, 1, 0, 0, 0, 26, 0, 16, 128, - 129, 0, 0, 0, 0, 0, 0, 0, 10, 0, 16, 128, 129, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 7, 18, 0, 16, 0, 1, 0, - 0, 0, 26, 0, 16, 0, 1, 0, 0, 0, 10, 0, 16, 0, 1, - 0, 0, 0, 50, 0, 0, 9, 66, 0, 16, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, - 0, 10, 0, 16, 0, 1, 0, 0, 0, 49, 0, 0, 8, 130, 0, - 16, 0, 0, 0, 0, 0, 26, 0, 16, 128, 65, 0, 0, 0, 0, - 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 1, 0, 0, 7, - 130, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, - 0, 1, 64, 0, 0, 219, 15, 73, 192, 0, 0, 0, 7, 66, 0, - 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, 0, 0, 0, 42, - 0, 16, 0, 0, 0, 0, 0, 51, 0, 0, 8, 130, 0, 16, 0, - 0, 0, 0, 0, 26, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, - 0, 10, 0, 16, 0, 0, 0, 0, 0, 52, 0, 0, 8, 18, 0, - 16, 0, 0, 0, 0, 0, 26, 0, 16, 128, 65, 0, 0, 0, 0, - 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 29, 0, 0, 8, - 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, - 0, 10, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 49, 0, - 0, 8, 34, 0, 16, 0, 0, 0, 0, 0, 58, 0, 16, 0, 0, - 0, 0, 0, 58, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, - 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, 0, 0, 55, 0, - 0, 10, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, - 0, 0, 0, 42, 0, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, - 42, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 9, 18, 0, 16, - 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 42, 128, - 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 34, 0, 16, 0, 0, 0, 0, 0, 58, 128, 32, 128, - 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 128, 32, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 10, 34, 0, - 16, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 63, 0, - 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 26, 0, 16, 0, - 0, 0, 0, 0, 56, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, - 0, 10, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, - 0, 0, 50, 0, 0, 10, 18, 0, 16, 0, 0, 0, 0, 0, 10, - 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 131, 249, 34, 62, - 10, 128, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 9, 18, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 0, 0, - 0, 0, 58, 128, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 18, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, - 63, 29, 0, 0, 8, 34, 0, 16, 0, 0, 0, 0, 0, 10, 0, - 16, 0, 0, 0, 0, 0, 10, 0, 16, 128, 65, 0, 0, 0, 0, - 0, 0, 0, 26, 0, 0, 6, 18, 0, 16, 0, 0, 0, 0, 0, - 10, 0, 16, 128, 129, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, - 10, 18, 0, 16, 0, 0, 0, 0, 0, 26, 0, 16, 0, 0, 0, - 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 128, 65, - 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 5, 34, 0, 16, 0, - 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 63, 69, 0, 0, - 9, 242, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, - 0, 0, 70, 126, 16, 0, 1, 0, 0, 0, 0, 96, 16, 0, 1, - 0, 0, 0, 56, 0, 0, 7, 114, 0, 16, 0, 0, 0, 0, 0, - 246, 15, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 0, 0, 0, - 0, 69, 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 70, 16, - 16, 0, 2, 0, 0, 0, 70, 126, 16, 0, 0, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, 0, 56, 0, 0, 7, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, 0, - 0, 0, 44, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 68, - 69, 70, 148, 2, 0, 0, 1, 0, 0, 0, 16, 1, 0, 0, 5, - 0, 0, 0, 28, 0, 0, 0, 0, 4, 255, 255, 0, 1, 0, 0, - 96, 2, 0, 0, 188, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 1, 0, 0, 0, 201, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 217, 0, 0, 0, 2, 0, 0, - 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, 0, - 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 230, 0, 0, 0, 2, - 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, - 1, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 246, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 73, - 110, 112, 117, 116, 83, 97, 109, 112, 108, 101, 114, 0, 71, 114, 97, - 100, 105, 101, 110, 116, 83, 97, 109, 112, 108, 101, 114, 0, 73, 110, - 112, 117, 116, 84, 101, 120, 116, 117, 114, 101, 0, 71, 114, 97, 100, - 105, 101, 110, 116, 84, 101, 120, 116, 117, 114, 101, 0, 99, 111, 110, - 105, 99, 71, 114, 97, 100, 105, 101, 110, 116, 67, 111, 110, 115, 116, - 97, 110, 116, 115, 0, 171, 171, 171, 246, 0, 0, 0, 7, 0, 0, - 0, 40, 1, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 208, 1, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 2, - 0, 0, 0, 216, 1, 0, 0, 0, 0, 0, 0, 232, 1, 0, 0, - 8, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 240, 1, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 12, 0, 0, 0, 4, 0, - 0, 0, 2, 0, 0, 0, 240, 1, 0, 0, 0, 0, 0, 0, 13, - 2, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, - 240, 1, 0, 0, 0, 0, 0, 0, 24, 2, 0, 0, 20, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 240, 1, 0, 0, 0, 0, - 0, 0, 45, 2, 0, 0, 24, 0, 0, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 240, 1, 0, 0, 0, 0, 0, 0, 61, 2, 0, 0, - 32, 0, 0, 0, 28, 0, 0, 0, 2, 0, 0, 0, 80, 2, 0, - 0, 0, 0, 0, 0, 99, 101, 110, 116, 101, 114, 0, 171, 1, 0, - 3, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, - 110, 103, 108, 101, 0, 171, 171, 0, 0, 3, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 115, 116, 97, 114, 116, 95, 111, - 102, 102, 115, 101, 116, 0, 101, 110, 100, 95, 111, 102, 102, 115, 101, - 116, 0, 114, 101, 112, 101, 97, 116, 95, 99, 111, 114, 114, 101, 99, - 116, 95, 99, 111, 110, 105, 99, 0, 97, 108, 108, 111, 119, 95, 111, - 100, 100, 95, 99, 111, 110, 105, 99, 0, 116, 114, 97, 110, 115, 102, - 111, 114, 109, 95, 99, 111, 110, 105, 99, 0, 171, 171, 171, 3, 0, - 3, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, - 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, - 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, - 51, 56, 52, 0, 171, 171, 73, 83, 71, 78, 116, 0, 0, 0, 3, - 0, 0, 0, 8, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, 15, 3, 0, 0, 107, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, - 15, 3, 0, 0, 83, 86, 95, 80, 79, 83, 73, 84, 73, 79, 78, - 0, 83, 67, 69, 78, 69, 95, 80, 79, 83, 73, 84, 73, 79, 78, - 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 79, 83, 71, 78, 44, - 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 83, 86, 95, 84, 97, 114, 103, 101, 116, 0, - 171, 171}; diff --git a/gfx/2d/ShadersD2D1.hlsl b/gfx/2d/ShadersD2D1.hlsl @@ -1,162 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -Texture2D InputTexture : register(t0); -SamplerState InputSampler : register(s0); -Texture2D GradientTexture : register(t1); -SamplerState GradientSampler : register(s1); - -cbuffer radialGradientConstants : register(b0) -{ - // Precalculate as much as we can! - float3 diff : packoffset(c0.x); - float2 center1 : packoffset(c1.x); - float A : packoffset(c1.z); - float radius1 : packoffset(c1.w); - float sq_radius1 : packoffset(c2.x); - - // The next two values are used for a hack to compensate for an apparent - // bug in D2D where the GradientSampler SamplerState doesn't get the - // correct addressing modes. - float repeat_correct : packoffset(c2.y); - float allow_odd : packoffset(c2.z); - - float3x2 transform : packoffset(c3.x); -} - -cbuffer conicGradientConstants : register(b0) -{ - float2 center : packoffset(c0.x); - float angle : packoffset(c0.z); - float start_offset : packoffset(c0.w); - float end_offset : packoffset(c1.x); - - // The next two values are used for a hack to compensate for an apparent - // bug in D2D where the GradientSampler SamplerState doesn't get the - // correct addressing modes. - float repeat_correct_conic : packoffset(c1.y); - float allow_odd_conic : packoffset(c1.z); - - float3x2 transform_conic : packoffset(c2.x); -} - - -static const float M_PI = 3.14159265f; - -float4 SampleConicGradientPS( - float4 clipSpaceOutput : SV_POSITION, - float4 sceneSpaceOutput : SCENE_POSITION, - float4 texelSpaceInput0 : TEXCOORD0 - ) : SV_Target -{ - float2 p = float2(sceneSpaceOutput.x * transform_conic._11 + sceneSpaceOutput.y * transform_conic._21 + transform_conic._31, - sceneSpaceOutput.x * transform_conic._12 + sceneSpaceOutput.y * transform_conic._22 + transform_conic._32); - float2 dir = float2( - -(center.y - p.y), - (center.x - p.x)); - float vstart = start_offset; - float vend = end_offset; - float n = 1/(vend-vstart); - float current_angle = atan2(dir.y, dir.x)-angle; - float lambda = fmod(n*current_angle/M_PI/2+vend-vstart+.5,1); - float offset = lambda; - float4 output = GradientTexture.Sample(GradientSampler, float2(offset, 0.5)); - // Premultiply - output.rgb *= output.a; - // Multiply the output color by the input mask for the operation. - output *= InputTexture.Sample(InputSampler, texelSpaceInput0.xy); - - return output; -}; - -float4 SampleRadialGradientPS( - float4 clipSpaceOutput : SV_POSITION, - float4 sceneSpaceOutput : SCENE_POSITION, - float4 texelSpaceInput0 : TEXCOORD0 - ) : SV_Target -{ - // Radial gradient painting is defined as the set of circles whose centers - // are described by C(t) = (C2 - C1) * t + C1; with radii - // R(t) = (R2 - R1) * t + R1; for R(t) > 0. This shader solves the - // quadratic equation that arises when calculating t for pixel (x, y). - // - // A more extensive derrivation can be found in the pixman radial gradient - // code. - - float2 p = float2(sceneSpaceOutput.x * transform._11 + sceneSpaceOutput.y * transform._21 + transform._31, - sceneSpaceOutput.x * transform._12 + sceneSpaceOutput.y * transform._22 + transform._32); - float3 dp = float3(p - center1, radius1); - - // dpx * dcx + dpy * dcy + r * dr - float B = dot(dp, diff); - - float C = pow(dp.x, 2) + pow(dp.y, 2) - sq_radius1; - - float det = pow(B, 2) - A * C; - - float sqrt_det = sqrt(abs(det)); - - float2 t = (B + float2(sqrt_det, -sqrt_det)) / A; - - float2 isValid = step(float2(-radius1, -radius1), t * diff.z); - - float upper_t = lerp(t.y, t.x, isValid.x); - - // Addressing mode bug work-around.. first let's see if we should consider odd repetitions separately. - float oddeven = abs(fmod(floor(upper_t), 2)) * allow_odd; - - // Now let's calculate even or odd addressing in a branchless manner. - float upper_t_repeated = ((upper_t - floor(upper_t)) * (1.0f - oddeven)) + ((ceil(upper_t) - upper_t) * oddeven); - - float4 output = GradientTexture.Sample(GradientSampler, float2(upper_t * (1.0f - repeat_correct) + upper_t_repeated * repeat_correct, 0.5)); - // Premultiply - output.rgb *= output.a; - // Multiply the output color by the input mask for the operation. - output *= InputTexture.Sample(InputSampler, texelSpaceInput0.xy); - - // In order to compile for PS_4_0_level_9_3 we need to be branchless. - // This is essentially returning nothing, i.e. bailing early if: - // det < 0 || max(isValid.x, isValid.y) <= 0 - return output * abs(step(max(isValid.x, isValid.y), 0) - 1.0f) * step(0, det); -}; - -float4 SampleRadialGradientA0PS( - float4 clipSpaceOutput : SV_POSITION, - float4 sceneSpaceOutput : SCENE_POSITION, - float4 texelSpaceInput0 : TEXCOORD0 - ) : SV_Target -{ - // This simpler shader is used for the degenerate case where A is 0, - // i.e. we're actually solving a linear equation. - - float2 p = float2(sceneSpaceOutput.x * transform._11 + sceneSpaceOutput.y * transform._21 + transform._31, - sceneSpaceOutput.x * transform._12 + sceneSpaceOutput.y * transform._22 + transform._32); - float3 dp = float3(p - center1, radius1); - - // dpx * dcx + dpy * dcy + r * dr - float B = dot(dp, diff); - - float C = pow(dp.x, 2) + pow(dp.y, 2) - pow(radius1, 2); - - float t = 0.5 * C / B; - - // Addressing mode bug work-around.. first let's see if we should consider odd repetitions separately. - float oddeven = abs(fmod(floor(t), 2)) * allow_odd; - - // Now let's calculate even or odd addressing in a branchless manner. - float t_repeated = ((t - floor(t)) * (1.0f - oddeven)) + ((ceil(t) - t) * oddeven); - - float4 output = GradientTexture.Sample(GradientSampler, float2(t * (1.0f - repeat_correct) + t_repeated * repeat_correct, 0.5)); - // Premultiply - output.rgb *= output.a; - // Multiply the output color by the input mask for the operation. - output *= InputTexture.Sample(InputSampler, texelSpaceInput0.xy); - - // In order to compile for PS_4_0_level_9_3 we need to be branchless. - // This is essentially returning nothing, i.e. bailing early if: - // -radius1 >= t * diff.z - return output * abs(step(t * diff.z, -radius1) - 1.0f); -}; - diff --git a/gfx/2d/SourceSurfaceD2D1.cpp b/gfx/2d/SourceSurfaceD2D1.cpp @@ -1,245 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "SourceSurfaceD2D1.h" -#include "DrawTargetD2D1.h" - -namespace mozilla { -namespace gfx { - -SourceSurfaceD2D1::SourceSurfaceD2D1(ID2D1Image* aImage, - ID2D1DeviceContext* aDC, - SurfaceFormat aFormat, - const IntSize& aSize, DrawTargetD2D1* aDT) - : mImage(aImage), - mDC(aDC), - mDevice(Factory::GetD2D1Device()), - mFormat(aFormat), - mSize(aSize), - mDrawTarget(aDT), - mOwnsCopy(false) { - aImage->QueryInterface((ID2D1Bitmap1**)getter_AddRefs(mRealizedBitmap)); - if (aDT) { - mSnapshotLock = aDT->mSnapshotLock; - } -} - -SourceSurfaceD2D1::~SourceSurfaceD2D1() { - if (mOwnsCopy) { - DrawTargetD2D1::mVRAMUsageSS -= - mSize.width * mSize.height * BytesPerPixel(mFormat); - } -} - -bool SourceSurfaceD2D1::IsValid() const { - return mDevice == Factory::GetD2D1Device(); -} - -already_AddRefed<DataSourceSurface> SourceSurfaceD2D1::GetDataSurface() { - Maybe<MutexAutoLock> lock; - if (mSnapshotLock) { - lock.emplace(*mSnapshotLock); - } - - if (!EnsureRealizedBitmap()) { - gfxCriticalError() << "Failed to realize a bitmap, device " - << hexa(mDevice); - return nullptr; - } - - HRESULT hr; - - RefPtr<ID2D1Bitmap1> softwareBitmap; - D2D1_BITMAP_PROPERTIES1 props; - props.dpiX = 96; - props.dpiY = 96; - props.pixelFormat = D2DPixelFormat(mFormat); - props.colorContext = nullptr; - props.bitmapOptions = - D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_CPU_READ; - hr = mDC->CreateBitmap(D2DIntSize(mSize), nullptr, 0, props, - (ID2D1Bitmap1**)getter_AddRefs(softwareBitmap)); - - if (FAILED(hr)) { - gfxCriticalError() << "Failed to create software bitmap: " << mSize - << " Code: " << hexa(hr); - return nullptr; - } - - D2D1_POINT_2U point = D2D1::Point2U(0, 0); - D2D1_RECT_U rect = D2D1::RectU(0, 0, mSize.width, mSize.height); - - hr = softwareBitmap->CopyFromBitmap(&point, mRealizedBitmap, &rect); - - if (FAILED(hr)) { - gfxWarning() << "Failed to readback into software bitmap. Code: " - << hexa(hr); - return nullptr; - } - - return MakeAndAddRef<DataSourceSurfaceD2D1>(softwareBitmap, mFormat); -} - -bool SourceSurfaceD2D1::EnsureRealizedBitmap() { - if (mRealizedBitmap) { - return true; - } - - // Why aren't we using mDevice here or anywhere else? - RefPtr<ID2D1Device> device = Factory::GetD2D1Device(); - if (!device) { - return false; - } - - RefPtr<ID2D1DeviceContext> dc; - device->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, - getter_AddRefs(dc)); - - D2D1_BITMAP_PROPERTIES1 props; - props.dpiX = 96; - props.dpiY = 96; - props.pixelFormat = D2DPixelFormat(mFormat); - props.colorContext = nullptr; - props.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET; - dc->CreateBitmap(D2DIntSize(mSize), nullptr, 0, props, - (ID2D1Bitmap1**)getter_AddRefs(mRealizedBitmap)); - - dc->SetTarget(mRealizedBitmap); - - dc->BeginDraw(); - dc->DrawImage(mImage); - dc->EndDraw(); - - return true; -} - -void SourceSurfaceD2D1::DrawTargetWillChange() { - MOZ_ASSERT(mSnapshotLock); - mSnapshotLock->AssertCurrentThreadOwns(); - - // At this point in time this should always be true here. - MOZ_ASSERT(mRealizedBitmap); - - RefPtr<ID2D1Bitmap1> oldBitmap = mRealizedBitmap; - - D2D1_BITMAP_PROPERTIES1 props; - props.dpiX = 96; - props.dpiY = 96; - props.pixelFormat = D2DPixelFormat(mFormat); - props.colorContext = nullptr; - props.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET; - HRESULT hr = - mDC->CreateBitmap(D2DIntSize(mSize), nullptr, 0, props, - (ID2D1Bitmap1**)getter_AddRefs(mRealizedBitmap)); - - if (FAILED(hr)) { - gfxCriticalError() - << "Failed to create bitmap to make DrawTarget copy. Size: " << mSize - << " Code: " << hexa(hr); - MarkIndependent(); - return; - } - - D2D1_POINT_2U point = D2D1::Point2U(0, 0); - D2D1_RECT_U rect = D2D1::RectU(0, 0, mSize.width, mSize.height); - mRealizedBitmap->CopyFromBitmap(&point, oldBitmap, &rect); - mImage = mRealizedBitmap; - - DrawTargetD2D1::mVRAMUsageSS += - mSize.width * mSize.height * BytesPerPixel(mFormat); - mOwnsCopy = true; - - // Ensure the object stays alive for the duration of MarkIndependent. - RefPtr<SourceSurfaceD2D1> deathGrip = this; - // We now no longer depend on the source surface content remaining the same. - MarkIndependent(); -} - -void SourceSurfaceD2D1::MarkIndependent() { - if (mDrawTarget) { - MOZ_ASSERT(mDrawTarget->mSnapshot == this); - mDrawTarget->mSnapshot = nullptr; - mDrawTarget = nullptr; - } -} - -DataSourceSurfaceD2D1::DataSourceSurfaceD2D1(ID2D1Bitmap1* aMappableBitmap, - SurfaceFormat aFormat) - : mBitmap(aMappableBitmap), - mFormat(aFormat), - mIsMapped(false), - mImplicitMapped(false) {} - -DataSourceSurfaceD2D1::~DataSourceSurfaceD2D1() { - if (mImplicitMapped) { - mBitmap->Unmap(); - } -} - -IntSize DataSourceSurfaceD2D1::GetSize() const { - D2D1_SIZE_F size = mBitmap->GetSize(); - - return IntSize(int32_t(size.width), int32_t(size.height)); -} - -uint8_t* DataSourceSurfaceD2D1::GetData() { - EnsureMapped(); - - return mMap.bits; -} - -bool DataSourceSurfaceD2D1::Map(MapType aMapType, - MappedSurface* aMappedSurface) { - // DataSourceSurfaces used with the new Map API should not be used with - // GetData!! - MOZ_ASSERT(!mImplicitMapped); - MOZ_ASSERT(!mIsMapped); - - if (aMapType != MapType::READ) { - gfxWarning() << "Attempt to map D2D1 DrawTarget for writing."; - return false; - } - - D2D1_MAPPED_RECT map; - if (FAILED(mBitmap->Map(D2D1_MAP_OPTIONS_READ, &map))) { - gfxCriticalError() << "Failed to map bitmap (M)."; - return false; - } - aMappedSurface->mData = map.bits; - aMappedSurface->mStride = map.pitch; - - mIsMapped = !!aMappedSurface->mData; - return mIsMapped; -} - -void DataSourceSurfaceD2D1::Unmap() { - MOZ_ASSERT(mIsMapped); - - mIsMapped = false; - mBitmap->Unmap(); -} - -int32_t DataSourceSurfaceD2D1::Stride() { - EnsureMapped(); - - return mMap.pitch; -} - -void DataSourceSurfaceD2D1::EnsureMapped() { - // Do not use GetData() after having used Map! - MOZ_ASSERT(!mIsMapped); - if (mImplicitMapped) { - return; - } - if (FAILED(mBitmap->Map(D2D1_MAP_OPTIONS_READ, &mMap))) { - gfxCriticalError() << "Failed to map bitmap (EM)."; - return; - } - mImplicitMapped = true; -} - -} // namespace gfx -} // namespace mozilla diff --git a/gfx/2d/SourceSurfaceD2D1.h b/gfx/2d/SourceSurfaceD2D1.h @@ -1,102 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef MOZILLA_GFX_SOURCESURFACED2D1_H_ -#define MOZILLA_GFX_SOURCESURFACED2D1_H_ - -#include "2D.h" -#include "HelpersD2D.h" -#include <vector> -#include <d3d11.h> -#include <d2d1_1.h> - -namespace mozilla { -namespace gfx { - -class DrawTargetD2D1; - -class SourceSurfaceD2D1 : public SourceSurface { - public: - MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(SourceSurfaceD2D1, override) - - SourceSurfaceD2D1(ID2D1Image* aImage, ID2D1DeviceContext* aDC, - SurfaceFormat aFormat, const IntSize& aSize, - DrawTargetD2D1* aDT = nullptr); - ~SourceSurfaceD2D1(); - - SurfaceType GetType() const override { return SurfaceType::D2D1_1_IMAGE; } - IntSize GetSize() const override { return mSize; } - SurfaceFormat GetFormat() const override { return mFormat; } - bool IsValid() const override; - already_AddRefed<DataSourceSurface> GetDataSurface() override; - - ID2D1Image* GetImage() { return mImage; } - - void EnsureIndependent() { - if (!mDrawTarget) return; - DrawTargetWillChange(); - } - - private: - friend class DrawTargetD2D1; - - bool EnsureRealizedBitmap(); - - // This function is called by the draw target this texture belongs to when - // it is about to be changed. The texture will be required to make a copy - // of itself when this happens. - void DrawTargetWillChange(); - - // This will mark the surface as no longer depending on its drawtarget, - // this may happen on destruction or copying. - void MarkIndependent(); - - RefPtr<ID2D1Image> mImage; - // This may be null if we were created for a non-bitmap image and have not - // had a reason yet to realize ourselves. - RefPtr<ID2D1Bitmap1> mRealizedBitmap; - RefPtr<ID2D1DeviceContext> mDC; - // Keep this around to verify whether out image is still valid in the future. - RefPtr<ID2D1Device> mDevice; - - const SurfaceFormat mFormat; - const IntSize mSize; - DrawTargetD2D1* mDrawTarget; - std::shared_ptr<Mutex> mSnapshotLock; - bool mOwnsCopy; -}; - -class DataSourceSurfaceD2D1 : public DataSourceSurface { - public: - MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DataSourceSurfaceD2D1, override) - - DataSourceSurfaceD2D1(ID2D1Bitmap1* aMappableBitmap, SurfaceFormat aFormat); - ~DataSourceSurfaceD2D1(); - - SurfaceType GetType() const override { return SurfaceType::DATA; } - IntSize GetSize() const override; - SurfaceFormat GetFormat() const override { return mFormat; } - bool IsValid() const override { return !!mBitmap; } - uint8_t* GetData() override; - int32_t Stride() override; - bool Map(MapType, MappedSurface* aMappedSurface) override; - void Unmap() override; - - private: - friend class SourceSurfaceD2DTarget; - void EnsureMapped(); - - mutable RefPtr<ID2D1Bitmap1> mBitmap; - SurfaceFormat mFormat; - D2D1_MAPPED_RECT mMap; - bool mIsMapped; - bool mImplicitMapped; -}; - -} // namespace gfx -} // namespace mozilla - -#endif /* MOZILLA_GFX_SOURCESURFACED2D2TARGET_H_ */ diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h @@ -26,14 +26,11 @@ typedef double Double; enum class SurfaceType : int8_t { DATA, /* Data surface - bitmap in memory */ - D2D1_BITMAP, /* Surface wrapping a ID2D1Bitmap */ - D2D1_DRAWTARGET, /* Surface made from a D2D draw target */ CAIRO, /* Surface wrapping a cairo surface */ CAIRO_IMAGE, /* Data surface wrapping a cairo image surface */ COREGRAPHICS_IMAGE, /* Surface wrapping a CoreGraphics Image */ COREGRAPHICS_CGCONTEXT, /* Surface wrapping a CG context */ SKIA, /* Surface wrapping a Skia bitmap */ - D2D1_1_IMAGE, /* A D2D 1.1 ID2D1Image SourceSurface */ RECORDING, /* Surface used for recording */ DATA_SHARED, /* Data surface using shared memory */ DATA_RECYCLING_SHARED, /* Data surface using shared memory */ @@ -766,11 +763,9 @@ enum class DrawTargetType : int8_t { enum class BackendType : int8_t { NONE = 0, - DIRECT2D, // Used for version independent D2D objects. CAIRO, SKIA, RECORDING, - DIRECT2D1_1, WEBRENDER_TEXT, WEBGL, @@ -877,9 +872,9 @@ MOZ_DEFINE_ENUM_CLASS_WITH_BASE(PatternType, int8_t, ( enum class JoinStyle : int8_t { BEVEL, ROUND, - MITER, //!< Mitered if within the miter limit, else, if the backed supports - //!< it (D2D), the miter is clamped. If the backend does not support - //!< miter clamping the behavior is as for MITER_OR_BEVEL. + MITER, //!< Mitered if within the miter limit, else, if the backend supports + //!< it, the miter is clamped. If the backend does not support miter + //!< clamping the behavior is as for MITER_OR_BEVEL. MITER_OR_BEVEL //!< Mitered if within the miter limit, else beveled. }; diff --git a/gfx/2d/genshaders.sh b/gfx/2d/genshaders.sh @@ -1,12 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -fxc ShadersD2D.fx -nologo -FhShadersD2D.h -Tfx_4_0 -Vn d2deffect -fxc ShadersD2D1.hlsl -ESampleRadialGradientPS -nologo -Tps_4_0_level_9_3 -Fhtmpfile -VnSampleRadialGradientPS -cat tmpfile > ShadersD2D1.h -fxc ShadersD2D1.hlsl -ESampleRadialGradientA0PS -nologo -Tps_4_0_level_9_3 -Fhtmpfile -VnSampleRadialGradientA0PS -cat tmpfile >> ShadersD2D1.h -fxc ShadersD2D1.hlsl -ESampleConicGradientPS -nologo -Tps_4_0_level_9_3 -Fhtmpfile -VnSampleConicGradientPS -cat tmpfile >> ShadersD2D1.h -rm tmpfile diff --git a/gfx/2d/gfx2d.vcxproj b/gfx/2d/gfx2d.vcxproj @@ -83,15 +83,11 @@ <ClInclude Include="BaseRect.h" /> <ClInclude Include="BaseSize.h" /> <ClInclude Include="DrawEventRecorder.h" /> - <ClInclude Include="DrawTargetD2D.h" /> <ClInclude Include="DrawTargetDual.h" /> <ClInclude Include="DrawTargetRecording.h" /> - <ClInclude Include="GradientStopsD2D.h" /> - <ClInclude Include="HelpersD2D.h" /> <ClInclude Include="ImageScaling.h" /> <ClInclude Include="Logging.h" /> <ClInclude Include="Matrix.h" /> - <ClInclude Include="PathD2D.h" /> <ClInclude Include="PathHelpers.h" /> <ClInclude Include="PathRecording.h" /> <ClInclude Include="Point.h" /> @@ -100,8 +96,6 @@ <ClInclude Include="Rect.h" /> <ClInclude Include="ScaledFontBase.h" /> <ClInclude Include="ScaledFontDWrite.h" /> - <ClInclude Include="SourceSurfaceD2D.h" /> - <ClInclude Include="SourceSurfaceD2DTarget.h" /> <ClInclude Include="SourceSurfaceRawData.h" /> <ClInclude Include="Tools.h" /> <ClInclude Include="Types.h" /> @@ -109,29 +103,20 @@ </ItemGroup> <ItemGroup> <ClCompile Include="DrawEventRecorder.cpp" /> - <ClCompile Include="DrawTargetD2D.cpp" /> <ClCompile Include="DrawTargetDual.cpp" /> <ClCompile Include="DrawTargetRecording.cpp" /> <ClCompile Include="Factory.cpp" /> <ClCompile Include="ImageScaling.cpp" /> <ClCompile Include="ImageScalingSSE2.cpp" /> <ClCompile Include="Matrix.cpp" /> - <ClCompile Include="PathD2D.cpp" /> <ClCompile Include="PathRecording.cpp" /> <ClCompile Include="RecordedEvent.cpp" /> <ClCompile Include="ScaledFontBase.cpp" /> <ClCompile Include="ScaledFontDWrite.cpp" /> - <ClCompile Include="SourceSurfaceD2D.cpp" /> - <ClCompile Include="SourceSurfaceD2DTarget.cpp" /> <ClCompile Include="SourceSurfaceRawData.cpp" /> </ItemGroup> <ItemGroup> <None Include="Makefile.in" /> - <CustomBuild Include="ShadersD2D.fx"> - <FileType>Document</FileType> - <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">fxc /Tfx_4_0 /FhShadersD2D.h ShadersD2D.fx /Vn d2deffect</Command> - <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">ShadersD2D.h</Outputs> - </CustomBuild> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> diff --git a/gfx/2d/moz.build b/gfx/2d/moz.build @@ -84,18 +84,11 @@ elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "windows": "UnscaledFontGDI.h", ] SOURCES += [ - "ConicGradientEffectD2D1.cpp", - "DrawTargetD2D1.cpp", "DWriteSettings.cpp", - "ExtendInputEffectD2D1.cpp", - "FilterNodeD2D1.cpp", "NativeFontResourceDWrite.cpp", "NativeFontResourceGDI.cpp", - "PathD2D.cpp", - "RadialGradientEffectD2D1.cpp", "ScaledFontDWrite.cpp", "ScaledFontWin.cpp", - "SourceSurfaceD2D1.cpp", ] DEFINES["WIN32"] = True diff --git a/gfx/2d/unittest/Main.cpp b/gfx/2d/unittest/Main.cpp @@ -8,9 +8,6 @@ #include "TestPoint.h" #include "TestScaling.h" #include "TestBugs.h" -#ifdef WIN32 -# include "TestDrawTargetD2D.h" -#endif #include <string> #include <sstream> @@ -23,9 +20,6 @@ struct TestObject { int main() { TestObject tests[] = { {new SanityChecks(), "Sanity Checks"}, -#ifdef WIN32 - {new TestDrawTargetD2D(), "DrawTarget (D2D)"}, -#endif {new TestPoint(), "Point Tests"}, {new TestScaling(), "Scaling Tests"} {new TestBugs(), "Bug Tests"}}; diff --git a/gfx/2d/unittest/TestDrawTargetD2D.cpp b/gfx/2d/unittest/TestDrawTargetD2D.cpp @@ -1,22 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "TestDrawTargetD2D.h" - -using namespace mozilla::gfx; -TestDrawTargetD2D::TestDrawTargetD2D() { - ::D3D10CreateDevice1( - nullptr, D3D10_DRIVER_TYPE_HARDWARE, nullptr, - D3D10_CREATE_DEVICE_BGRA_SUPPORT | - D3D10_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS, - D3D10_FEATURE_LEVEL_10_0, D3D10_1_SDK_VERSION, getter_AddRefs(mDevice)); - - Factory::SetDirect3D10Device(mDevice); - - mDT = Factory::CreateDrawTarget(BackendType::DIRECT2D, - IntSize(DT_WIDTH, DT_HEIGHT), - SurfaceFormat::B8G8R8A8); -} diff --git a/gfx/2d/unittest/TestDrawTargetD2D.h b/gfx/2d/unittest/TestDrawTargetD2D.h @@ -1,19 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#pragma once - -#include "TestDrawTargetBase.h" - -#include <d3d10_1.h> - -class TestDrawTargetD2D : public TestDrawTargetBase { - public: - TestDrawTargetD2D(); - - private: - RefPtr<ID3D10Device1> mDevice; -}; diff --git a/gfx/2d/unittest/unittest.vcxproj b/gfx/2d/unittest/unittest.vcxproj @@ -76,7 +76,6 @@ <ClCompile Include="SanityChecks.cpp" /> <ClCompile Include="TestBase.cpp" /> <ClCompile Include="TestDrawTargetBase.cpp" /> - <ClCompile Include="TestDrawTargetD2D.cpp" /> <ClCompile Include="TestPoint.cpp" /> <ClCompile Include="TestScaling.cpp" /> </ItemGroup> @@ -84,11 +83,10 @@ <ClInclude Include="TestDrawTargetBase.h" /> <ClInclude Include="SanityChecks.h" /> <ClInclude Include="TestBase.h" /> - <ClInclude Include="TestDrawTargetD2D.h" /> <ClInclude Include="TestPoint.h" /> <ClInclude Include="TestScaling.h" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> -\ No newline at end of file +</Project> diff --git a/gfx/layers/client/TextureClient.cpp b/gfx/layers/client/TextureClient.cpp @@ -287,18 +287,6 @@ static TextureType ChooseTextureType(gfx::SurfaceFormat aFormat, BackendTypeForBackendSelector(layersBackend, aSelector); (void)moz2DBackend; -#ifdef XP_WIN - int32_t maxTextureSize = aKnowsCompositor->GetMaxTextureSize(); - if ((layersBackend == LayersBackend::LAYERS_WR && - !aKnowsCompositor->UsingSoftwareWebRender()) && - (moz2DBackend == gfx::BackendType::DIRECT2D || - moz2DBackend == gfx::BackendType::DIRECT2D1_1) && - aSize.width <= maxTextureSize && aSize.height <= maxTextureSize && - !(aAllocFlags & (ALLOC_UPDATE_FROM_SURFACE | ALLOC_DO_NOT_ACCELERATE))) { - return TextureType::D3D11; - } -#endif - #ifdef XP_MACOSX if (StaticPrefs::gfx_use_iosurface_textures_AtStartup() && !aKnowsCompositor->UsingSoftwareWebRender()) { @@ -1396,27 +1384,6 @@ already_AddRefed<TextureClient> TextureClient::CreateFromSurface( return nullptr; } - TextureData* data = nullptr; -#if defined(XP_WIN) - LayersBackend layersBackend = aAllocator->GetCompositorBackendType(); - gfx::BackendType moz2DBackend = - BackendTypeForBackendSelector(layersBackend, aSelector); - - int32_t maxTextureSize = aAllocator->GetMaxTextureSize(); - - if (layersBackend == LayersBackend::LAYERS_WR && - (moz2DBackend == gfx::BackendType::DIRECT2D || - moz2DBackend == gfx::BackendType::DIRECT2D1_1) && - size.width <= maxTextureSize && size.height <= maxTextureSize) { - data = D3D11TextureData::Create(aSurface, aAllocFlags); - } -#endif - - if (data) { - return MakeAndAddRef<TextureClient>(data, aTextureFlags, - aAllocator->GetTextureForwarder()); - } - // Fall back to using UpdateFromSurface TextureAllocationFlags allocFlags = @@ -1468,12 +1435,9 @@ already_AddRefed<TextureClient> TextureClient::CreateForRawBufferAccess( aAllocFlags = TextureAllocationFlags(aAllocFlags | ALLOC_CLEAR_BUFFER); } - // Note that we ignore the backend type if we get here. It should only be D2D - // or Skia, and D2D does not support data surfaces. Therefore it is safe to - // force the buffer to be Skia. - NS_WARNING_ASSERTION(aMoz2DBackend == gfx::BackendType::SKIA || - aMoz2DBackend == gfx::BackendType::DIRECT2D || - aMoz2DBackend == gfx::BackendType::DIRECT2D1_1, + // We ignore the backend type if we get here. It should only be Skia. + // Therefore it is safe to force the buffer to be Skia. + NS_WARNING_ASSERTION(aMoz2DBackend == gfx::BackendType::SKIA, "Unsupported TextureClient backend type"); // For future changes, check aAllocFlags aAllocFlags & ALLOC_DO_NOT_ACCELERATE diff --git a/gfx/layers/d3d11/TextureD3D11.cpp b/gfx/layers/d3d11/TextureD3D11.cpp @@ -246,21 +246,14 @@ DataTextureSourceD3D11::~DataTextureSourceD3D11() {} enum class SerializeWithMoz2D : bool { No, Yes }; template <typename T> // ID3D10Texture2D or ID3D11Texture2D -static bool LockD3DTexture( - T* aTexture, SerializeWithMoz2D aSerialize = SerializeWithMoz2D::No) { +static bool LockD3DTexture(T* aTexture) { MOZ_ASSERT(aTexture); RefPtr<IDXGIKeyedMutex> mutex; aTexture->QueryInterface((IDXGIKeyedMutex**)getter_AddRefs(mutex)); // Textures created by the DXVA decoders don't have a mutex for // synchronization if (mutex) { - HRESULT hr; - if (aSerialize == SerializeWithMoz2D::Yes) { - AutoSerializeWithMoz2D serializeWithMoz2D(BackendType::DIRECT2D1_1); - hr = mutex->AcquireSync(0, 10000); - } else { - hr = mutex->AcquireSync(0, 10000); - } + HRESULT hr = mutex->AcquireSync(0, 10000); if (hr == WAIT_TIMEOUT) { RefPtr<ID3D11Device> device; aTexture->GetDevice(getter_AddRefs(device)); @@ -293,19 +286,12 @@ static bool HasKeyedMutex(T* aTexture) { } template <typename T> // ID3D10Texture2D or ID3D11Texture2D -static void UnlockD3DTexture( - T* aTexture, SerializeWithMoz2D aSerialize = SerializeWithMoz2D::No) { +static void UnlockD3DTexture(T* aTexture) { MOZ_ASSERT(aTexture); RefPtr<IDXGIKeyedMutex> mutex; aTexture->QueryInterface((IDXGIKeyedMutex**)getter_AddRefs(mutex)); if (mutex) { - HRESULT hr; - if (aSerialize == SerializeWithMoz2D::Yes) { - AutoSerializeWithMoz2D serializeWithMoz2D(BackendType::DIRECT2D1_1); - hr = mutex->ReleaseSync(0); - } else { - hr = mutex->ReleaseSync(0); - } + HRESULT hr = mutex->ReleaseSync(0); if (FAILED(hr)) { NS_WARNING("Failed to unlock the texture"); } @@ -331,25 +317,7 @@ D3D11TextureData::D3D11TextureData( MOZ_ASSERT(aTexture); } -static void DestroyDrawTarget(RefPtr<DrawTarget>& aDT, - RefPtr<ID3D11Texture2D>& aTexture) { - // An Azure DrawTarget needs to be locked when it gets nullptr'ed as this is - // when it calls EndDraw. This EndDraw should not execute anything so it - // shouldn't -really- need the lock but the debug layer chokes on this. - LockD3DTexture(aTexture.get(), SerializeWithMoz2D::Yes); - aDT = nullptr; - - // Do the serialization here, so we can hold it while destroying the texture. - AutoSerializeWithMoz2D serializeWithMoz2D(BackendType::DIRECT2D1_1); - UnlockD3DTexture(aTexture.get(), SerializeWithMoz2D::No); - aTexture = nullptr; -} - D3D11TextureData::~D3D11TextureData() { - if (mDrawTarget) { - DestroyDrawTarget(mDrawTarget, mTexture); - } - if (mGpuProcessTextureId.isSome()) { auto* textureMap = GpuProcessD3D11TextureMap::Get(); if (textureMap) { @@ -377,39 +345,10 @@ bool D3D11TextureData::Lock(OpenMode aMode) { fencesHolderMap->WaitAllFencesAndForget(mFencesHolderId.ref(), mDevice); } - if (mHasKeyedMutex && - !LockD3DTexture(mTexture.get(), SerializeWithMoz2D::Yes)) { + if (mHasKeyedMutex && !LockD3DTexture(mTexture.get())) { return false; } - if (NS_IsMainThread()) { - if (!PrepareDrawTargetInLock(aMode)) { - Unlock(); - return false; - } - } - - return true; -} - -bool D3D11TextureData::PrepareDrawTargetInLock(OpenMode aMode) { - // Make sure that successful write-lock means we will have a DrawTarget to - // write into. - if (!mDrawTarget && (aMode & OpenMode::OPEN_WRITE || mNeedsClear)) { - mDrawTarget = BorrowDrawTarget(); - if (!mDrawTarget) { - return false; - } - } - - // Reset transform - mDrawTarget->SetTransform(Matrix()); - - if (mNeedsClear) { - mDrawTarget->ClearRect(Rect(0, 0, mSize.width, mSize.height)); - mNeedsClear = false; - } - return true; } @@ -421,14 +360,14 @@ void D3D11TextureData::Unlock() { fencesHolderMap->SetWriteFence(mFencesHolderId.ref(), mWriteFence); } if (mHasKeyedMutex) { - UnlockD3DTexture(mTexture.get(), SerializeWithMoz2D::Yes); + UnlockD3DTexture(mTexture.get()); } } void D3D11TextureData::FillInfo(TextureData::Info& aInfo) const { aInfo.size = mSize; aInfo.format = mFormat; - aInfo.supportsMoz2D = true; + aInfo.supportsMoz2D = false; aInfo.hasSynchronization = mHasKeyedMutex; } @@ -621,7 +560,6 @@ D3D11TextureData* D3D11TextureData::Create(IntSize aSize, SurfaceFormat aFormat, RefPtr<ID3D11Texture2D> texture11; { - AutoSerializeWithMoz2D serializeWithMoz2D(BackendType::DIRECT2D1_1); D3D11MTAutoEnter lock(mt.forget()); HRESULT hr = device->CreateTexture2D(&newDesc, uploadDataPtr, @@ -644,10 +582,10 @@ D3D11TextureData* D3D11TextureData::Create(IntSize aSize, SurfaceFormat aFormat, // aSurface then bizarely this isn't covered, so we insert a manual // lock/unlock pair to force this. if (aSurface && useKeyedMutex) { - if (!LockD3DTexture(texture11.get(), SerializeWithMoz2D::Yes)) { + if (!LockD3DTexture(texture11.get())) { return nullptr; } - UnlockD3DTexture(texture11.get(), SerializeWithMoz2D::Yes); + UnlockD3DTexture(texture11.get()); } RefPtr<IDXGIResource1> resource; @@ -701,7 +639,6 @@ D3D11TextureData* D3D11TextureData::Create(IntSize aSize, SurfaceFormat aFormat, } void D3D11TextureData::Deallocate(LayersIPCChannel* aAllocator) { - mDrawTarget = nullptr; mTexture = nullptr; } @@ -917,17 +854,8 @@ already_AddRefed<TextureHost> CreateTextureHostD3D11( already_AddRefed<DrawTarget> D3D11TextureData::BorrowDrawTarget() { MOZ_ASSERT(NS_IsMainThread() || NS_IsInCanvasThreadOrWorker()); - - if (!mDrawTarget && mTexture) { - // This may return a null DrawTarget - mDrawTarget = Factory::CreateDrawTargetForD3D11Texture(mTexture, mFormat); - if (!mDrawTarget) { - gfxCriticalNote << "Could not borrow DrawTarget (D3D11) " << (int)mFormat; - } - } - - RefPtr<DrawTarget> result = mDrawTarget; - return result.forget(); + gfxCriticalNote << "Could not borrow DrawTarget (D3D11) " << (int)mFormat; + return nullptr; } bool D3D11TextureData::UpdateFromSurface(gfx::SourceSurface* aSurface) { @@ -1098,190 +1026,7 @@ already_AddRefed<gfx::DataSourceSurface> DXGITextureHostD3D11::GetAsSurfaceWithDevice( ID3D11Device* const aDevice, DataMutex<RefPtr<VideoProcessorD3D11>>& aVideoProcessorD3D11) { - if (!aDevice) { - return nullptr; - } - - RefPtr<ID3D11Texture2D> d3dTexture = OpenSharedD3D11Texture(this, aDevice); - if (!d3dTexture) { - return nullptr; - } - - RefPtr<ID3D11Device> device; - d3dTexture->GetDevice(getter_AddRefs(device)); - if (!device) { - gfxCriticalNoteOnce << "Failed to get D3D11 device from source texture"; - return nullptr; - } - - if (mFencesHolderId.isSome()) { - auto* fencesHolderMap = layers::CompositeProcessD3D11FencesHolderMap::Get(); - MOZ_ASSERT(fencesHolderMap); - if (!fencesHolderMap) { - return nullptr; - } - fencesHolderMap->WaitWriteFence(mFencesHolderId.ref(), device); - } else { - bool isLocked = LockD3DTexture(d3dTexture.get()); - if (!isLocked) { - return nullptr; - } - } - - const auto onExit = mozilla::MakeScopeExit([&]() { - if (mFencesHolderId.isSome()) { - return; - } - UnlockD3DTexture(d3dTexture.get()); - }); - - bool isRGB = [&]() { - switch (mFormat) { - case gfx::SurfaceFormat::R8G8B8X8: - case gfx::SurfaceFormat::R8G8B8A8: - case gfx::SurfaceFormat::B8G8R8A8: - case gfx::SurfaceFormat::B8G8R8X8: - return true; - default: - break; - } - return false; - }(); - - if (isRGB) { - RefPtr<gfx::DrawTarget> dt = - gfx::Factory::CreateDrawTargetForD3D11Texture(d3dTexture, mFormat); - if (!dt) { - return nullptr; - } - RefPtr<gfx::SourceSurface> surface = dt->Snapshot(); - if (!surface) { - return nullptr; - } - RefPtr<DataSourceSurface> dataSurface = surface->GetDataSurface(); - if (!dataSurface) { - return nullptr; - } - return dataSurface.forget(); - } - - if (mFormat != gfx::SurfaceFormat::NV12 && - mFormat != gfx::SurfaceFormat::P010 && - mFormat != gfx::SurfaceFormat::P016) { - MOZ_ASSERT_UNREACHABLE("unexpected to be called"); - return nullptr; - } - - RefPtr<ID3D11DeviceContext> context; - device->GetImmediateContext(getter_AddRefs(context)); - - CD3D11_TEXTURE2D_DESC desc; - d3dTexture->GetDesc(&desc); - - desc = CD3D11_TEXTURE2D_DESC( - DXGI_FORMAT_B8G8R8A8_UNORM, desc.Width, desc.Height, 1, 1, - D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE); - desc.MiscFlags = - D3D11_RESOURCE_MISC_SHARED_NTHANDLE | D3D11_RESOURCE_MISC_SHARED; - - RefPtr<ID3D11Texture2D> copiedTexture; - HRESULT hr = - device->CreateTexture2D(&desc, nullptr, getter_AddRefs(copiedTexture)); - if (FAILED(hr)) { - gfxCriticalNoteOnce << "Failed to create copiedTexture: " << gfx::hexa(hr); - return nullptr; - } - - { - auto lock = aVideoProcessorD3D11.Lock(); - auto& videoProcessor = lock.ref(); - if (videoProcessor && (videoProcessor->mDevice != device)) { - videoProcessor = nullptr; - } - - if (!videoProcessor) { - videoProcessor = VideoProcessorD3D11::Create(device); - if (!videoProcessor) { - gfxCriticalNoteOnce << "Failed to create VideoProcessorD3D11"; - return nullptr; - } - } - - hr = videoProcessor->Init(mSize); - if (FAILED(hr)) { - gfxCriticalNoteOnce << "Failed to init VideoProcessorD3D11" - << gfx::hexa(hr); - return nullptr; - } - - VideoProcessorD3D11::InputTextureInfo info(mColorSpace, mColorRange, - mArrayIndex, d3dTexture); - if (!videoProcessor->CallVideoProcessorBlt(info, copiedTexture)) { - gfxCriticalNoteOnce << "CallVideoProcessorBlt failed"; - return nullptr; - } - } - - { - // Wait VideoProcessorBlt gpu task complete. - RefPtr<ID3D11Query> query; - CD3D11_QUERY_DESC desc(D3D11_QUERY_EVENT); - hr = device->CreateQuery(&desc, getter_AddRefs(query)); - if (FAILED(hr) || !query) { - gfxWarning() << "Could not create D3D11_QUERY_EVENT: " << gfx::hexa(hr); - return nullptr; - } - - context->End(query); - - BOOL result; - bool ret = WaitForFrameGPUQuery(device, context, query, &result); - if (!ret) { - gfxCriticalNoteOnce << "WaitForFrameGPUQuery() failed"; - } - } - - RefPtr<IDXGIResource1> resource; - copiedTexture->QueryInterface((IDXGIResource1**)getter_AddRefs(resource)); - if (!resource) { - gfxCriticalNoteOnce << "Failed to get IDXGIResource"; - return nullptr; - } - - HANDLE sharedHandle; - hr = resource->CreateSharedHandle( - nullptr, DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE, nullptr, - &sharedHandle); - if (FAILED(hr)) { - gfxCriticalNoteOnce << "GetSharedHandle failed: " << gfx::hexa(hr); - return nullptr; - } - - RefPtr<gfx::FileHandleWrapper> handle = - new gfx::FileHandleWrapper(UniqueFileHandle(sharedHandle)); - - d3dTexture = OpenSharedD3D11Texture(aDevice, handle->GetHandle()); - if (!d3dTexture) { - gfxCriticalNoteOnce << "Failed to open copied texture handle"; - return nullptr; - } - - RefPtr<gfx::DrawTarget> dt = gfx::Factory::CreateDrawTargetForD3D11Texture( - d3dTexture, gfx::SurfaceFormat::B8G8R8A8); - if (!dt) { - gfxCriticalNote << "Failed to create DrawTarget (D3D11)"; - return nullptr; - } - RefPtr<gfx::SourceSurface> surface = dt->Snapshot(); - if (!surface) { - return nullptr; - } - RefPtr<DataSourceSurface> dataSurface = surface->GetDataSurface(); - if (!dataSurface) { - return nullptr; - } - - return dataSurface.forget(); + return nullptr; } void DXGITextureHostD3D11::CreateRenderTexture( diff --git a/gfx/layers/d3d11/TextureD3D11.h b/gfx/layers/d3d11/TextureD3D11.h @@ -135,8 +135,6 @@ class D3D11TextureData final : public TextureData { const RefPtr<FenceD3D11> aWriteFence, TextureAllocationFlags aFlags); - bool PrepareDrawTargetInLock(OpenMode aMode); - friend class gl::GLBlitHelper; bool SerializeSpecific(SurfaceDescriptorD3D10* aOutDesc); @@ -146,10 +144,6 @@ class D3D11TextureData final : public TextureData { TextureAllocationFlags aAllocFlags, ID3D11Device* aDevice = nullptr); - // Hold on to the DrawTarget because it is expensive to create one each - // ::Lock. - RefPtr<gfx::DrawTarget> mDrawTarget; - public: const gfx::IntSize mSize; const gfx::SurfaceFormat mFormat; diff --git a/gfx/layers/ipc/CanvasTranslator.cpp b/gfx/layers/ipc/CanvasTranslator.cpp @@ -931,7 +931,6 @@ void CanvasTranslator::Flush() { return; } - gfx::AutoSerializeWithMoz2D serializeWithMoz2D(mBackendType); RefPtr<ID3D11DeviceContext> deviceContext; mDevice->GetImmediateContext(getter_AddRefs(deviceContext)); deviceContext->Flush(); diff --git a/gfx/thebes/gfxContext.h b/gfx/thebes/gfxContext.h @@ -171,9 +171,7 @@ class gfxContext final { */ void SetPath(Path* path) { MOZ_ASSERT(path->GetBackendType() == mDT->GetBackendType() || - path->GetBackendType() == BackendType::RECORDING || - (mDT->GetBackendType() == BackendType::DIRECT2D1_1 && - path->GetBackendType() == BackendType::DIRECT2D)); + path->GetBackendType() == BackendType::RECORDING); mPath = path; mPathBuilder = nullptr; mPathIsRect = false; diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp @@ -1241,8 +1241,7 @@ bool gfxPlatform::UseRemoteCanvas() { /* static */ bool gfxPlatform::IsBackendAccelerated( const mozilla::gfx::BackendType aBackendType) { - return aBackendType == BackendType::DIRECT2D || - aBackendType == BackendType::DIRECT2D1_1; + return false; } /* static */ @@ -1955,17 +1954,8 @@ void gfxPlatform::InitBackendPrefs(BackendPrefsData&& aPrefsData) { mPreferredCanvasBackend = aPrefsData.mCanvasDefault; } - if (mPreferredCanvasBackend == BackendType::DIRECT2D1_1) { - // Falling back to D2D 1.0 won't help us here. When D2D 1.1 DT creation - // fails it means the surface was too big or there's something wrong with - // the device. D2D 1.0 will encounter a similar situation. - mFallbackCanvasBackend = GetCanvasBackendPref( - aPrefsData.mCanvasBitmask & ~(BackendTypeBit(mPreferredCanvasBackend) | - BackendTypeBit(BackendType::DIRECT2D))); - } else { - mFallbackCanvasBackend = GetCanvasBackendPref( - aPrefsData.mCanvasBitmask & ~BackendTypeBit(mPreferredCanvasBackend)); - } + mFallbackCanvasBackend = GetCanvasBackendPref( + aPrefsData.mCanvasBitmask & ~BackendTypeBit(mPreferredCanvasBackend)); mContentBackendBitmask = aPrefsData.mContentBitmask; mContentBackend = GetContentBackendPref(mContentBackendBitmask); @@ -3950,8 +3940,7 @@ bool gfxPlatform::FallbackFromAcceleration(FeatureStatus aStatus, return true; } - // We aren't using Software WebRender + D3D11 compositing, so turn off the - // D3D11. + // We aren't using Software WebRender + D3D11 compositing, so turn off D3D11. if (gfxConfig::IsEnabled(Feature::D3D11_COMPOSITING)) { gfxConfig::GetFeature(Feature::D3D11_COMPOSITING) .ForceDisable(aStatus, aMessage, aFailureId); diff --git a/gfx/thebes/gfxPlatform.h b/gfx/thebes/gfxPlatform.h @@ -135,16 +135,12 @@ const uint32_t kMaxLenPrefLangList = 32; inline const char* GetBackendName(mozilla::gfx::BackendType aBackend) { switch (aBackend) { - case mozilla::gfx::BackendType::DIRECT2D: - return "direct2d"; case mozilla::gfx::BackendType::CAIRO: return "cairo"; case mozilla::gfx::BackendType::SKIA: return "skia"; case mozilla::gfx::BackendType::RECORDING: return "recording"; - case mozilla::gfx::BackendType::DIRECT2D1_1: - return "direct2d 1.1"; case mozilla::gfx::BackendType::WEBRENDER_TEXT: return "webrender text"; case mozilla::gfx::BackendType::NONE: diff --git a/gfx/thebes/gfxUtils.cpp b/gfx/thebes/gfxUtils.cpp @@ -266,69 +266,6 @@ void gfxUtils::ConvertBGRAtoRGBA(uint8_t* aData, uint32_t aLength) { SurfaceFormat::R8G8B8A8, IntSize(aLength / 4, 1)); } -#if !defined(MOZ_GFX_OPTIMIZE_MOBILE) -/** - * This returns the fastest operator to use for solid surfaces which have no - * alpha channel or their alpha channel is uniformly opaque. - * This differs per render mode. - */ -static CompositionOp OptimalFillOp() { return CompositionOp::OP_SOURCE; } - -// EXTEND_PAD won't help us here; we have to create a temporary surface to hold -// the subimage of pixels we're allowed to sample. -static already_AddRefed<gfxDrawable> CreateSamplingRestrictedDrawable( - gfxDrawable* aDrawable, gfxContext* aContext, const ImageRegion& aRegion, - const SurfaceFormat aFormat, bool aUseOptimalFillOp) { - AUTO_PROFILER_LABEL("CreateSamplingRestrictedDrawable", GRAPHICS); - - DrawTarget* destDrawTarget = aContext->GetDrawTarget(); - // We've been not using CreateSamplingRestrictedDrawable in a bunch of places - // for a while. Let's disable it everywhere and confirm that it's ok to get - // rid of. - if (destDrawTarget->GetBackendType() == BackendType::DIRECT2D1_1 || (true)) { - return nullptr; - } - - gfxRect clipExtents = aContext->GetClipExtents(); - - // Inflate by one pixel because bilinear filtering will sample at most - // one pixel beyond the computed image pixel coordinate. - clipExtents.Inflate(1.0); - - gfxRect needed = aRegion.IntersectAndRestrict(clipExtents); - needed.RoundOut(); - - // if 'needed' is empty, nothing will be drawn since aFill - // must be entirely outside the clip region, so it doesn't - // matter what we do here, but we should avoid trying to - // create a zero-size surface. - if (needed.IsEmpty()) return nullptr; - - IntSize size(int32_t(needed.Width()), int32_t(needed.Height())); - - RefPtr<DrawTarget> target = - gfxPlatform::GetPlatform()->CreateOffscreenContentDrawTarget(size, - aFormat); - if (!target || !target->IsValid()) { - return nullptr; - } - - gfxContext tmpCtx(target); - - if (aUseOptimalFillOp) { - tmpCtx.SetOp(OptimalFillOp()); - } - aDrawable->Draw(&tmpCtx, needed - needed.TopLeft(), ExtendMode::REPEAT, - SamplingFilter::LINEAR, 1.0, - gfxMatrix::Translation(needed.TopLeft())); - RefPtr<SourceSurface> surface = target->Snapshot(); - - RefPtr<gfxDrawable> drawable = new gfxSurfaceDrawable( - surface, size, gfxMatrix::Translation(-needed.TopLeft())); - return drawable.forget(); -} -#endif // !MOZ_GFX_OPTIMIZE_MOBILE - /* These heuristics are based on * Source/WebCore/platform/graphics/skia/ImageSkia.cpp:computeResamplingMode() */ @@ -503,8 +440,7 @@ void gfxUtils::DrawPixelSnapped(gfxContext* aContext, gfxDrawable* aDrawable, const ImageRegion& aRegion, const SurfaceFormat aFormat, SamplingFilter aSamplingFilter, - uint32_t aImageFlags, gfxFloat aOpacity, - bool aUseOptimalFillOp) { + uint32_t aImageFlags, gfxFloat aOpacity) { AUTO_PROFILER_LABEL("gfxUtils::DrawPixelSnapped", GRAPHICS); gfxRect imageRect(gfxPoint(0, 0), aImageSize); @@ -540,22 +476,6 @@ void gfxUtils::DrawPixelSnapped(gfxContext* aContext, gfxDrawable* aDrawable, return; } #endif - - // On Mobile, we don't ever want to do this; it has the potential for - // allocating very large temporary surfaces, especially since we'll - // do full-page snapshots often (see bug 749426). -#if !defined(MOZ_GFX_OPTIMIZE_MOBILE) - RefPtr<gfxDrawable> restrictedDrawable = CreateSamplingRestrictedDrawable( - aDrawable, aContext, aRegion, aFormat, aUseOptimalFillOp); - if (restrictedDrawable) { - drawable.swap(restrictedDrawable); - - // We no longer need to tile: Either we never needed to, or we already - // filled a surface with the tiled pattern; this surface can now be - // drawn without tiling. - extendMode = ExtendMode::CLAMP; - } -#endif } } diff --git a/gfx/thebes/gfxUtils.h b/gfx/thebes/gfxUtils.h @@ -109,8 +109,7 @@ class gfxUtils { const mozilla::gfx::SurfaceFormat aFormat, mozilla::gfx::SamplingFilter aSamplingFilter, uint32_t aImageFlags = imgIContainer::FLAG_NONE, - gfxFloat aOpacity = 1.0, - bool aUseOptimalFillOp = true); + gfxFloat aOpacity = 1.0); /** * Clip aContext to the region aRegion. diff --git a/image/VectorImage.cpp b/image/VectorImage.cpp @@ -1330,12 +1330,6 @@ already_AddRefed<SourceSurface> VectorImage::CreateSurface( aParams.context ? aParams.context->GetDrawTarget()->GetBackendType() : gfxPlatform::GetPlatform()->GetDefaultContentBackend(); - if (backend == BackendType::DIRECT2D1_1) { - // We don't want to draw arbitrary content with D2D anymore - // because it doesn't support PushLayerWithBlend so switch to skia - backend = BackendType::SKIA; - } - // Try to create an imgFrame, initializing the surface it contains by drawing // our gfxDrawable into it. (We use FILTER_NEAREST since we never scale here.) auto frame = MakeNotNull<RefPtr<imgFrame>>(); @@ -1426,7 +1420,7 @@ void VectorImage::Show(gfxDrawable* aDrawable, gfxUtils::DrawPixelSnapped(aParams.context, aDrawable, SizeDouble(aParams.size), region, SurfaceFormat::OS_RGBA, aParams.samplingFilter, - aParams.flags, aParams.opacity, false); + aParams.flags, aParams.opacity); AutoProfilerImagePaintMarker PROFILER_RAII(this); #ifdef DEBUG